$CONTROL USLINIT,CODE,SOURCE,MAP                                        00010000
<< DEBUG -- MODULE 75 >>                                       <<01549>>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
$THIRTY                                                                 00028000
$CONTROL SEGMENT=DEBUG                                                  00030000
$PAGE "          SYSTEM BREAKPOINT TABLE -- DESCRIPTION"       <<01007>>00032000
                                                                        00034000
            << >>                                                       00036000
            <<  D E B U G  (SYSTEMDEBUG)  >>                            00038000
            << >>                                                       00040000
            << >>                                                       00042000
$PAGE "          SYSGLOB AND LOW CORE POINTERS"                <<01007>>00044000
BEGIN                                                                   00046000
                                                                        00048000
                                                                        00050000
INTEGER  ARRAY MEM(*) =DB,                                     <<01549>>00052000
               STOP(*)=DB+0, << BREAK POINT TABLE >>           <<01549>>00054000
               AQ0(*) =Q-0;                                    <<01549>>00056000
EQUATE   CSTB      =1,                                                  00058000
         DSTB      =2,                                                  00060000
         PCBB      =3,                                                  00062000
         CSTX      =1,                                                  00064000
         LPDTN     =%10,                                                00066000
         BPTN      =%11,  <<BREAK POINT WORD IN SYSDB>>        <<01549>>00068000
         DFCN      =%32,                                                00070000
         DFSN      =%33,                                                00072000
         CSTBLKN   =%51,                                                00074000
         STOPDSTN  =%30,                                                00076000
         NBANKSN   =%47,                                                00078000
         PBX       =12,                                                 00080000
         LASTBANKN =%361,               <<ADDRESS OF LAST...>> <<01549>>00082000
         ENDLBANKN =%362,               <<WORD IN MEMORY    >> <<01549>>00084000
         CPCB      =4,                                                  00086000
         QI        =5,                                                  00088000
         ZI        =6,                                                  00090000
         PCBSIZE   =16,                                                 00092000
         CCG       =0,                                                  00094000
         RESABORTWD=0,                  <<WORD 0 OF PCB>>      <<01549>>00096000
         CCL       =1,                                                  00098000
         CCE       =2,                                                  00100000
         DFC'      =DFCN+%1000,                                         00102000
         DFS'      =DFSN+%1000,                                         00104000
         STOPB'    =BPTN+%1000,                                         00106000
         BRPT      =%36000,                                             00108000
         SYSLDEV   =1,                                                  00110000
         NBANKS'   =NBANKSN+%1000,                                      00112000
         LASTBANK' =LASTBANKN+%1000,                           <<01549>>00114000
         ENDLBANK' =ENDLBANKN+%1000,                           <<01549>>00116000
         SEGIDSL   =1,          << SEG IDENTIFIER TYPES >>     <<01610>>00118000
         SEGIDPROG =2,                                         <<01610>>00120000
         LDTDST    =14,                                                 00122000
         LDTSIZE   =5,                                                  00124000
         SEGTABSIR =17,                                        <<01069>>00126000
         JIT'UCAP2 =39,                 <<INX USER CAP WORD 2>><<01069>>00128000
         LASTN     =0,                                         <<01069>>00130000
         ABS'SEG   =0,                                         <<01549>>00132000
         SSL'SEG   =1,                                         <<01549>>00134000
         PSL'SEG   =2,                                         <<01549>>00136000
         GSL'SEG   =3,                                         <<01549>>00138000
         PROG'SEG  =4,                                         <<01549>>00140000
         ALL'SEGS  =-1;                                        <<01549>>00142000
INTEGER  POINTER                                                        00144000
         PS0       =S-0,                                       <<01069>>00146000
         DSTI      =DB+DSTB,            <<DST TABLE>>                   00148000
         DSTI'     =DSTB,                                               00150000
         PCBI      =DB+PCBB,            <<PROCESS CTRL BLK TABLE>>      00152000
         PCBI'     =PCBB,                                               00154000
         LPDT      =DB+LPDTN,           <<LOGICAL-PHYS DEV TABLE>>      00156000
         LPDT'     =LPDTN,                                              00158000
         CSTBLK    =DB+CSTBLKN,           <<CST EXT BLOCK>>             00160000
         CSTBLK'   =CSTBLKN,                                            00162000
         CSTI      =DB+CSTB,            <<CODE SEG TABLE>>              00164000
         CSTI'     =CSTB;                                               00166000
INTEGER  DFCX      =DB+DFCN,            <<@CST-@DST>>                   00168000
         DFSX      =DB+DFSN,            <<@CST(LAST)-@DST>>             00170000
         STATUS    =Q-1,                                                00172000
         DELTAQ    =Q,                                         <<01549>>00174000
         X         =X;                  <<THE X-REGISTER>>              00176000
LOGICAL  PARMMASK  =Q-4;                                       <<01069>>00178000
DEFINE   F         =ABSOLUTE#,                                          00180000
         ASMB      =ASSEMBLE#,                                          00182000
         DUPLICATE =ASMB(DUP)#,                                         00184000
         TRIPLICATE=ASMB(DUP,DUP)#,                                     00186000
         EXCHANGE  =ASMB(XCH)#,                                         00188000
         PDISABLE  =ASMB(PSDB)#,                                        00190000
         PENABLE   =ASMB(PSEB)#,                                        00192000
         DISABLE   =ASMB(SED 0)#,                                       00194000
         ENABLE    =ASMB(SED 1)#,                                       00196000
         TRAPSOFF  =PUSH(STATUS);TOS.(2:1)_0;SET(STATUS)#,              00198000
         PIX       =(F(CPCB)-F(PCBB))#,                                 00200000
         PIN       =(PIX/PCBSIZE)#,                                     00202000
         FORCESTKO =ASMB(ADDS 100;SUBS 100)#,                           00204000
         LMEM      =ASMB(LSEA)#,                                        00206000
         SMEM      =ASMB(SSEA)#,                                        00208000
         LMEMD     =ASMB(LDEA)#,                                        00210000
         SMEMD     =ASMB(SDEA)#,                                        00212000
         CCFLD     =( 6: 2)#,                                  <<01832>>00214000
         STATUS'M  =( 0: 1)#,   << MODE BIT >>                 <<01832>>00216000
         STATUS'I  =( 1: 1)#,   << INTERRUPT BIT >>            <<01832>>00218000
         STATUS'T  =( 2: 1)#,   << TRAP BIT >>                 <<01832>>00220000
         ABIT      =( 0: 1)#,                                           00222000
         CSFLD     =( 4:12)#,                                           00224000
         DSFLD     =( 3:13)#,                                           00226000
         DST'LENFLD=( 3:13)#,   << LENGHT/4 >>                 <<01549>>00228000
         SEGIDTYPE =( 0: 2)#,   << TYPE OF SEG IDENTIFER >>    <<01610>>00230000
         ABSDB     =( 0: 1)#,   << ABS. DB OF PCB >>           <<01069>>00232000
         PTYPE     =( 6: 3)#,   << PROC. TYPE - PCB >>         <<01069>>00234000
         UCAP'PM   =( 9: 1)#,   << PM USER -- JIT >>           <<01069>>00236000
SYSTEMFLAG=(6:1)#,                                             <<01549>>00238000
         ROC       =( 1: 1)#,                                  <<01549>>00240000
         CRITFLAG  =( 2: 1)#,                                  <<01549>>00242000
         DFC       =F(DFC')#,                                           00244000
         DFS       =F(DFS')#,                                           00246000
         NUMBANKS  =F(NBANKS')#,                                        00248000
         LASTBANK  =F(LASTBANK')#,                             <<01549>>00250000
         LASTADDR  =F(ENDLBANK')#,                             <<01549>>00252000
         LIVBIT    =( 0: 1)#,                                  <<01549>>00254000
         SEGTYPE   =( 1: 3)#,                                  <<01549>>00256000
         BREAKTYPE =( 2: 1)#,                                  <<01069>>00258000
         NUMPCBS'  =PCBI'(0)#,                                 <<01549>>00260000
         STOPB     =F(STOPB')#;                                <<01549>>00262000
                                                               <<01549>>00264000
         << BREAK POINT TABLE DEFINES >>                       <<01549>>00266000
DEFINE                                                         <<01549>>00268000
         << BITS OF FLAG WORD         >>                       <<01549>>00270000
         BKPT'PRIV        =( 1: 1)#,                           <<01549>>00272000
         BKPT'SYS         =( 2: 1)#,                           <<01549>>00274000
         BKPT'VALID       =( 3: 1)#,                           <<01549>>00276000
         BKPT'DBLTRAP     =( 4: 1)#,                           <<01549>>00278000
         BKPT'FAKE        =( 5: 1)#,                           <<01549>>00280000
         BKPT'TW          =( 6: 1)#,                           <<01549>>00282000
         BKPT'USERLBL     =( 7: 1)#,                           <<01549>>00284000
         BKPT'PERM        =( 8: 1)#,                           <<01549>>00286000
         BKPT'COND        =( 9: 1)#,                           <<01549>>00288000
         BKPT'UPDATING    =(10: 1)#,                           <<01549>>00290000
         BKPT'FLAGS       =( 1:10)#,                           <<01549>>00292000
         BKPT'SIZE        =(11: 5)#,                           <<01549>>00294000
         BKPT'TAG         =( 0: 1)#, <<FREE/USED ENTRY>>       <<01549>>00296000
                                                               <<01549>>00298000
         << DEFINES FOR CONDITION >>                           <<01549>>00300000
         BKPT'BASE        =( 6:10)#, <<SEG/BANK#>>             <<01549>>00302000
         BKPT'REG         =( 0: 6)#, <<DA,Q,... >>             <<01549>>00304000
         BKPT'OP1INFO     =( 0: 2)#,                           <<01549>>00306000
         BKPT'OP1IND      =( 0: 1)#,                           <<01549>>00308000
         BKPT'OP2INFO     =( 2: 2)#,                           <<01549>>00310000
         BKPT'OP2IND      =( 2: 1)#,                           <<01549>>00312000
         BKPT'CONDTYPE    =( 8: 8)#,                           <<01549>>00314000
                                                               <<01549>>00316000
         SIZEOP1          =(IF STOP(LINK).BKPT'OP1INFO=0 THEN 1<<01549>>00318000
                           ELSE 2+STOP(LINK).BKPT'OP1IND)#,    <<01549>>00320000
         SIZEOP2          =(IF STOP(LINK).BKPT'OP2INFO=0 THEN 1<<01549>>00322000
                            ELSE 2+STOP(LINK).BKPT'OP2IND)#,   <<01549>>00324000
         LINKOP1           =(LINK - SIZEOP2 -SIZEOP1)#,        <<01549>>00326000
         LINKOP2           =(LINK - SIZEOP2)#,                 <<01549>>00328000
                                                               <<01549>>00330000
         << INDEXES OF ENTRY 0 & 1 >>                          <<01549>>00332000
         IND'ENT0         =STOP(0)#,                           <<01549>>00334000
         IND'ENT1         =(IND'ENT0+5)#,                      <<01549>>00336000
                                                               <<01549>>00338000
         AVAIL            =STOP(IND'ENT0+1)#,                  <<01549>>00340000
         BKPT'DST'SIZE    =(STOP(IND'ENT0)+STOP(0))#,          <<01549>>00342000
         NO'BKPT'ENTRIES  =(STOP(SYS'BKPT'EXT'X) = 0 LAND      <<01549>>00344000
                            STOP(PROC'CNT) = 0)#,              <<01549>>00346000
         BKPT'TAB'LOCKED  =F(STOPB').(14:1)#,                  <<01549>>00348000
                                                               <<01549>>00350000
         << FREE ENTRY >>                                      <<01549>>00352000
         FREE'SIZE        =( 1:15)#,                           <<01549>>00354000
                                                               <<01549>>00356000
         << BREAK POINT BITS IN PCB >>                         <<01549>>00358000
         PCB'BKPT'BITS    =( 8: 8)#,                           <<01549>>00360000
       <<DEBUGDST         =F(STOPB').(1:8)#,    TEMP KLUDGE >> <<01549>>00362000
                                                               <<01549>>00364000
         << SYSTEM BREAK POINT FLAG >>                         <<01549>>00366000
         SYS'BKPT         =F(STOPB').(15:1)#;                  <<01549>>00368000
                                                               <<01549>>00370000
         << BREAK POINT TABLE EQUATES >>                       <<01549>>00372000
EQUATE                                                         <<01549>>00374000
         DEBUGDST         =%36,                                <<01549>>00376000
         BKPTSIR          =%41,                                <<01549>>00378000
                                                               <<01549>>00380000
         << EQUATES FOR IN USE ENTRY >>                        <<01549>>00382000
         CLABELOFFSET     =1,                                  <<01549>>00384000
         PLOCOFFSET       =2,                                  <<01549>>00386000
         INSTROFFSET      =3,                                  <<01549>>00388000
         LINKOFFSET       =4,                                  <<01549>>00390000
         USERLBLOFFSET    =5,                                  <<01549>>00392000
         MIN'ENT'SIZE     =5,                                  <<01549>>00394000
         MAX'COND'SIZE    =7,                                  <<01549>>00396000
         ENTRYSIZE'CNT    =3,                                  <<01549>>00398000
         MAX'BKPT'SIZE    =MIN'ENT'SIZE+MAX'COND'SIZE+1,       <<01549>>00400000
                                                               <<01549>>00402000
         << OFFSETS IN FREE ENTRY >>                           <<01549>>00404000
         FORWLINK         =1,                                  <<01549>>00406000
         BKWLINK          =2,                                  <<01549>>00408000
                                                               <<01549>>00410000
         << PCB-BREAK POINT EXT. TABLE >>                      <<01549>>00412000
         SYS'BKPT'EXT'X   =1,                                  <<01549>>00414000
         PROC'CNT         =2,                                  <<01549>>00416000
                                                               <<01549>>00418000
         << PCB TABLE >>                                       <<01549>>00420000
         PCB'BKPT'WD      =7;                                  <<01549>>00422000
                                                               <<01549>>00424000
         << EQUATES FOR REG NUMBERS >>                         <<01549>>00426000
EQUATE                                                         <<01549>>00428000
         REGR             = 0,REGST = 1,REGX  = 2,             <<01549>>00430000
         REGA             = 3,REGSY = 4,REGV  = 5,             <<01549>>00432000
         REGCO            = 6,REGDA = 7,REGDX = 8,             <<01549>>00434000
         REGDB            = 9,REGDL =10,REGQ  =11,REGS  =12,   <<01549>>00436000
         REGZ             =13,                                 <<01549>>00438000
         REGPB            =14,REGP  =15,REGPL =16,REGEA =17,   <<01549>>00440000
         REG1             =18,REG2  =19,REG3  =20,REG4  =21,   <<01549>>00442000
         REGEND           =22,REGBNK=22,REGDBV=23,REGDBX=24,   <<01549>>00444000
         REGLOG           =25,REGTC =26,REGTL =27,REGTP =28,   <<01549>>00446000
         REGEXX           =28;                                 <<01549>>00448000
                                                               <<01069>>00450000
         << ERROR EQUATES >>                                   <<01069>>00452000
                                                               <<01069>>00454000
EQUATE   INVALID'PLOC     =1,                                  <<01069>>00456000
         INVALID'PIN      =5,                                  <<01549>>00458000
         INVALID'SEG      =6,                                  <<01069>>00460000
         INVALID'TYPESEG  =7,                                  <<01069>>00462000
         INVALID'CNT      =8,                                  <<01069>>00464000
         INVALID'CAP      =9,                                  <<01069>>00466000
         INVALID'PLABEL   =10,                                 <<01069>>00468000
         INVALID'BRKTYPE  =11,                                 <<01069>>00470000
         EVERYTHINGOK     =0,                                  <<01069>>00472000
                                                               <<01549>>00474000
         << GLOBAL EQUATES >>                                  <<01069>>00476000
         MAX'NUMPROGSEG   =%77,                                <<01549>>00478000
                                                               <<01549>>00480000
         << EQUATE FOR PROCESSING BKPT CONDITION >>            <<01549>>00482000
         STAK'SEG         =0,                                  <<01549>>00484000
         DA'SEG           =1,                                  <<01549>>00486000
         ABS'ADDR         =2,                                  <<01549>>00488000
         SYS'GLOB'ADDR    =3,                                  <<01549>>00490000
         GOT'OPERAND      =0,                                  <<01549>>00492000
         BOUNDSV          =1,                                  <<01549>>00494000
         NOT'INCORE       =2,                                  <<01549>>00496000
         COND'TRUE        =GOT'OPERAND,                        <<01549>>00498000
         COND'FALSE       =BOUNDSV,                            <<01549>>00500000
         UNABLETESTCOND   =NOT'INCORE,                         <<01549>>00502000
         TIME'FOR'BREAK   =GOT'OPERAND,                        <<01549>>00504000
         NOT'THIS'TIME    =COND'FALSE,                         <<01549>>00506000
                                                               <<01549>>00508000
         << TOKEN NUMBERS: 1 CHAR SPECIALS MUST  >>            <<01549>>00510000
         << BE IN SAME ORDER AS ARRAY 'SPECIALS' >>            <<01549>>00512000
         T'IDENT          =0,                                  <<01549>>00514000
         T'NUMBER         =1,                                  <<01549>>00516000
         T'INVALID        =2,                                  <<01549>>00518000
         T'LT             =3,                                  <<01549>>00520000
         T'GT             =4,                                  <<01549>>00522000
         T'EQ             =5,                                  <<01549>>00524000
         T'ATSIGN         =6,                                  <<01549>>00526000
         T'POUNDSIGN      =7,                                  <<01549>>00528000
         T'COLON          =8,                                  <<01549>>00530000
         T'LTE            =9,                                  <<01549>>00532000
         T'GTE            =10,                                 <<01549>>00534000
         T'NEQ            =11,                                 <<01549>>00536000
                                                               <<01549>>00538000
         FIRSTSPECIAL     =T'LT,                               <<01549>>00540000
         << LAST 1 CHAR. SPECIAL: >>                           <<01549>>00542000
         LASTSPECIAL      =T'COLON,                            <<01549>>00544000
         NUM'SPECIALS     =LASTSPECIAL-FIRSTSPECIAL+1,         <<01549>>00546000
         SPECIALS'END     =NUM'SPECIALS-1;                     <<01549>>00548000
                                                               <<01549>>00550000
         << DEF FOR ENTERSTOP & REMOVESTOP CALL SEQUENCE >>    <<01549>>00552000
DEFINE   CURRENTPCBBIT    =( 0: 1)#,                           <<01549>>00554000
         PRIVBIT          =( 1: 1)#,                           <<01549>>00556000
         LOCBIT           =( 2: 1)#,                           <<01549>>00558000
         DBLTRAP          =( 4: 1)#,                           <<01069>>00560000
         PERMBIT          =( 5: 1)#,                           <<01069>>00562000
         LABELBIT         =( 6: 1)#,                           <<01069>>00564000
                                                               <<01069>>00566000
         << DEF FOR PROGRAMATIC SET/CLEAR BRKPNT >>            <<01069>>00568000
         SYSBRKPNT        =(13: 3)#,                           <<01069>>00570000
         PERMBRKPNT       =(12: 1)#;                           <<01069>>00572000
                                                               <<01069>>00574000
DEFINE   DEF'MOVEFROMDSEG =                                    <<01069>>00576000
            MOVEFROMDSEG(TARGET,DSTN,OFFSET,COUNT);            <<01069>>00578000
               VALUE TARGET,DSTN,OFFSET,COUNT;                 <<01069>>00580000
               LOGICAL TARGET,DSTN,OFFSET,COUNT;               <<01069>>00582000
            BEGIN                                              <<01069>>00584000
               X := TOS; << SAVE RETURN ADDRESS >>             <<01069>>00586000
               ASSEMBLE(MFDS 0);                               <<01069>>00588000
               TOS := X; << RESTORE RETURN ADDRESS >>          <<01069>>00590000
            END #,                                             <<01069>>00592000
                                                               <<01069>>00594000
         DEF'MOVETODSEG =                                      <<01069>>00596000
            MOVETODSEG(DSTN,OFFSET,SOURCE,COUNT);              <<01069>>00598000
               VALUE DSTN,OFFSET,SOURCE,COUNT;                 <<01069>>00600000
               LOGICAL DSTN,OFFSET,SOURCE,COUNT;               <<01069>>00602000
            BEGIN                                              <<01069>>00604000
               X := TOS;                                       <<01069>>00606000
               ASSEMBLE(MTDS 0);                               <<01069>>00608000
               TOS := X;                                       <<01069>>00610000
            END #,                                             <<01069>>00612000
                                                               <<01069>>00614000
         GETJITINDEX =                                         <<01069>>00616000
            PUSH(DL);                                          <<01069>>00618000
            TOS := MEM(TOS - PS0(-1) + 6).(6:10)#,             <<01549>>00620000
         LOCK'BKPT'TAB =                                       <<01549>>00622000
            BEGIN                                              <<01549>>00624000
            LOCKSEG (DEBUGDST,1,0);                            <<01549>>00626000
            BKPT'TAB'LOCKED := TRUE;                           <<01549>>00628000
            END#,                                              <<01549>>00630000
                                                               <<01549>>00632000
         UNLOCK'BKPT'TAB =                                     <<01549>>00634000
            BEGIN                                              <<01549>>00636000
            BKPT'TAB'LOCKED := FALSE;                          <<01549>>00638000
            UNLOCKSEG (DEBUGDST,1,0);                          <<01549>>00640000
            END#;                                              <<01549>>00642000
$PAGE "          EXTERNAL & FORWARD DECLARATIONS"              <<01069>>00644000
            << >>                                              <<01069>>00646000
            <<FORWARD DECLARATIONS>>                           <<01069>>00648000
            << >>                                              <<01069>>00650000
PROCEDURE DEBUG;                                               <<01069>>00652000
   OPTION FORWARD;                                             <<01069>>00654000
                                                               <<01069>>00656000
            << >>                                              <<01549>>00658000
PROCEDURE SET'DB'DSEG (DB'STATE,XDS,ORIG'DB,DSTNUM);           <<01549>>00660000
   VALUE DB'STATE,XDS,ORIG'DB,DSTNUM;                          <<01549>>00662000
   INTEGER DB'STATE,XDS,DSTNUM;                                <<01549>>00664000
   DOUBLE ORIG'DB;                                             <<01549>>00666000
   OPTION FORWARD;                                             <<01549>>00668000
            << >>                                              <<01549>>00670000
PROCEDURE SET'DB (DB'STATE,XDS,DB'REG);                        <<01549>>00672000
   VALUE DB'STATE,XDS,DB'REG;                                  <<01549>>00674000
   INTEGER DB'STATE,XDS;                                       <<01549>>00676000
   DOUBLE DB'REG;                                              <<01549>>00678000
   OPTION FORWARD;                                             <<01549>>00680000
            << >>                                              <<01549>>00682000
            << >>                                                       00684000
            <<EXTERNAL PROCEDURES>>                                     00686000
            << >>                                                       00688000
LOGICAL PROCEDURE PHYSICALCST(PINN,LOGCST);                             00690000
  VALUE PINN,LOGCST;LOGICAL PINN,LOGCST;OPTION EXTERNAL;                00692000
            << >>                                                       00694000
DOUBLE PROCEDURE LOGICALCST(PHYCST);                                    00696000
  VALUE PHYCST;LOGICAL PHYCST;OPTION EXTERNAL;                          00698000
            << >>                                                       00700000
PROCEDURE SUDDENDEATH(ERRNUM);                                          00702000
   VALUE      ERRNUM;                                                   00704000
   INTEGER    ERRNUM;                                                   00706000
   OPTION     EXTERNAL;                                                 00708000
            << >>                                                       00710000
LOGICAL PROCEDURE SETSYSDB;                                             00712000
  OPTION EXTERNAL;                                                      00714000
            << >>                                                       00716000
LOGICAL PROCEDURE GETSIR (SIR);                                <<01549>>00718000
   VALUE SIR;                                                  <<01549>>00720000
   INTEGER SIR;                                                <<01549>>00722000
   OPTION EXTERNAL;                                            <<01549>>00724000
            << >>                                              <<01549>>00726000
PROCEDURE RELSIR (SIR,FLAG);                                   <<01549>>00728000
   VALUE SIR,FLAG;                                             <<01549>>00730000
   INTEGER SIR,FLAG;                                           <<01549>>00732000
   OPTION EXTERNAL;                                            <<01549>>00734000
            << >>                                              <<01549>>00736000
LOGICAL PROCEDURE TRAPLABEL(N,MASK,PLAB,XMASK,XPLAB);          <<01069>>00738000
   VALUE   N,MASK,PLAB;                                        <<01069>>00740000
   INTEGER N,MASK,PLAB,XMASK,XPLAB;                            <<01069>>00742000
   OPTION  PRIVILEGED,UNCALLABLE,EXTERNAL;                     <<01069>>00744000
            << >>                                              <<01069>>00746000
INTEGER PROCEDURE BUILDSEGID(SEG'TYPE,SEGNUMBER,PIN');         <<01610>>00748000
   VALUE SEG'TYPE,SEGNUMBER,PIN';                              <<01610>>00750000
   INTEGER SEG'TYPE,SEGNUMBER,PIN';                            <<01610>>00752000
   OPTION EXTERNAL;                                            <<01610>>00754000
            << >>                                              <<01610>>00756000
INTEGER PROCEDURE CONVSEGIDTOSTINX(SEGIDENTIFIER);             <<01610>>00758000
   VALUE SEGIDENTIFIER;                                        <<01610>>00760000
   LOGICAL SEGIDENTIFIER;                                      <<01610>>00762000
   OPTION EXTERNAL;                                            <<01610>>00764000
            << >>                                                       00766000
PROCEDURE BLKLABEL;                                                     00768000
   OPTION    EXTERNAL;                                                  00770000
            << >>                                                       00772000
PROCEDURE RESETDB(D);                                                   00774000
  VALUE D;LOGICAL D;OPTION EXTERNAL;                                    00776000
            << >>                                                       00778000
LOGICAL PROCEDURE SETCRITICAL;                                          00780000
  OPTION EXTERNAL;                                                      00782000
            << >>                                                       00784000
PROCEDURE RESETCRITICAL(C);                                             00786000
  VALUE C;LOGICAL C;OPTION EXTERNAL;                                    00788000
            << >>                                                       00790000
PROCEDURE ERRORON;                                                      00792000
   OPTION     EXTERNAL;                                                 00794000
            << >>                                                       00796000
PROCEDURE ERROREXIT(I,E,P);                                             00798000
   VALUE      I,E,P;                                                    00800000
   LOGICAL    I,E,P;                                                    00802000
   OPTION     EXTERNAL;                                                 00804000
            << >>                                                       00806000
DOUBLE PROCEDURE CHEK (INTRINSIC, FLAGS, PARMS, CAPMASK,       <<01069>>00808000
                       OPTVMASK);                              <<01069>>00810000
   VALUE INTRINSIC, FLAGS, PARMS, CAPMASK, OPTVMASK;           <<01069>>00812000
   LOGICAL INTRINSIC, FLAGS, OPTVMASK;                         <<01069>>00814000
   DOUBLE PARMS, CAPMASK;                                      <<01069>>00816000
   OPTION VARIABLE,EXTERNAL;                                   <<01069>>00818000
            << >>                                              <<01069>>00820000
PROCEDURE TERMINATE;                                                    00822000
   OPTION     EXTERNAL;                                                 00824000
            << >>                                                       00826000
LOGICAL PROCEDURE EXCHANGEDB(D);                                        00828000
  VALUE D;LOGICAL D;OPTION EXTERNAL;                                    00830000
            << >>                                                       00832000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENTIFIER,FLAGS);           <<01549>>00834000
VALUE SLLINX,SEGIDENTIFIER,FLAGS;                              <<01549>>00836000
INTEGER SLLINX,SEGIDENTIFIER,FLAGS;                            <<01549>>00838000
OPTION EXTERNAL;                                               <<01549>>00840000
            << >>                                                       00842000
LOGICAL PROCEDURE GETENTRY(IX);                                         00844000
  VALUE IX;LOGICAL IX;OPTION EXTERNAL;                                  00846000
            << >>                                                       00848000
            << >>                                              <<01549>>00850000
INTEGER PROCEDURE GETDATASEG (MEM,VIRT);                       <<01549>>00852000
  VALUE MEM,VIRT;INTEGER MEM,VIRT; OPTION EXTERNAL;            <<01549>>00854000
            << >>                                              <<01549>>00856000
PROCEDURE RELDATASEG (EN);                                     <<01549>>00858000
  VALUE EN;INTEGER EN; OPTION EXTERNAL;                        <<01549>>00860000
            << >>                                              <<01549>>00862000
PROCEDURE RELCODESEG(IX);                                               00864000
  VALUE IX;LOGICAL IX;OPTION EXTERNAL;                                  00866000
            << >>                                              <<01549>>00868000
LOGICAL PROCEDURE DEASSEMBLE(RESULT,STRING,INSTR'1,INSTR'2);   <<01549>>00870000
  VALUE INSTR'1,INSTR'2;                                       <<01549>>00872000
  INTEGER RESULT,INSTR'1,INSTR'2;                              <<01549>>00874000
  BYTE ARRAY STRING; OPTION VARIABLE,EXTERNAL;                 <<01549>>00876000
            << >>                                                       00878000
INTEGER PROCEDURE DLSIZE(N);                                            00880000
  VALUE N;INTEGER N;OPTION EXTERNAL;                                    00882000
            << >>                                                       00884000
INTEGER PROCEDURE ZSIZE(N);                                             00886000
  VALUE N;INTEGER N;OPTION EXTERNAL;                                    00888000
            << >>                                                       00890000
PROCEDURE FWRITE(F',B,L,C);                                             00892000
  VALUE F',L,C;INTEGER F',L,C;ARRAY B;OPTION EXTERNAL;                  00894000
            << >>                                                       00896000
PROCEDURE FCLOSE(F',D,S);                                               00898000
  VALUE F',D,S;INTEGER F',D,S;OPTION EXTERNAL;                          00900000
            << >>                                                       00902000
INTEGER PROCEDURE FOPEN(F',FP,A,R,D,FM,U,B,N,FS,X,I,FC);                00904000
  VALUE   FP,A,R,U,B,N,FS,X,I,FC;                                       00906000
  LOGICAL FP,A;                                                         00908000
  INTEGER R,U,B,N,X,I,FC;                                               00910000
  DOUBLE  FS;                                                           00912000
  BYTE ARRAY F',D,FM;                                                   00914000
  OPTION EXTERNAL,VARIABLE;                                             00916000
            << >>                                                       00918000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DX,T,FUNC,CNT,P1,P2,FLGS);         00920000
  VALUE   LDEV,QMISC,DX,T,FUNC,CNT,P1,P2,FLGS;                          00922000
  INTEGER LDEV,QMISC,DX,T,FUNC,CNT,P1,P2,FLGS;                          00924000
  OPTION EXTERNAL;                                                      00926000
            << >>                                                       00928000
PROCEDURE FREEZE(EN,TEST,PINX);                                         00930000
   VALUE      EN,TEST,PINX;                                             00932000
   INTEGER    EN,PINX;                                                  00934000
   LOGICAL    TEST;                                                     00936000
   OPTION     EXTERNAL;                                                 00938000
            << >>                                                       00940000
PROCEDURE UNFREEZE(EN,TEST,PINX);                                       00942000
   VALUE      EN,TEST,PINX;                                             00944000
   INTEGER    EN,PINX;                                                  00946000
   LOGICAL    TEST;                                                     00948000
   OPTION     EXTERNAL;                                                 00950000
            << >>                                                       00952000
PROCEDURE LOCKSEG(EN,TEST,PINX);                               <<01549>>00954000
   VALUE      EN,TEST,PINX;                                    <<01549>>00956000
   INTEGER    EN,PINX;                                         <<01549>>00958000
   LOGICAL    TEST;                                            <<01549>>00960000
   OPTION     EXTERNAL;                                        <<01549>>00962000
            << >>                                              <<01549>>00964000
PROCEDURE UNLOCKSEG(EN,TEST,PINX);                             <<01549>>00966000
   VALUE      EN,TEST,PINX;                                    <<01549>>00968000
   INTEGER    EN,PINX;                                         <<01549>>00970000
   LOGICAL    TEST;                                            <<01549>>00972000
   OPTION     EXTERNAL;                                        <<01549>>00974000
            << >>                                              <<01549>>00976000
INTEGER PROCEDURE THISCPU;                                     <<00315>>00978000
   OPTION     EXTERNAL;                                        <<00315>>00980000
            << >>                                              <<00315>>00982000
PROCEDURE HELP;                                                         00984000
   OPTION     EXTERNAL;                                                 00986000
                                                               <<01549>>00988000
INTEGER PROCEDURE CONVEXTLABELTODELTAP(EXTLABEL);              <<01549>>00990000
VALUE EXTLABEL;                                                <<01549>>00992000
INTEGER EXTLABEL;                                              <<01549>>00994000
OPTION EXTERNAL;                                               <<01549>>00996000
                                                               <<01549>>00998000
            << >>                                                       01000000
            << >>                                                       01002000
            << >>                                                       01004000
                                                                        01006000
          << >>                                                <<01549>>01008000
LOGICAL PROCEDURE TRANS'PROCOFFSET (PROCDESIG,SEG,DISP);       <<01549>>01010000
   INTEGER SEG,DISP;                                           <<01549>>01012000
   BYTE POINTER PROCDESIG;                                     <<01549>>01014000
   OPTION INTERNAL;                                            <<01549>>01016000
   BEGIN                                                       <<01549>>01018000
       << DUMMY PROCEDURE >>                                   <<01549>>01020000
       DISP := %2;                                             <<01549>>01022000
       SEG  := %301;                                           <<01549>>01024000
       TRANS'PROCOFFSET := TRUE;                               <<01549>>01026000
   END;                                                        <<01549>>01028000
          << >>                                                <<01610>>01030000
          <<THIS ROUTINE RETURNS SEG. ID TYPE                           01032000
            OF SEG.                                                     01034000
               SEG:     ABSOLUTE SEG NUMBER                             01036000
                                                                        01038000
               RETURNS: 1 = SL SEG                                      01040000
                        2 = PROG SEG                                    01042000
          >>                                                   <<01610>>01044000
          << >>                                                <<01610>>01046000
INTEGER PROCEDURE SEG'ID'TYPE (SEG);                           <<01610>>01048000
   VALUE SEG;                                                  <<01610>>01050000
   INTEGER SEG;                                                <<01610>>01052000
   OPTION UNCALLABLE,PRIVILEGED;                               <<01610>>01054000
   BEGIN                                                       <<01610>>01056000
          << >>                                                <<01610>>01058000
          SEG'ID'TYPE := IF SEG > %300 THEN SEGIDPROG          <<01610>>01060000
                         ELSE SEGIDSL;                         <<01610>>01062000
   END;                                                        <<01610>>01064000
                                                               <<01610>>01066000
          << >>                                                <<01610>>01068000
          <<THIS ROUTINE CONVERTS AN ABSOLUTE                           01070000
            SEGMENT NUMBER TO ITS DST INDEX                             01072000
               SEG:     ABSOLUTE SEGMENT NUMBER                         01074000
               PINX:    PCB INDEX FOR PROCESS                           01076000
                                                                        01078000
               RETURNS: DST INDEX OF SEG                                01080000
                        0 IF SEG MAPS TO UNALLOCATED CST                01082000
          >>                                                   <<01610>>01084000
          << >>                                                <<01610>>01086000
INTEGER PROCEDURE CSTCONV (SEG,PINX);                          <<01610>>01088000
   VALUE SEG,PINX;                                             <<01610>>01090000
   INTEGER SEG,PINX;                                           <<01610>>01092000
   OPTION UNCALLABLE,PRIVILEGED,INTERNAL;                      <<01610>>01094000
   BEGIN                                                       <<01610>>01096000
          INTEGER CLABEL;                                      <<01610>>01098000
          << >>                                                <<01610>>01100000
          CLABEL := BUILDSEGID (SEG'ID'TYPE(SEG),SEG,          <<01610>>01102000
                                (PINX/PCBSIZE));               <<01610>>01104000
          CSTCONV := CONVSEGIDTOSTINX (CLABEL);                <<01610>>01106000
   END;                                                        <<01610>>01108000
                                                               <<01549>>01110000
          << >>                                                         01112000
          <<SETS UP A SEGMENT IN MEMORY UNDER A                         01114000
            FREEZE/EXCHANGEDB/ABSOLUTE DB.                              01116000
              MODE.( 8:1) D DATA SEGMENT                                01118000
                  .( 9:1) F FREEZE                                      01120000
                  .(10:1) X EXCHANGEDB                                  01122000
                  .(11:1) S SYSTEM/ABS DB                               01124000
              SEG  CODE/DATA SEG OR ABS ADDRESS                         01126000
              BANK # IF ABS ADDRESS                                     01128000
              PINX PCB INDEX OF PIN (OPTIONAL)                 ((MPEIV))01130000
            ASSUME DB=STACK DB                >>                        01132000
          << >>                                                         01134000
LOGICAL PROCEDURE SETSEG(MODE,SEG,BANK,PINX);                  <<01549>>01136000
   VALUE   MODE,SEG,BANK,PINX;                                 <<01549>>01138000
   LOGICAL MODE,SEG,BANK,PINX;                                 <<01549>>01140000
   OPTION VARIABLE,UNCALLABLE,PRIVILEGED;                      <<01549>>01142000
   BEGIN                                                                01144000
          DEFINE PINX'PASSED = PARMMASK.(15:1)#;               <<01549>>01146000
          INTEGER ADDR=SEG;                                             01148000
          << >>                                                         01150000
          << SET UP DEFAULT PINX IF NECESSARY >>               <<01549>>01152000
          IF NOT PINX'PASSED THEN PINX := PIX;                 <<01549>>01154000
          IF MODE.(8:1) THEN                                            01156000
             BEGIN            <<DATA SEG>>                              01158000
             IF NOT MODE.(11:1) THEN                                    01160000
                BEGIN                                                   01162000
        IF MODE.(9:1) THEN                                     <<01549>>01164000
           BEGIN                                               <<01549>>01166000
           TOS:=SEG;                                           <<01549>>01168000
           TOS:=TRUE;                                          <<01549>>01170000
             TOS:=PINX;                                        <<01549>>01172000
           FREEZE(*,*,*);                                      <<01549>>01174000
           END;                                                <<01549>>01176000
                IF MODE.(10:1) THEN EXCHANGEDB(SEG);                    01178000
                SETSEG_TRUE;                                            01180000
                END;                                                    01182000
             END                                                        01184000
          ELSE                                                          01186000
             BEGIN            <<CODE SEG/ABS DB>>                       01188000
             IF NOT MODE.(10:1) THEN                                    01190000
                BEGIN                                                   01192000
                IF MODE.(9:1) THEN                                      01194000
                   BEGIN                                                01196000
                   TOS:=SEG;                                   <<01549>>01198000
                   TOS:=FALSE;                                 <<01549>>01200000
                     TOS:=PINX;                                <<01549>>01202000
                   FREEZE(*,*,*);                              <<01549>>01204000
                     BANK:=DSTI'(CSTCONV(SEG,PINX)+2);         <<01549>>01206000
                   ADDR_DSTI'(X_X+1);                                   01208000
                END;                                                    01210000
             IF MODE.(11:1) THEN                                        01212000
                BEGIN                                                   01214000
                SETSYSDB;                                               01216000
                TOS_BANK;                                               01218000
                TOS_ADDR;                                               01220000
                ASSEMBLE(XCHD);                                         01222000
                DDEL;                                                   01224000
                END;                                                    01226000
             SETSEG_TRUE;                                               01228000
             END;                                                       01230000
          END;                                                          01232000
   END;                                                                 01234000
                                                                        01236000
                                                                        01238000
          << >>                                                         01240000
          <<RESETS TO STACK DB A SEGMENT IN MEMORY UPON                 01242000
            WHICH A SETSEG HAS BEEN PERFORMED.                          01244000
            THE MODE PASSED IS ASSUMED TO BE IDENTICAL>>                01246000
          << >>                                                         01248000
LOGICAL PROCEDURE RESETSEG(MODE,SEG,PINX);                     <<01549>>01250000
   VALUE   MODE,SEG,PINX;                                      <<01549>>01252000
   LOGICAL MODE,SEG,PINX;                                      <<01549>>01254000
   OPTION VARIABLE,UNCALLABLE,PRIVILEGED;                      <<01549>>01256000
   BEGIN                                                                01258000
          DEFINE PINX'PASSED = PARMMASK.(15:1)#;               <<01549>>01260000
          << >>                                                         01262000
          << SET UP DEFAULT PINX IF NECESSARY >>               <<01549>>01264000
          IF NOT PINX'PASSED THEN PINX := PIX;                 <<01549>>01266000
          IF MODE.(8:1) THEN                                            01268000
             BEGIN           <<DATA SEG>>                               01270000
             IF NOT MODE.(11:1) THEN                                    01272000
                BEGIN                                                   01274000
                IF MODE.(10:1) THEN EXCHANGEDB(0);                      01276000
                IF MODE.( 9:1) THEN UNFREEZE(SEG,1,PINX);      <<01549>>01278000
                RESETSEG_TRUE;                                          01280000
                END;                                                    01282000
             END                                                        01284000
          ELSE                                                          01286000
             BEGIN             <<CODE SEG>>                             01288000
             IF NOT MODE.(10:1) THEN                                    01290000
                BEGIN                                                   01292000
                IF MODE.(11:1) THEN RESETDB(-1);                        01294000
                IF MODE.( 9:1) THEN UNFREEZE(SEG,0,PINX);      <<01549>>01296000
                RESETSEG_TRUE;                                          01298000
                END;                                                    01300000
             END;                                                       01302000
   END;                                                                 01304000
          << >>                                                <<01069>>01306000
          <<THIS PROCEDURE VALIDATES                           ((TB.MM))01308000
            A PIN AND SEGMENT NUMBER. IF A PIN                 ((TB.MM))01310000
            NUMBER IS NOT PASSED, THE PIN OF                   ((TB.MM))01312000
            THE CALLER IS USED TO DETERMINE                    ((TB.MM))01314000
            THE VALIDITY OF THE SEGMENT #.                     ((TB.MM))01316000
            THIS ROUTINE MAY BE CALLED PDISABLED.              ((TB.MM))01318000
                                                               ((TB.MM))01320000
            VALIDATE = 0 OK                                    ((TB.MM))01322000
                       1 INVALID PIN NUMBER                    ((TB.MM))01324000
                       2 INVALID SEG NUMBER                    ((MPEIV))01326000
            ASSUMES:   IF PIN IS NOT THE CURRENT PROCESS       ((MPEIV))01328000
                       THEN THE CALLER IS EITHER               ((MPEIV))01330000
                       PDISABLED OR HAS SEGTAB. SIR   >>       <<01549>>01332000
          << >>                                                <<01069>>01334000
INTEGER PROCEDURE VALIDATE(PIN'NUM,SEG);                       <<01069>>01336000
   VALUE    PIN'NUM,SEG;                                       <<01069>>01338000
   INTEGER  PIN'NUM,SEG;                                       <<01069>>01340000
   OPTION   VARIABLE,UNCALLABLE,PRIVILEGED;                    <<01069>>01342000
                                                               <<01069>>01344000
   BEGIN                                                       <<01069>>01346000
          LOGICAL                                              <<01069>>01348000
             PARMMASK = Q-4;                                   <<01069>>01350000
          INTEGER                                              <<01069>>01352000
             LENGTH,                                           <<01069>>01354000
             PINX;                                             <<01069>>01356000
          DEFINE                                               <<01069>>01358000
             VALIDATE'PIN = PARMMASK.(14:1) #,                 <<01069>>01360000
             VALIDATE'SEG = PARMMASK.(15:1) #;                 <<01069>>01362000
          DEFINE                                               <<01069>>01364000
             RETURN'ERR'PIN =                                  <<01069>>01366000
                BEGIN                                          <<01069>>01368000
                VALIDATE := 1;                                 <<01069>>01370000
                RETURN;                                        <<01069>>01372000
                END; #,                                        <<01069>>01374000
             RETURN'ERR'SEG =                                  <<01069>>01376000
                BEGIN                                          <<01069>>01378000
                VALIDATE := 2;                                 <<01069>>01380000
                RETURN;                                        <<01069>>01382000
                END; #;                                        <<01069>>01384000
                                                               <<01069>>01386000
          << >>                                                <<01069>>01388000
          << SET UP PCB INDEX >>                               <<01069>>01390000
          IF VALIDATE'PIN THEN                                 <<01069>>01392000
             BEGIN                                             <<01069>>01394000
             IF NOT (1 <= PIN'NUM <= NUMPCBS')                 <<01549>>01396000
             THEN RETURN'ERR'PIN;                              <<01069>>01398000
             << IF THE PIN NOT THE CALLERS PIN THEN >>         <<01069>>01400000
             << THE PROCESS MUST BE ALIVE           >>         <<01069>>01402000
             PINX := PIN'NUM*PCBSIZE;                          <<01549>>01404000
             IF PINX <> PIX AND                                <<01069>>01406000
                NOT LOGICAL(PCBI'(PINX+9).LIVBIT)              <<01069>>01408000
             THEN RETURN'ERR'PIN;                              <<01069>>01410000
             END;                                              <<01069>>01412000
                                                               <<01069>>01414000
          IF VALIDATE'SEG THEN                                 <<01069>>01416000
             BEGIN                                             <<01069>>01418000
             IF NOT VALIDATE'PIN THEN PINX := PIX;             <<01069>>01420000
             IF SEG <= 0 THEN  RETURN'ERR'SEG;                 <<01069>>01422000
             IF SEG <= %300 THEN                               <<01069>>01424000
                BEGIN                                          <<01069>>01426000
                IF SEG > CSTI'(0) THEN RETURN'ERR'SEG;         <<01069>>01428000
                END                                            <<01069>>01430000
             ELSE                                              <<01069>>01432000
                BEGIN                                          <<01069>>01434000
                << CHECK FOR CSTX >>                           <<01069>>01436000
                IF PCBI'(PINX+PBX) = 0 THEN RETURN'ERR'SEG;    <<01069>>01438000
                << SEG # IN RANGE? >>                          <<01069>>01440000
                IF (SEG-%300) > DSTI'(CSTBLK'(PCBI'(PINX+PBX)))<<01069>>01442000
                   THEN RETURN'ERR'SEG;                        <<01069>>01444000
                END;                                           <<01069>>01446000
             << ALLOCATED SEGMENT ? >>                         <<01832>>01448000
             IF CSTCONV (SEG,PINX) = 0 THEN RETURN'ERR'SEG;    <<01832>>01450000
             END;                                              <<01069>>01452000
                                                               <<01069>>01454000
          VALIDATE := 0;  << EVERYTHING OK >>                  <<01069>>01456000
   END;                                                        <<01069>>01458000
$PAGE "           BREAKPOINT TABLE MANAGEMENT PROCEDURES"      <<01549>>01460000
          << >>                                                <<01549>>01462000
          << THIS ROUTINE PERFORMS 2 FUNCTIONS:                ((MPEIV))01464000
                                                               ((MPEIV))01466000
               1) IT FINDS/RETURNS A FREE BREAKPOINT           ((MPEIV))01468000
                  ENTRY.                                       ((MPEIV))01470000
               2) COALESCES THE FREE LIST AS IT                ((MPEIV))01472000
                  SEARCHES FOR AN ENTRY.                       ((MPEIV))01474000
                                                               ((MPEIV))01476000
             PARAMETERS:                                       ((MPEIV))01478000
                SIZE: THE SIZE OF THE REQUESTED ENTRY          ((MPEIV))01480000
                                                               ((MPEIV))01482000
             RETURNS:                                          ((MPEIV))01484000
                0:    UNABLE TO FIND ENTRY OF THE              ((MPEIV))01486000
                      REQUESTED SIZE.                          ((MPEIV))01488000
                <>0:  INDEX OF ENTRY.                          ((MPEIV))01490000
                      STOP(INDEX).BKPT'SIZE IS THE             ((MPEIV))01492000
                      ACTUAL SIZE OF THE ENTRY,                ((MPEIV))01494000
                      THE ACTUAL SIZE MAY BE GREATER           ((MPEIV))01496000
                      THAN THE REQUESTED SIZE.                 ((MPEIV))01498000
                                                               ((MPEIV))01500000
             ASSUMES:                                          ((MPEIV))01502000
                      DB IS SET TO BREAKPOINT TABLE.           ((MPEIV))01504000
                      ENTER PDISABLED.                         ((MPEIV))01506000
          >>                                                   <<01549>>01508000
          << >>                                                <<01549>>01510000
INTEGER PROCEDURE GET'BKPT'ENTRY (SIZE);                       <<01549>>01512000
  VALUE SIZE;                                                  <<01549>>01514000
  INTEGER SIZE;                                                <<01549>>01516000
  OPTION UNCALLABLE,PRIVILEGED;                                <<01549>>01518000
  BEGIN                                                        <<01549>>01520000
          EQUATE                                               <<01549>>01522000
             MIN'FREE'SIZE = 3; << MIN. SIZE OF FREE ENTRY >>  <<01549>>01524000
          INTEGER                                              <<01549>>01526000
             P,                                                <<01549>>01528000
             NEXT,                                             <<01549>>01530000
             LEFTOVER,                                         <<01549>>01532000
             LINK = GET'BKPT'ENTRY;                            <<01549>>01534000
          LOGICAL                                              <<01549>>01536000
             SUCCESS;                                          <<01549>>01538000
          << >>                                                <<01549>>01540000
          GET'BKPT'ENTRY := 0;                                 <<01549>>01542000
                                                               <<01549>>01544000
          IF AVAIL <> 0 THEN                                   <<01549>>01546000
             BEGIN << THERE ARE FREE ENTRIES >>                <<01549>>01548000
             P := AVAIL; << P POINTS TO 1ST ENT. >>            <<01549>>01550000
             SUCCESS := FALSE;                                 <<01549>>01552000
             DO                                                <<01549>>01554000
                BEGIN                                          <<01549>>01556000
                << IF THE PHYSICAL ENTRY FOLLOWING P >>        <<01549>>01558000
                << IS FREE, COALESCE ENTRIES         >>        <<01549>>01560000
                NEXT := P + STOP(P).FREE'SIZE;                 <<01549>>01562000
                WHILE STOP(NEXT).BKPT'TAG = 1 DO               <<01549>>01564000
                   BEGIN                                       <<01549>>01566000
                   << COALESEC ENTRIES -- REMOVE NEXT  >>      <<01549>>01568000
                   << FROM LIST: FORW'LINK OF NEXT'S   >>      <<01549>>01570000
                   << PREDECESSOR GETS NEXT'S FORWLINK >>      <<01549>>01572000
                   STOP(STOP(NEXT+BKWLINK)+FORWLINK) :=        <<01549>>01574000
                      STOP(NEXT+FORWLINK);                     <<01549>>01576000
                   << BKWLINK OF NEXT'S SUCCESSOR GETS >>      <<01549>>01578000
                   << BKWLINK OF NEXT                  >>      <<01549>>01580000
                   STOP(STOP(NEXT+FORWLINK)+BKWLINK) :=        <<01549>>01582000
                      STOP(NEXT+BKWLINK);                      <<01549>>01584000
                   << MERGE ENTRIES P AND NEXT         >>      <<01549>>01586000
                   STOP(P).FREE'SIZE := STOP(NEXT).FREE'SIZE   <<01549>>01588000
                                        + STOP(P).FREE'SIZE;   <<01549>>01590000
                   << ZERO OUT NEXT'S LINKS >>                 <<01549>>01592000
                   STOP(NEXT) := STOP(NEXT+FORWLINK) :=        <<01549>>01594000
                      STOP(NEXT+BKWLINK) := 0;                 <<01549>>01596000
                   << HAVE WE COME FULL CIRCLE? >>             <<01549>>01598000
                   IF NEXT = AVAIL THEN AVAIL := P;            <<01549>>01600000
                   NEXT := P + STOP(P).FREE'SIZE;              <<01549>>01602000
                   END;                                        <<01549>>01604000
                                                               <<01549>>01606000
                IF STOP(P).FREE'SIZE >= SIZE THEN              <<01549>>01608000
                   SUCCESS := TRUE                             <<01549>>01610000
                ELSE P := STOP(P+FORWLINK);                    <<01549>>01612000
                END                                            <<01549>>01614000
             UNTIL SUCCESS OR P = AVAIL;                       <<01549>>01616000
             << IF P=AVAIL --> SEARCHED ENTIRE LIST >>         <<01549>>01618000
                                                               <<01549>>01620000
             IF SUCCESS THEN                                   <<01549>>01622000
                BEGIN                                          <<01549>>01624000
                << ADVANCE AVAIL -- SO THAT NEXT TIME >>       <<01549>>01626000
                << START AT NEW LOC WHEN SEARCH LIST  >>       <<01549>>01628000
                AVAIL := STOP(P+FORWLINK);                     <<01549>>01630000
                LEFTOVER := STOP(P).FREE'SIZE - SIZE;          <<01549>>01632000
                IF LEFTOVER < MIN'FREE'SIZE  THEN              <<01549>>01634000
                   BEGIN                                       <<01549>>01636000
                   << TAKE WHOLE ENTRY, DONT ALLOW FREE >>     <<01549>>01638000
                   << ENTRIES TO BECOME TOO SMALL.      >>     <<01549>>01640000
                   << ARE WE REMOVING THE LAST ENTRY?   >>     <<01549>>01642000
                   IF AVAIL = P THEN                           <<01549>>01644000
                      BEGIN                                    <<01549>>01646000
                      AVAIL := 0;                              <<01549>>01648000
                      GET'BKPT'ENTRY := P;                     <<01549>>01650000
                      END                                      <<01549>>01652000
                   ELSE                                        <<01549>>01654000
                      BEGIN << REMOVE FROM LIST >>             <<01549>>01656000
                      << FORWLINK OF P'S PREDECESSOR >>        <<01549>>01658000
                      << GETS P'S FORWLINK           >>        <<01549>>01660000
                      STOP(STOP(P+BKWLINK)+FORWLINK) :=        <<01549>>01662000
                         STOP(P+FORWLINK);                     <<01549>>01664000
                      << BKWARD LINK OF P'S SUCCESSOR >>       <<01549>>01666000
                      << GETS P'S BKWARD LINK         >>       <<01549>>01668000
                      STOP(STOP(P+FORWLINK)+BKWLINK) :=        <<01549>>01670000
                         STOP(P+BKWLINK);                      <<01549>>01672000
                      GET'BKPT'ENTRY := P;                     <<01549>>01674000
                      END                                      <<01549>>01676000
                   END                                         <<01549>>01678000
                ELSE                                           <<01549>>01680000
                    BEGIN << TAKE SPACE FROM END OF ENTRY >>   <<01549>>01682000
                    GET'BKPT'ENTRY := P + LEFTOVER;            <<01549>>01684000
                    STOP(P).FREE'SIZE := LEFTOVER;             <<01549>>01686000
                    STOP(LINK).BKPT'SIZE := SIZE;              <<01549>>01688000
                    END;                                       <<01549>>01690000
                                                               <<01549>>01692000
                STOP(LINK).BKPT'TAG := 0; << MARK AS IN USE >> <<01549>>01694000
                END; << SUCCESSFULL >>                         <<01549>>01696000
             END;                                              <<01549>>01698000
                                                               <<01549>>01700000
  END; << GET'BKPT'ENTRY >>                                    <<01549>>01702000
                                                                        01704000
          << >>                                                <<01549>>01706000
          << THIS PROCEDURE RETURNS THE INDEX OF A             ((MPEIV))01708000
             FREE USER BKPT'EXT INDEX.                         ((MPEIV))01710000
                                                               ((MPEIV))01712000
             RETURNS:                                          ((MPEIV))01714000
                0:    NO FREE ENTRIES IN TABLE                 ((MPEIV))01716000
                <>0:  INDEX OF FREE ENTRY                      ((MPEIV))01718000
                                                               ((MPEIV))01720000
             ASSUMES:                                          ((MPEIV))01722000
                      DB IS SET TO BREAK POINT TABLE.          ((MPEIV))01724000
                      ENTER PDISABLED.                         ((MPEIV))01726000
           >>                                                  <<01549>>01728000
           << >>                                               <<01549>>01730000
INTEGER PROCEDURE GET'BKPT'EXT'X;                              <<01549>>01732000
  OPTION PRIVILEGED,UNCALLABLE;                                <<01549>>01734000
  BEGIN                                                        <<01549>>01736000
           INTEGER I;                                          <<01549>>01738000
           << >>                                               <<01549>>01740000
           GET'BKPT'EXT'X := 0;                                <<01549>>01742000
           I := PROC'CNT + 1;  << FIRST USER INDEX >>          <<01549>>01744000
           WHILE (I < STOP) AND (STOP(I) <> 0) DO I := I+1;    <<01549>>01746000
           IF I < STOP THEN                                    <<01549>>01748000
              BEGIN                                            <<01549>>01750000
              GET'BKPT'EXT'X := I;                             <<01549>>01752000
              << INCREMENT # USED USER ENTRIES >>              <<01549>>01754000
              STOP(PROC'CNT) := STOP(PROC'CNT) + 1;            <<01549>>01756000
              END;                                             <<01549>>01758000
  END;                                                         <<01549>>01760000
                                                               <<01549>>01762000
          << THIS PROCEDURE RETURNS THE INDEX TO THE           ((MPEIV))01764000
             FREE BKPT'EXT LIST.                               ((MPEIV))01766000
                                                               ((MPEIV))01768000
             PARAMETERS:                                       ((MPEIV))01770000
                INDEX:  INDEX OF ENTRY BEING FREED             ((MPEIV))01772000
                                                               ((MPEIV))01774000
             ASSUMES:                                          ((MPEIV))01776000
                        DB IS SET TO BREAK POINT TABLE.        ((MPEIV))01778000
                        ENTER PDISABLED.                       ((MPEIV))01780000
           >>                                                  <<01549>>01782000
           << >>                                               <<01549>>01784000
PROCEDURE FREE'BKPT'EXT'X (INDEX);                             <<01549>>01786000
  VALUE INDEX;                                                 <<01549>>01788000
  INTEGER INDEX;                                               <<01549>>01790000
  OPTION UNCALLABLE,PRIVILEGED;                                <<01549>>01792000
  BEGIN                                                        <<01549>>01794000
           << >>                                               <<01549>>01796000
           STOP(INDEX) := 0;  << MARK AVAILABLE >>             <<01549>>01798000
           STOP(PROC'CNT) := STOP(PROC'CNT) - 1;               <<01549>>01800000
  END;                                                         <<01549>>01802000
          << >>                                                         01804000
$PAGE "          BREAKPOINT ENTRY HANDLING PROCEDURES"         <<01549>>01806000
          << >>                                                <<01549>>01808000
          <<CHECK EQUIV OF P LOCATIONS>>                                01810000
          << >>                                                         01812000
LOGICAL PROCEDURE TESTPSTOP(LINK,PLOC,FLAG);                            01814000
  VALUE   LINK,PLOC,FLAG;                                               01816000
  INTEGER LINK,PLOC,FLAG;                                               01818000
  OPTION  UNCALLABLE,PRIVILEGED,INTERNAL;                               01820000
  BEGIN                                                                 01822000
          << >>                                                         01824000
          TOS_STOP(LINK);                                               01826000
          IF STOP(X_X+2)=PLOC THEN GOTO L;                              01828000
          TOS_FLAG;                                                     01830000
          TOS.(14:1)_0;                                                 01832000
          IF = THEN GOTO LL;                                            01834000
          FLAG_TOS;                                                     01836000
          ASSEMBLE(TBC 4);                                              01838000
          IF = THEN                                                     01840000
               BEGIN TOS_STOP(X);                                       01842000
                     DUPLICATE;                                         01844000
               END ELSE                                                 01846000
               BEGIN ASSEMBLE(TBC 5);                                   01848000
                     IF <> THEN TOS_0                                   01850000
                           ELSE TOS_1;                                  01852000
                     TOS_TOS+STOP(X);                                   01854000
                     ASSEMBLE(DUP,DECA);                                01856000
               END;                                                     01858000
          COMMENT:                                             <<00873>>01860000
             AT S-1 IS THE UPPER LIMIT OF THE BREAKPT          <<00873>>01862000
             (IE. P+1 FOR DBL ENTRY, P FOR SINGLE).  S-0       <<00873>>01864000
             CONTAINS THE LOWER LIMIT (P).  THESE LIMITS       <<01040>>01866000
             MUST BE ADJUSTED FOR 2 WORD INSTR.;               <<01040>>01868000
          IF STOP(LINK).(6:1) = 1 THEN                         <<01040>>01870000
             BEGIN << IF STOP(X)=P THEN LOWER LIMIT OK >>      <<01040>>01872000
                   << BUT MUST INC UPPER LIMIT ELSE    >>      <<01040>>01874000
                   << STOP(X)=P+2 AND MUST DEC LOWER   >>      <<01040>>01876000
                   << LIMIT                            >>      <<01040>>01878000
             IF STOP(X).(5:1) = 0 THEN ASSEMBLE(INCB)          <<01040>>01880000
             ELSE ASSEMBLE(DECA);                              <<01040>>01882000
             END;                                                       01884000
          TOS_PLOC;                                                     01886000
          << GET UPPER LIMIT OF NEW BRKPNT             >>      <<00873>>01888000
          << ADD ONE FOR DBL ENTRY AND/OR 2 WORD INSTR >>      <<00873>>01890000
          TOS_PLOC+FLAG.(15:1)+FLAG.(13:1);                    <<00873>>01892000
          COMMENT:                                             <<00873>>01894000
             IF THE UPPER LIMIT OF THE NEW BRKPNT IS           <<00873>>01896000
             LESS THAN THE LOWER LIMIT OF THE OLD, OR          <<00873>>01898000
             THE LOWER OF THE NEW IS GREATER THEN THE          <<00873>>01900000
             UPPER OF THE OLD THEN NO CONFLICT;                <<00873>>01902000
          ASSEMBLE(CAB,CMP);                                            01904000
          IF < THEN GOTO LL;                                            01906000
          ASSEMBLE(XCH,CMP);                                            01908000
          IF > THEN GOTO LL;                                            01910000
  L:      TESTPSTOP_1;                                                  01912000
  LL:                                                                   01914000
  END;                                                                  01916000
                                                                        01918000
                                                                        01920000
          << >>                                                         01922000
          <<SEARCH COMPLETE B.P. TABLE FOR ENTRY                        01924000
               FLAG  =0 SEARCH TO ENTRY                                 01926000
                     =1  SEARCH TO ENTRY+INSTR                          01928000
                     =2 VALIDATE NEW(+S VS D)                           01930000
                     =3 VALIDATE NEW(+D VS D)                           01932000
               SEARCHSTOP<>0 ENTRY LINK                                 01934000
                          =0 FAILURE                                    01936000
            ASSUME:  DB=BREAKPOINT TABLE                       ((MPEIV))01938000
                     PSEUDODISABLE MODE          >>                     01940000
          << >>                                                         01942000
INTEGER PROCEDURE SEARCHSTOP(LINK,CLABEL,PLOC,FLAG);                    01944000
  VALUE     LINK,CLABEL,PLOC,FLAG;                                      01946000
  INTEGER   LINK,CLABEL,PLOC,FLAG;                                      01948000
  OPTION  UNCALLABLE,PRIVILEGED,INTERNAL;                               01950000
  BEGIN                                                                 01952000
          INTEGER NUM;                                                  01954000
          << >>                                                         01956000
          NUM_BKPT'DST'SIZE;                                   <<01549>>01958000
          WHILE LINK < NUM DO                                  <<01549>>01960000
               BEGIN IF STOP(LINK)<0 THEN GOTO L;                       01962000
                     IF STOP(X_X+1) <> CLABEL THEN GOTO L;              01964000
                     IF TESTPSTOP(LINK,PLOC,FLAG) THEN                  01966000
                           BEGIN IF FLAG=1 AND STOP(LINK)               01968000
                                       .(3:1)=0 THEN GOTO L;            01970000
                                 SEARCHSTOP_LINK;                       01972000
                                 RETURN;                                01974000
                           END;                                         01976000
  L:                 LINK_LINK+(IF STOP(LINK)<0 THEN           <<01549>>01978000
                                   STOP(LINK).FREE'SIZE        <<01549>>01980000
                                ELSE STOP(LINK).BKPT'SIZE);    <<01549>>01982000
               END;                                                     01984000
  END;                                                                  01986000
                                                                        01988000
                                                                        01990000
          << >>                                                         01992000
          <<SET/RESET BRPT AND SEARCH FOR INSTR                         01994000
               FLAG  =0 SET B.P. AND GET INSTR                          01996000
                     =1 RESET B.P.                                      01998000
            ASSUME:  DB=BREAKPOINT TABLE                       ((MPEIV))02000000
                     PSEUDODISABLE MODE          >>                     02002000
          << >>                                                         02004000
PROCEDURE MANAGESTOP(LINK,FLAG,PINX);                                   02006000
  VALUE     LINK,FLAG,PINX;                                             02008000
  INTEGER   LINK,FLAG,PINX;                                             02010000
  OPTION  INTERNAL;                                                     02012000
  BEGIN                                                                 02014000
          INTEGER  LOC,SINSTR,INDEX;                           <<00821>>02016000
          << >>                                                         02018000
          IF STOP(LINK)<0 THEN GOTO FIN;                                02020000
          LOC _ SEARCHSTOP(IND'ENT1,STOP(LINK+CLABELOFFSET),   <<01549>>02022000
                           STOP(LINK+PLOCOFFSET),1);           <<01549>>02024000
          TOS _ CONVSEGIDTOSTINX (STOP(X_X-1));                <<01610>>02026000
          TOS _ DSTI'(INDEX:=TOS);       <<DESCRIPTOR>>        <<00821>>02028000
          COMMENT:                                             <<00821>>02030000
             IF THE SEGMENT IS PRESENT OR ON THE OVERLAY       <<00821>>02032000
             SELECTION QUEUE THEN UPDATE THE SEGMENT           <<01549>>02034000
             ELSE WE ARE THROUGH.;                             <<01549>>02036000
          IF < AND DSTI'(INDEX+1).ROC=0                        <<01549>>02038000
             THEN IF LOC=0 THEN GOTO FIN ELSE GOTO COPY;       <<00821>>02040000
          TOS:=DSTI'(INDEX+2);                                 <<01549>>02042000
          TOS _ DSTI'(INDEX+3);          <<ADR IN BANK>>       <<00821>>02044000
          TOS _ TOS+STOP(LINK+2);      <<BASE+PB-RELATIVE LOC>>         02046000
          IF LOGICAL(FLAG) THEN                                         02048000
               BEGIN IF LOC=0 THEN                                      02050000
                       BEGIN SUDDENDEATH(199);                          02052000
                             GOTO FIN;                                  02054000
                       END;                                             02056000
                     TOS_STOP(LOC+3);                                   02058000
                     SMEM;             <<STORE INSTR>>                  02060000
                     GOTO COPY;                                         02062000
               END ELSE                                                 02064000
               BEGIN LMEM;                                              02066000
                     SINSTR _ TOS;     <<SAVE INSTR>>                   02068000
                     TOS _ BRPT;                                        02070000
                     SMEM;             <<STORE BREAK POINT>>            02072000
                     IF LOC<>0 THEN GOTO COPY;                          02074000
                     TOS _ SINSTR; DUPLICATE;                           02076000
                     IF TOS <> BRPT THEN GOTO SAVE                      02078000
                                  ELSE GOTO FIN;                        02080000
               END;                                                     02082000
  COPY:   TOS_STOP(LOC+3);                                              02084000
  SAVE:   STOP(LINK+3)_TOS;                                             02086000
          STOP(LINK).(3:1)_1;                                           02088000
  FIN:                                                                  02090000
  END;                                                                  02092000
                                                                        02094000
                                                                        02096000
          << >>                                                         02098000
          <<SCAN LINKED SET OF B.P. FOR ENTRY                           02100000
               FLAG  =0 SEARCH TO ENTRY                                 02102000
                     =2 VAL NEW(S VS D)                                 02104000
                     =3 VAL NEW(+D VS D)                                02106000
               SCANSTOP<>0 ENTRY LINK                                   02108000
                        =0 FAILURE                                      02110000
            ASSUME:  DB=BREAKPOINT TABLE                       ((MPEIV))02112000
                     PSEUDODISABLE MODE          >>                     02114000
          << >>                                                         02116000
INTEGER PROCEDURE SCANSTOP(LINK,CLABEL,PLOC,FLAG);                      02118000
  VALUE   LINK,CLABEL,PLOC,FLAG;                                        02120000
  INTEGER LINK,CLABEL,PLOC,FLAG;                                        02122000
  OPTION  UNCALLABLE,PRIVILEGED,INTERNAL;                               02124000
  BEGIN                                                                 02126000
          INTEGER NEXTLINK;                                    <<01549>>02128000
          << >>                                                         02130000
          WHILE LINK <> 0 DO                                   <<01549>>02132000
             BEGIN                                             <<01549>>02134000
             NEXTLINK := STOP(LINK+LINKOFFSET);                <<01549>>02136000
             IF STOP(LINK+CLABELOFFSET) = CLABEL AND           <<01549>>02138000
                TESTPSTOP(LINK,PLOC,FLAG)                      <<01549>>02140000
             THEN                                              <<01549>>02142000
                BEGIN                                          <<01549>>02144000
                SCANSTOP := LINK;                              <<01549>>02146000
                LINK := 0;                                     <<01549>>02148000
                END                                            <<01549>>02150000
             ELSE LINK := NEXTLINK;                            <<01549>>02152000
             END;                                              <<01549>>02154000
  END;                                                                  02156000
                                                                        02158000
                                                                        02160000
          << >>                                                         02162000
COMMENT:                                                       <<01007>>02164000
  Scan BP Linked list for Nth entry                            <<01007>>02166000
  Returns first 3 words of Breakpoint entry                    <<01007>>02168000
  in X-reg and NTHSTOP                                         <<01007>>02170000
  X-REG      => BPT-Entry(0)                                   <<01007>>02172000
  NTHSTOP(0) => BPT-Entry(1)                                   <<01007>>02174000
  NTHSTOP(1) => BPT-Entry(2)                                   <<01007>>02176000
  If there are not N breakpoints assigned                      <<01007>>02178000
  to this process, X will be zero, and the                     <<01007>>02180000
  NTHSTOP values will be unchanged.  This                      <<01007>>02182000
  usually implies that they will be zero.                      <<01007>>02184000
  ;                                                            <<01007>>02186000
DOUBLE PROCEDURE NTHSTOP(PROC,N);                                       02188000
  VALUE     PROC,N;                                                     02190000
  INTEGER   PROC,N;                                                     02192000
  OPTION  UNCALLABLE,PRIVILEGED,INTERNAL;                               02194000
  BEGIN                                                                 02196000
          INTEGER I;                                                    02198000
          INTEGER XREG=Q-3;                                             02200000
          << >>                                                         02202000
          PDISABLE;                                                     02204000
          IF STOPB=0 THEN GOTO FIN;                                     02206000
          TOS:=IF PROC=0               <<TOS:=Head of BP list>><<01007>>02208000
               THEN STOP(2)&LSL(2)                             <<00873>>02210000
               ELSE (PCBI'((PROC.(8:8))*PCBSIZE+7).(8:8))&LSL(2);       02212000
          XREG_0;                                                       02214000
          I_0;                                                          02216000
          WHILE (X:=TOS)<>0 DO      <<Get forward link into X>><<01007>>02218000
               BEGIN TOS:=STOP(X);      <<Get word-0 of entry>><<01007>>02220000
                     IF (I:=I+1)=N THEN     <<Found Nth entry>><<01007>>02222000
                       BEGIN XREG_TOS;                                  02224000
                             TOS_STOP(X_X+1);                           02226000
                             TOS_STOP(X_X+1);                           02228000
                             NTHSTOP_TOS;                               02230000
                             GOTO FIN;                                  02232000
                       END;                                             02234000
  L:                 TOS_TOS.(8:8)&LSL(2);                     <<00873>>02236000
                                     <<Save only forward link>><<01007>>02238000
               END;                                                     02240000
  FIN:    PENABLE;                                                      02242000
  END;                                                                  02244000
                                                                        02246000
                                                                        02248000
          << >>                                                         02250000
          <<TEST VALIDITY OF ILLEGAL INSTR TRAP                         02252000
               CCE   = VALID                                            02254000
               CCG   =OTHER PROCESS(RESET IT)                           02256000
               CCL   =ILLEGAL                                           02258000
            IF CCE THEN                                                 02260000
               TESTSTOP   =CONTROL FLAGS OF ENTRY      >>      <<01549>>02262000
          << >>                                                         02264000
INTEGER PROCEDURE TESTSTOP(CLABEL,PLOC,PINX);                           02266000
  VALUE     CLABEL,PLOC,PINX;                                           02268000
  INTEGER   CLABEL,PLOC,PINX;                                           02270000
  OPTION    UNCALLABLE,PRIVILEGED;                                      02272000
  BEGIN                                                                 02274000
          INTEGER DB'STATE;  << DB STATE UPON ENTRY >>         <<01549>>02276000
          LOGICAL XDS;                                         <<01549>>02278000
          DOUBLE ORIG'DB;                                      <<01549>>02280000
          << >>                                                         02282000
          PDISABLE;                                                     02284000
          IF NOT BKPT'TAB'LOCKED THEN                          <<01549>>02286000
             BEGIN << TABLE EMPTY >>                           <<01549>>02288000
             STATUS.CCFLD := CCL;                              <<01549>>02290000
             PENABLE;                                          <<01549>>02292000
             RETURN;                                           <<01549>>02294000
             END;                                              <<01549>>02296000
          TOS_0;                                                        02298000
          << SET DB TO BREAK POINT TABLE >>                    <<01549>>02300000
          SET'DB'DSEG (0,0,0D,DEBUGDST);                       <<01549>>02302000
          << ORIGNAL DB STATE LEFT ON TOS >>                   <<01549>>02304000
          ORIG'DB := TOS;                                      <<01549>>02306000
          XDS := TOS;                                          <<01549>>02308000
          DB'STATE := TOS;                                     <<01549>>02310000
          << GET PCB BREAKPOINT EXT. INDEX >>                  <<01549>>02312000
          X := PCBI'(PINX+PCB'BKPT'WD).PCB'BKPT'BITS;          <<01549>>02314000
          IF X <> 0 THEN                                       <<01549>>02316000
             BEGIN << PROCESS HAS BREAKPOINTS >>               <<01549>>02318000
             X := SCANSTOP(STOP(X),CLABEL,PLOC,0);             <<01549>>02320000
             IF <> THEN GOTO OK; << FOUND IT >>                <<01549>>02322000
             END;                                              <<01549>>02324000
          << SEARCH SYSTEM LIST >>                             <<01549>>02326000
          X _ SCANSTOP(STOP(SYS'BKPT'EXT'X),CLABEL,PLOC,0);    <<01549>>02328000
          IF <> THEN GOTO OK;                                           02330000
          << NOW SEARCH ENTIRE TABLE >>                        <<01549>>02332000
          X _ SEARCHSTOP(IND'ENT1,CLABEL,PLOC,0);              <<01549>>02334000
          IF = THEN GOTO ERR;                                           02336000
          << REPLACE BREAKPOINT WITH INSTRUCTION >>            <<01549>>02338000
          MANAGESTOP(X,1,PINX);                                         02340000
          TOS_CCG;                                                      02342000
          GOTO FIN;                                                     02344000
  OK:     TESTSTOP_STOP(X);                                    <<01549>>02346000
          TOS_CCE;                                                      02348000
          GOTO FIN;                                                     02350000
  ERR:    TOS_CCL;                                                      02352000
  FIN:    STATUS.CCFLD _ TOS;                                           02354000
          EXCHANGEDB (0);                                      <<01549>>02356000
          SET'DB (DB'STATE,XDS,ORIG'DB);                       <<01549>>02358000
          PENABLE;                                                      02360000
  END;                                                                  02362000
                                                               <<01069>>02364000
                                                               <<01069>>02366000
          << >>                                                <<01069>>02368000
          <<TEST WHETHER BREAK PNT IS THE                               02370000
            REQUESTED TRAP TYPE                                         02372000
                                                                        02374000
              LINK     INDEX OF ENTRY                                   02376000
              TRAP     = 0 --> ANY TRAP                                 02378000
                       = 1 --> USER TRAP ONLY                           02380000
                       = 2 --> DEBUG TRAP ONLY                          02382000
                       = @DEBUG --> NON-USER TRAP                       02384000
                       = @LABEL --> USER TRAP THIS                      02386000
                                    LABEL ONLY                          02388000
              RETURNS:                                                  02390000
                       TRUE:  IF MATCH                                  02392000
                       FALSE: NO MATCH                                  02394000
          >>                                                   <<01069>>02396000
          << >>                                                <<01069>>02398000
LOGICAL PROCEDURE TRAP'MATCH(LINK,TRAP);                       <<01069>>02400000
  VALUE     LINK,TRAP;                                         <<01069>>02402000
  INTEGER   LINK,TRAP;                                         <<01069>>02404000
  OPTION    UNCALLABLE,PRIVILEGED;                             <<01069>>02406000
  BEGIN                                                        <<01069>>02408000
          LOGICAL L'TRAP = TRAP;                               <<01069>>02410000
          DEFINE                                               <<01069>>02412000
             ANY'TRAP      = 0 #,                              <<01069>>02414000
             ANY'USERTRAP  = 1 #,                              <<01069>>02416000
             ANY'DEBUGTRAP = 2 #;                                       02418000
          << >>                                                <<01069>>02420000
          TRAP'MATCH := FALSE;                                 <<01069>>02422000
                                                               <<01069>>02424000
          IF TRAP = ANY'TRAP THEN TRAP'MATCH := TRUE           <<01069>>02426000
          ELSE IF TRAP=@DEBUG OR TRAP=ANY'DEBUGTRAP THEN       <<01069>>02428000
             BEGIN                                             <<01549>>02430000
             IF STOP(LINK).BKPT'USERLBL = 0 THEN               <<01549>>02432000
                TRAP'MATCH := TRUE;                            <<01549>>02434000
             END                                               <<01069>>02436000
          ELSE                                                 <<01069>>02438000
             BEGIN << CHECK FOR USER TRAP >>                   <<01069>>02440000
             IF STOP(LINK).BKPT'USERLBL = 1 AND                <<01549>>02442000
                (TRAP=ANY'USERTRAP OR                          <<01069>>02444000
                 L'TRAP=(LOGICAL(STOP(LINK+USERLBLOFFSET))     <<01549>>02446000
                         LOR %100000))                         <<01549>>02448000
             THEN TRAP'MATCH := TRUE;                          <<01069>>02450000
             END;                                              <<01069>>02452000
  END;                                                         <<01069>>02454000
                                                               <<01549>>02456000
          << >>                                                <<01549>>02458000
          << THIS ROUTINE CHECKS WHETHER THE ADDRESS IS WITHIN ((MPEIV))02460000
             'BOUNDS' OF THE SPECIFIED SEG/BANK. THE 'BOUNDS' FOR       02462000
             A STAK ARE DEPENDENT ON WHETHER OR NOT PRIV IS TRUE.       02464000
                                                               ((MPEIV))02466000
             PARAMETERS:                                       ((MPEIV))02468000
                BASETYPE:  DA'SEG                              ((MPEIV))02470000
                           STAK'SEG                            ((MPEIV))02472000
                           ABS'ADDR (BANK)                     ((MPEIV))02474000
                BASE:      SEG NUMBER (DA'SEG/STAK'SEG)        ((MPEIV))02476000
                           BANK NUMBER (BANK)                  ((MPEIV))02478000
                OFFSET:    DB REL. OFFSET (DA'SEG/STAK'SEG)    ((MPEIV))02480000
                           BANK ADDRESS                        ((MPEIV))02482000
                REGINFO:   Q-REL. OFFSET OF CALLER TO          ((MPEIV))02484000
                           DEBUGS ARRAY 'REG'                  ((MPEIV))02486000
                PRIV:      ASSUME PRIV CAP. WHEN VALIDATING    ((MPEIV))02488000
                                                               ((MPEIV))02490000
             RETURNS:                                          ((MPEIV))02492000
                TRUE:      OK                                  ((MPEIV))02494000
                FALSE:     NOT VALID                           ((MPEIV))02496000
          >>                                                   <<01549>>02498000
          << >>                                                <<01549>>02500000
LOGICAL PROCEDURE CHECKADDRESS(BASETYPE,BASE,OFFSET,PRIV,      <<01549>>02502000
                               REGINFO);                       <<01549>>02504000
  VALUE   BASETYPE,BASE,OFFSET,REGINFO,PRIV;                   <<01549>>02506000
  INTEGER BASETYPE,BASE,OFFSET,REGINFO;                        <<01549>>02508000
  LOGICAL PRIV;                                                <<01549>>02510000
  OPTION  UNCALLABLE,PRIVILEGED;                               <<01549>>02512000
  BEGIN                                                        <<01549>>02514000
          INTEGER                                              <<01549>>02516000
             UPBOUND;                                          <<01549>>02518000
          << >>                                                <<01549>>02520000
          << GET Q-REL LOC OF REGINFO >>                       <<01549>>02522000
          REGINFO := REGINFO - DELTAQ;                         <<01549>>02524000
                                                               <<01549>>02526000
          IF BASETYPE = STAK'SEG AND PRIV THEN                 <<01549>>02528000
             BEGIN                                             <<01549>>02530000
             << PRIV --> RANGE = ENTIRE SEG >>                 <<01549>>02532000
             << CHANGE OFFSET TO 0 RELATIVE >>                 <<01549>>02534000
             << OFFSET.  GET PCBX SIZE      >>                 <<01549>>02536000
             TOS := DSTI'(BASE*4+2);                           <<01549>>02538000
             TOS := DSTI'(X+1)+1;                              <<01549>>02540000
             LMEM;                                             <<01549>>02542000
             OFFSET := OFFSET + TOS;                           <<01549>>02544000
             BASETYPE := DA'SEG;                               <<01549>>02546000
             END;                                              <<01549>>02548000
                                                               <<01549>>02550000
         CHECKADDRESS := FALSE;                                <<01549>>02552000
         IF BASETYPE = STAK'SEG THEN                           <<01549>>02554000
            BEGIN  << MUST BE BETWEEN DL/DS >>                 <<01549>>02556000
            IF AQ0(REGINFO+REGDL) <= OFFSET <=                 <<01549>>02558000
               AQ0(REGINFO+REGS)                               <<01549>>02560000
            THEN CHECKADDRESS := TRUE;                         <<01549>>02562000
            END                                                <<01549>>02564000
         ELSE IF BASETYPE = DA'SEG THEN                        <<01549>>02566000
            BEGIN  << DATA SEG SIZE <= 32 K >>                 <<01549>>02568000
            UPBOUND := (DSTI'(BASE*4).DST'LENFLD) & LSL(2) - 1;<<01549>>02570000
            IF  0 <= OFFSET <= UPBOUND                         <<01549>>02572000
            THEN CHECKADDRESS := TRUE;                         <<01549>>02574000
            END                                                <<01549>>02576000
         ELSE                                                  <<01549>>02578000
            BEGIN  << BANK SIZE <= 64 K >>                     <<01549>>02580000
            << LAST BANK MAY BE 1/2 BANK >>                    <<01549>>02582000
            IF BASE <> LASTBANK OR                             <<01549>>02584000
               LOGICAL(OFFSET) <= LASTADDR                     <<01549>>02586000
            THEN CHECKADDRESS := TRUE;                         <<01549>>02588000
            END;                                               <<01549>>02590000
                                                               <<01549>>02592000
                                                               <<01549>>02594000
  END;                                                         <<01549>>02596000
          << >>                                                <<01549>>02598000
          << THIS ROUTINE TRANSLATE THE OPERAND AT             ((MPEIV))02600000
             STOP(LINK) TO A BASE AND OFFSET.                  ((MPEIV))02602000
                                                               ((MPEIV))02604000
             PARAMETERS:                                       ((MPEIV))02606000
                LINK:     INDEX OF OPERAND IN BKPT TAB         ((MPEIV))02608000
                REGINFO:  Q-REL OFFSET OF CALLER TO            ((MPEIV))02610000
                          DEBUGS ARRAY 'REG'                   ((MPEIV))02612000
                                                               ((MPEIV))02614000
             RETURNS:     0N TOS-- S3/S0 ARE AS FOLLOW:        ((MPEIV))02616000
                TYPE:     STAK'SEG                             ((MPEIV))02618000
                (S3)      DA'SEG                               ((MPEIV))02620000
                          ABS'ADDR                             ((MPEIV))02622000
                                                               ((MPEIV))02624000
                BASE:     SEG NUMBER (DA'SEG/STAK'SEG)         ((MPEIV))02626000
                (S2)      BANK NUMBER  (ABS'ADDR)              ((MPEIV))02628000
                                                               ((MPEIV))02630000
                BASEADDR: DB'S OFFSET TO BASE STAK (STAK'SEG/DA'SEG)    02632000
                (S1)      OFFSET FROM BANK BASE (ABS'ADDR)     ((MPEIV))02634000
                                                               ((MPEIV))02636000
                OFFSET:   DB-REL OFFSET FOR DA'SEG/STAK'SEG    ((MPEIV))02638000
                (S0)      BASE REL. ADDRESS FOR ABS'ADDR       ((MPEIV))02640000
                                                               ((MPEIV))02642000
             ASSUMES:                                          ((MPEIV))02644000
                          DB AT BREAKPOINT TABLE               ((MPEIV))02646000
                          PDISABLED                            ((MPEIV))02648000
                                                               ((MPEIV))02650000
          >>                                                   <<01549>>02652000
          << >>                                                <<01549>>02654000
PROCEDURE TRANSLATE (TYPE,BASE,BASEADDR,OFFSET,LINK,REGINFO);  <<01549>>02656000
  VALUE   TYPE,BASE,BASEADDR,OFFSET,LINK,REGINFO;              <<01549>>02658000
  INTEGER TYPE,BASE,BASEADDR,OFFSET,LINK,REGINFO;              <<01549>>02660000
  OPTION  PRIVILEGED, UNCALLABLE;                              <<01549>>02662000
  BEGIN                                                        <<01549>>02664000
          EQUATE                                               <<01549>>02666000
             NUMPARM = 2;  << LINK & REGINFO >>                <<01549>>02668000
          INTEGER                                              <<01549>>02670000
             REGTYPE;                                          <<01549>>02672000
          << >>                                                <<01549>>02674000
          << GET Q-REL LOC OF REGINFO >>                       <<01549>>02676000
          REGINFO := REGINFO-DELTAQ;                           <<01549>>02678000
          OFFSET := STOP(LINK+1);                              <<01549>>02680000
          REGTYPE := STOP(LINK).BKPT'REG;                      <<01549>>02682000
                                                               <<01549>>02684000
          IF REGTYPE = REGDX AND AQ0(REGINFO+REGDX) = 0        <<01549>>02686000
          THEN REGTYPE := REGDB;  << DB AT STAK >>             <<01549>>02688000
                                                               <<01549>>02690000
          IF REGTYPE = REGDX THEN                              <<01549>>02692000
             BEGIN  << ABSOLUTE DB >>                          <<01549>>02694000
             IF AQ0(REGINFO+REGDX) = 1 THEN                    <<01549>>02696000
                BEGIN << XCHG DB >>                            <<01549>>02698000
                TYPE := DA'SEG;                                <<01549>>02700000
                BASE := AQ0(REGINFO+REGDBX);                   <<01549>>02702000
                BASEADDR := 0;                                 <<01549>>02704000
                END                                            <<01549>>02706000
             ELSE                                              <<01549>>02708000
                BEGIN << SET DB >>                             <<01549>>02710000
                TYPE := ABS'ADDR;                              <<01549>>02712000
                BASE := AQ0(REGINFO+REGBNK);                   <<01549>>02714000
                BASEADDR := AQ0(REGINFO+REGDBV);               <<01549>>02716000
                END                                            <<01549>>02718000
             END                                               <<01549>>02720000
          ELSE IF REGTYPE = REGEA OR REGTYPE =REGA THEN        <<01549>>02722000
             BEGIN                                             <<01549>>02724000
             TYPE := ABS'ADDR;                                 <<01549>>02726000
             BASE := STOP(LINK).BKPT'BASE;                     <<01549>>02728000
             BASEADDR := 0;                                    <<01549>>02730000
             END                                               <<01549>>02732000
          ELSE IF REGTYPE = REGSY THEN                         <<01549>>02734000
             BEGIN                                             <<01549>>02736000
             TYPE := ABS'ADDR;                                 <<01549>>02738000
             BASE := STOP(LINK).BKPT'BASE;                     <<01549>>02740000
             BASEADDR := %1000;                                <<01549>>02742000
             END                                               <<01549>>02744000
          ELSE IF REGTYPE = REGDA THEN                         <<01549>>02746000
             BEGIN                                             <<01549>>02748000
             TYPE := DA'SEG;                                   <<01549>>02750000
             BASE := STOP(LINK).BKPT'BASE;                     <<01549>>02752000
             BASEADDR := 0;                                    <<01549>>02754000
             END                                               <<01549>>02756000
          ELSE IF REGDB <= REGTYPE <= REGS THEN                <<01549>>02758000
             BEGIN                                             <<01549>>02760000
             TYPE := STAK'SEG;                                 <<01549>>02762000
             BASE := AQ0(REGINFO+REGDB);                       <<01549>>02764000
             << GET DB REL. OFFSET TO BASE OF STAK >>          <<01549>>02766000
             TOS := DSTI'(BASE&LSL(2)+2);                      <<01549>>02768000
             TOS := DSTI'(X+1)+1;                              <<01549>>02770000
             LMEM; << GET DB-A >>                              <<01549>>02772000
             BASEADDR := TOS; DDEL;                            <<01549>>02774000
             << CHANGE REG OFFSET TO DB REL OFFSET >>          <<01549>>02776000
             IF REGTYPE <> REGDB THEN                          <<01549>>02778000
                OFFSET := OFFSET+AQ0(REGINFO+REGTYPE);         <<01549>>02780000
             END;                                              <<01549>>02782000
                                                               <<01549>>02784000
             << LEAVE TYPE, BASE, BASEADDR, OFFSET ON STAK >>  <<01549>>02786000
                                                               <<01549>>02788000
          RETURN NUMPARM;                                      <<01549>>02790000
  END;                                                         <<01549>>02792000
          << >>                                                <<01549>>02794000
          << THIS PROCEDURE RETRIEVES THE OPERAND WHOSE        ((MPEIV))02796000
             ADDRESS OR VALUE IS AT STOP(LINK).                ((MPEIV))02798000
                                                               ((MPEIV))02800000
             PARAMETERS:                                       ((MPEIV))02802000
                LINK:     INDEX OF OPERAND                     ((MPEIV))02804000
                INFO:     DESCRIPTOR OF OPERAND:               ((MPEIV))02806000
                             (15:1) = 0  CONSTANT              ((MPEIV))02808000
                                      1  ADDRESS               ((MPEIV))02810000
                             (14:1) = 0  NO INDIRECTION        ((MPEIV))02812000
                                      1  IND. ADDRESS          ((MPEIV))02814000
                PRIV:     ASSUME PRIV CAP WHEN GETTING OP.     ((MPEIV))02816000
                REGINFO:  Q-REL OFFSET OF CALLER TO DEBUGS     ((MPEIV))02818000
                          ARRAY 'REG'                          ((MPEIV))02820000
                                                               ((MPEIV))02822000
             RETURNS      ON TOS -- S1/S0                      ((MPEIV))02824000
                RESULT:   GOT'OPERAND                          ((MPEIV))02826000
                (S1)      BOUNDSV   (BOUNDS VIOLATION)         ((MPEIV))02828000
                          NOT'INCORE                           ((MPEIV))02830000
                OPERAND:  THE OPERAND                          ((MPEIV))02832000
                (S0)                                           ((MPEIV))02834000
                                                               ((MPEIV))02836000
             ASSUMES:                                          ((MPEIV))02838000
                          DB AT BREAKPOINT TABLE               ((MPEIV))02840000
                          PDISABLED                            ((MPEIV))02842000
          >>                                                   <<01549>>02844000
          << >>                                                <<01549>>02846000
PROCEDURE GETOPERAND (RESULT,OPERAND,LINK,INFO,PRIV,REGINFO);  <<01549>>02848000
  VALUE   RESULT,OPERAND,LINK,INFO,PRIV,REGINFO;               <<01549>>02850000
  INTEGER RESULT,OPERAND,LINK,INFO,REGINFO;                    <<01549>>02852000
  LOGICAL PRIV;                                                <<01549>>02854000
  OPTION  PRIVILEGED,UNCALLABLE;                               <<01549>>02856000
  BEGIN                                                        <<01549>>02858000
          EQUATE                                               <<01549>>02860000
             NUMPARM   = 4,<< LEAVE RESULT & OPERAND ON STAK >><<01549>>02862000
             ADDR'OPER = 1;                                    <<01549>>02864000
          DEFINE                                               <<01549>>02866000
             IND'BITS  = (14:1)#,                              <<01549>>02868000
             OPTYPE    = (15:1)#;                              <<01549>>02870000
          INTEGER                                              <<01549>>02872000
             TYPE,                                             <<01549>>02874000
             BASE,                                             <<01549>>02876000
             BASEADDR,                                         <<01549>>02878000
             OFFSET,                                           <<01549>>02880000
             INDIRECT;                                         <<01549>>02882000
          << >>                                                <<01549>>02884000
          << GET Q-REL ADDRESS OF REGINFO >>                   <<01549>>02886000
          REGINFO := REGINFO - DELTAQ;                         <<01549>>02888000
          INDIRECT := INFO.IND'BITS;                           <<01549>>02890000
                                                               <<01549>>02892000
          IF INFO.OPTYPE = ADDR'OPER THEN                      <<01549>>02894000
             BEGIN                                             <<01549>>02896000
             TRANSLATE (0,0,0,0,LINK,REGINFO);                 <<01549>>02898000
             << SAVE RESULTS OF TRANSLATE >>                   <<01549>>02900000
             OFFSET := TOS;                                    <<01549>>02902000
             BASEADDR := TOS;                                  <<01549>>02904000
             BASE := TOS;                                      <<01549>>02906000
             TYPE := TOS;                                      <<01549>>02908000
                                                               <<01549>>02910000
             DO                                                <<01549>>02912000
                BEGIN << GO GET IT >>                          <<01549>>02914000
                IF NOT CHECKADDRESS (TYPE,BASE,OFFSET,         <<01549>>02916000
                                     PRIV,REGINFO) THEN        <<01549>>02918000
                   BEGIN                                       <<01549>>02920000
                   RESULT := BOUNDSV;                          <<01549>>02922000
                   RETURN NUMPARM;                             <<01549>>02924000
                   END                                         <<01549>>02926000
                ELSE IF TYPE = DA'SEG AND                      <<01549>>02928000
                        DSTI'(BASE*4) < 0 THEN                 <<01549>>02930000
                   BEGIN                                       <<01549>>02932000
                   RESULT := NOT'INCORE;                       <<01549>>02934000
                   RETURN NUMPARM;                             <<01549>>02936000
                   END                                         <<01549>>02938000
                ELSE                                           <<01549>>02940000
                   BEGIN                                       <<01549>>02942000
                   << EVERYTHING OK, GO GET IT. >>             <<01549>>02944000
                   << SET UP FOR 'LSEA'         >>             <<01549>>02946000
                   IF TYPE = DA'SEG OR TYPE = STAK'SEG THEN    <<01549>>02948000
                      BEGIN                                    <<01549>>02950000
                      TOS := DSTI'(BASE&LSL(2)+2);             <<01549>>02952000
                      TOS := DSTI'(X+1) + BASEADDR + OFFSET;   <<01549>>02954000
                      END                                      <<01549>>02956000
                   ELSE IF TYPE = ABS'ADDR THEN                <<01549>>02958000
                      BEGIN                                    <<01549>>02960000
                      TOS := BASE;                             <<01549>>02962000
                      TOS := BASEADDR + OFFSET;                <<01549>>02964000
                      END;                                     <<01549>>02966000
                   LMEM;                                       <<01549>>02968000
                   OPERAND := TOS; DDEL;                       <<01549>>02970000
                                                               <<01549>>02972000
                   IF INDIRECT > 0 THEN                        <<01549>>02974000
                      OFFSET := OPERAND+STOP(LINK+1+INDIRECT); <<01549>>02976000
                   INDIRECT := INDIRECT - 1;                   <<01549>>02978000
                   END;                                        <<01549>>02980000
                END                                            <<01549>>02982000
             UNTIL INDIRECT < 0;                               <<01549>>02984000
             RESULT := GOT'OPERAND;                            <<01549>>02986000
             END                                               <<01549>>02988000
          ELSE << CONSTANT >>                                  <<01549>>02990000
             BEGIN                                             <<01549>>02992000
             OPERAND := STOP(LINK);                            <<01549>>02994000
             RESULT := GOT'OPERAND;                            <<01549>>02996000
             END;                                              <<01549>>02998000
                                                               <<01549>>03000000
          RETURN NUMPARM;                                      <<01549>>03002000
  END;                                                         <<01549>>03004000
          << >>                                                <<01549>>03006000
          << THIS PROCEDURE TESTS THE CONDITION WHOSE          ((MPEIV))03008000
             STAK BASE IS AT STOP(LINK). IT ALSO UPDATES       ((MPEIV))03010000
             THE CONDITION IF NEEDED (EG. FOR COUNTS).         ((MPEIV))03012000
                                                               ((MPEIV))03014000
             PARAMETERS:                                       ((MPEIV))03016000
                LINK:     INDEX OF BASE OF CONDITION STAK      ((MPEIV))03018000
                PRIV:     ASSUME PRIV CAP. WHEN CHECKING COND  ((MPEIV))03020000
                REGINFO:  Q-REL OFFSET OF CALLER TO DEBUG'S    ((MPEIV))03022000
                          ARRAY REG                            ((MPEIV))03024000
                                                               ((MPEIV))03026000
             RETURNS:                                          ((MPEIV))03028000
                0:        COND'TRUE                            ((MPEIV))03030000
                1:        COND'FASLE                           ((MPEIV))03032000
                2:        UNABLETESTCOND                       ((MPEIV))03034000
                                                               ((MPEIV))03036000
             ASSUMES:                                          ((MPEIV))03038000
                          DB AT BREAKPOINT TABLE               ((MPEIV))03040000
                          ENTER PDISABLED                      ((MPEIV))03042000
          >>                                                   <<01549>>03044000
          << >>                                                <<01549>>03046000
INTEGER PROCEDURE PROCESS'CONDITION (LINK,PRIV,REGINFO);       <<01549>>03048000
  VALUE   LINK,PRIV,REGINFO;                                   <<01549>>03050000
  INTEGER LINK,REGINFO;                                        <<01549>>03052000
  LOGICAL PRIV;                                                <<01549>>03054000
  OPTION  UNCALLABLE,PRIVILEGED;                               <<01549>>03056000
  BEGIN                                                        <<01549>>03058000
          INTEGER                                              <<01549>>03060000
             OP1,                                              <<01549>>03062000
             OP2,                                              <<01549>>03064000
             RELOP,                                            <<01549>>03066000
             RESULT = PROCESS'CONDITION;                       <<01549>>03068000
          << >>                                                <<01549>>03070000
          << GET Q-REL OFFSET OF 'REG' >>                      <<01549>>03072000
          REGINFO := REGINFO - DELTAQ;                         <<01549>>03074000
                                                               <<01549>>03076000
          << CONDITION IS EITHER A COUNT >>                    <<01549>>03078000
          << OR A TEST OF A LOCATION     >>                    <<01549>>03080000
          IF STOP(LINK).BKPT'CONDTYPE = T'NUMBER THEN          <<01549>>03082000
             BEGIN << COUNT >>                                 <<01549>>03084000
             STOP(LINK-1) := STOP(LINK-1)+1; <<UPDATE CNT>>    <<01549>>03086000
             IF STOP(LINK-1) = STOP(LINK-2) THEN               <<01549>>03088000
                BEGIN << COND TRUE >>                          <<01549>>03090000
                STOP(LINK-1) := 0; <<REINITIALIZE>>            <<01549>>03092000
                RESULT := COND'TRUE;                           <<01549>>03094000
                END                                            <<01549>>03096000
             ELSE RESULT := COND'FALSE;                        <<01549>>03098000
             END                                               <<01549>>03100000
          ELSE                                                 <<01549>>03102000
             BEGIN                                             <<01549>>03104000
             << GET OPERANDS >>                                <<01549>>03106000
             GETOPERAND (0,0,LINKOP1,STOP(LINK).BKPT'OP1INFO,  <<01549>>03108000
                         PRIV,REGINFO);                        <<01549>>03110000
             OP1 := TOS; << SAVE RESULTS >>                    <<01549>>03112000
             RESULT := TOS;                                    <<01549>>03114000
             IF RESULT <> GOT'OPERAND THEN RETURN;             <<01549>>03116000
             GETOPERAND (0,0,LINKOP2,STOP(LINK).BKPT'OP2INFO,  <<01549>>03118000
                         PRIV,REGINFO);                        <<01549>>03120000
             OP2 := TOS;                                       <<01549>>03122000
             RESULT := TOS;                                    <<01549>>03124000
             IF RESULT <> GOT'OPERAND THEN RETURN;             <<01549>>03126000
                                                               <<01549>>03128000
             << TEST CONDITION >>                              <<01549>>03130000
             RESULT := COND'FALSE;                             <<01549>>03132000
             RELOP := STOP(LINK).BKPT'CONDTYPE;                <<01549>>03134000
                                                               <<01549>>03136000
             IF (OP1>OP2) AND (RELOP=T'GT OR RELOP=T'GTE       <<01549>>03138000
                OR RELOP=T'NEQ) THEN RESULT := COND'TRUE       <<01549>>03140000
             ELSE IF (OP1<OP2) AND (RELOP=T'LT OR RELOP=T'LTE  <<01549>>03142000
                OR RELOP=T'NEQ) THEN RESULT := COND'TRUE       <<01549>>03144000
             ELSE IF (OP1=OP2) AND (RELOP=T'EQ OR RELOP=T'LTE  <<01549>>03146000
                OR RELOP=T'GTE) THEN RESULT := COND'TRUE;      <<01549>>03148000
             END;                                              <<01549>>03150000
                                                               <<01549>>03152000
  END;                                                         <<01549>>03154000
                                                               <<01549>>03156000
          << >>                                                <<01549>>03158000
          <<REMOVE B.P. AND DELETE ENTRY                       ((MPEIV))03160000
               PROC       PROC.(0:1)=1 CURRENT PROCESS         ((MPEIV))03162000
                                    =0 PROC.(8:8)=PIN #        ((MPEIV))03164000
                          PROC.(2:1)=1 PROCESS LOCAL BRKPNT    ((MPEIV))03166000
                                    =0 SYSTEM BREAK POINT      ((MPEIV))03168000
                                                               ((MPEIV))03170000
               SEG        =0  ALL SEGMENTS                     ((MPEIV))03172000
                          <>0 SEGMENT                          ((MPEIV))03174000
                          SEG.(0:1) SWITCH BREAKPOINTS IF DBLE ((MPEIV))03176000
                                    AND TEST CONDITION         ((MPEIV))03178000
                                    PLABEL REQURIED            ((MPEIV))03180000
                          SEG.(1:3) :                          ((MPEIV))03182000
                            0 --> SEG.(8:8) IS ABS SEG #       ((MPEIV))03184000
                            1 --> SEG.(8:8) IS SSL SEG #       ((MPEIV))03186000
                            2 --> SEG.(8:8) IS PSL SEG #       ((MPEIV))03188000
                            3 --> SEG.(8:8) IS GSL SEG #       ((MPEIV))03190000
                            4 --> SEG.(8:8) IS PROGRAM         ((MPEIV))03192000
                          SEG.(8:8)  SEGMENT NUMBER            ((MPEIV))03194000
                                                               ((MPEIV))03196000
                                                               ((MPEIV))03198000
                          =0  ALL SEGMENTS                     ((MPEIV))03200000
               PLOC       >=0 LOCATION                         ((MPEIV))03202000
                          <0  ALL LOCATIONS                    ((MPEIV))03204000
                                                               ((MPEIV))03206000
               REGINFO    ARRAY CONTAINING LOCATION OF         ((MPEIV))03208000
                          REGISTERS WHEN BREAKPOINT HIT        ((MPEIV))03210000
                          (REQUIRED IF SEG.(0:1)=1)            ((MPEIV))03212000
                                                               ((MPEIV))03214000
               PLABEL     = 0 REMOVE ALL BRK PNT               ((MPEIV))03216000
                              IN GIVEN RANGE (DEFAULT)         ((MPEIV))03218000
                          = 1 REMOVE USER TRAPS ONLY           ((MPEIV))03220000
                              (IN GIVEN RANGE)                 ((MPEIV))03222000
                          = 2 REMOVE DEBUG TRAPS ONLY          ((MPEIV))03224000
                          = @LABEL:  REMOVE ONLY IF            ((MPEIV))03226000
                              TRAP LABELS MATCH                ((MPEIV))03228000
                          = @DEBUG:  REMOVE NON-USER           ((MPEIV))03230000
                              TRAPS ONLY                       ((MPEIV))03232000
                          (MEANINGFULL ONLY WHEN CLEARING     )((MPEIV))03234000
                          (BREAKPOINT (SEG.(0:1)=0). OPTIONAL )((MPEIV))03236000
                          (THIS PARM. IS ALSO USED FOR A      )((MPEIV))03238000
                          (RETURNED VALUE -- SEE BELOW        )((MPEIV))03240000
                                                               ((MPEIV))03242000
               RETURNS:                                        ((MPEIV))03244000
               REMOVESTOP =0 OK                                ((MPEIV))03246000
                           1 INVALID PIN                       ((MPEIV))03248000
                           2 INVALID SEG                       ((MPEIV))03250000
                                                               ((MPEIV))03252000
               XREG       SET IF HIT BREAKPOINT (SEG.(0:1)=1). ((MPEIV))03254000
                          X = 0 NOT YET                        ((MPEIV))03256000
                            = 1 BREAK COND. TRUE               ((MPEIV))03258000
                            = 2 BREAK USER TRAP                ((MPEIV))03260000
               PLABEL     USER TRAP LABEL WHEN X=2             ((MPEIV))03262000
                          REGUIRED WHEN SEG.(0:1) = 1          ((MPEIV))03264000
                                                               ((MPEIV))03266000
               ASSUMES:    PENABLED UPON ENTRY                 ((MPEIV))03268000
              >>                                               <<01549>>03270000
          << >>                                                <<01549>>03272000
INTEGER PROCEDURE REMOVESTOP(PROC,SEG,PLOC,REGINFO,PLABEL);    <<01549>>03274000
  VALUE     PROC,SEG,PLOC;                                     <<01549>>03276000
  INTEGER   PROC,SEG,PLOC,PLABEL;                              <<01549>>03278000
  INTEGER   ARRAY REGINFO;                                     <<01549>>03280000
  OPTION    UNCALLABLE,PRIVILEGED,VARIABLE;                    <<01549>>03282000
  BEGIN                                                        <<01549>>03284000
          INTEGER PRC,LINK,LINKX,LOC,PINX,CLABEL,INSTR'LEN;    <<01549>>03286000
          INTEGER RESULT,TEMP,LOC'PLABEL,LOC'REGINFO,EXT'X,I,J;<<01549>>03288000
          INTEGER SAVESEGSIR,SAVEBKPTSIR,XREG=Q-3;             <<01549>>03290000
          INTEGER XDS,DB'STATE;                                <<01549>>03292000
          << INTEGERS USED WHEN UNABLE TO PROCESS CONDITION >> <<01549>>03294000
          << DUE TO ABSENT DATA SEG                         >> <<01549>>03296000
          INTEGER OP1BASE,OP2BASE,OP1TYPE,OP2TYPE,OLD'OP1BASE; <<01549>>03298000
          INTEGER OLD'OP2BASE;                                 <<01549>>03300000
          INTEGER OLD'OP1TYPE := STAK'SEG;                     <<01549>>03302000
          INTEGER OLD'OP2TYPE := STAK'SEG;                     <<01549>>03304000
                                                               <<01549>>03306000
          DOUBLE ORIG'DB;                                      <<01549>>03308000
                                                               <<01549>>03310000
          LOGICAL EXCHDB := FALSE,  << EXCH'DB TO BKPT TAB. >> <<01549>>03312000
                  UNLOCK := FALSE;  << UNLOCK BKPT TAB. >>     <<01549>>03314000
          DEFINE                                               <<01549>>03316000
             PLABEL'PASSED = PARMMASK.(15:1) #,                <<01549>>03318000
             LOCALBRKPNT   = LOGICAL(PROC.LOCBIT) #,           <<01549>>03320000
             HIT'BRKPNT    = (SEG < 0)#,                       <<01549>>03322000
             CLEAR'BRKPNT  = (SEG >= 0)#;                      <<01549>>03324000
          EQUATE                                               <<01549>>03326000
             INVALIDPIN  = 1,                                  <<01549>>03328000
             INVALIDSEG  = 2,                                  <<01549>>03330000
             FREEZEDSEG  = %300;                               <<01549>>03332000
          << >>                                                <<01549>>03334000
          LOGICAL SUBROUTINE MATCHENTRY;                       <<01549>>03336000
             BEGIN                                             <<01549>>03338000
             COMMENT:                                          <<01549>>03340000
                THIS ROUTINE DECIDES WHETHER STOP(LINK) IS     <<01549>>03342000
                A REQUESTED ENTRY                              <<01549>>03344000
                ;                                              <<01549>>03346000
             MATCHENTRY := TRUE;                               <<01549>>03348000
             IF CLEAR'BRKPNT AND PLABEL'PASSED AND NOT         <<01549>>03350000
                TRAP'MATCH(LINK,LOC'PLABEL)                    <<01549>>03352000
             THEN MATCHENTRY := FALSE                          <<01549>>03354000
             ELSE IF SEG <> 0 THEN                             <<01549>>03356000
                BEGIN << REMOVING FROM PARTICULAR SEG >>       <<01549>>03358000
                IF STOP(LINK+CLABELOFFSET) <> CLABEL THEN      <<01549>>03360000
                   MATCHENTRY := FALSE                         <<01549>>03362000
                ELSE  << SEGS MATCH, DO PLOCS? >>              <<01549>>03364000
                   BEGIN                                       <<01549>>03366000
                   IF PLOC >= 0 AND NOT TESTPSTOP(LINK,PLOC,2) <<01549>>03368000
                      THEN MATCHENTRY := FALSE;                <<01549>>03370000
                   END;                                        <<01549>>03372000
                END;                                           <<01549>>03374000
             END; << MATCHENTRY >>                             <<01549>>03376000
                                                               <<01549>>03378000
          SUBROUTINE SWITCH'PLOC;                              <<01549>>03380000
             BEGIN                                             <<01549>>03382000
             COMMENT:                                          <<01549>>03384000
                IF THE ENTRY IS A FAKE BKPT. THEN RESET BREAK  <<01549>>03386000
                TO REAL PLOC & VISA VERSA.  THIS ROUTINE CALLS <<01549>>03388000
                MANAGE STOP                                    <<01549>>03390000
                ;                                              <<01549>>03392000
             INSTR'LEN := 1+STOP(LINK).BKPT'TW;                <<01549>>03394000
             IF STOP(LINK).BKPT'FAKE=1 THEN                    <<01549>>03396000
                BEGIN                                          <<01549>>03398000
                STOP(LINK+PLOCOFFSET) := STOP(LINK+PLOCOFFSET)-<<01549>>03400000
                                         INSTR'LEN;            <<01549>>03402000
                STOP(LINK).BKPT'FAKE := 0;                     <<01549>>03404000
                END                                            <<01549>>03406000
             ELSE << SET TO FAKE >>                            <<01549>>03408000
                BEGIN                                          <<01549>>03410000
                STOP(LINK+PLOCOFFSET) := STOP(LINK+PLOCOFFSET)+<<01549>>03412000
                                         INSTR'LEN;            <<01549>>03414000
                STOP(LINK).BKPT'FAKE := 1;                     <<01549>>03416000
                END;                                           <<01549>>03418000
             STOP(LINK).BKPT'VALID := 0;                       <<01549>>03420000
             STOP(LINK).BKPT'UPDATING := 0;<< DONE MODIFYING >><<01549>>03422000
             MANAGESTOP(LINK,0,PINX);                          <<01549>>03424000
                                                               <<01549>>03426000
             END; << SWITCH'PLOC >>                            <<01549>>03428000
                                                               <<01549>>03430000
          SUBROUTINE REMOVE'ENTRY;                             <<01549>>03432000
             BEGIN                                             <<01549>>03434000
             COMMENT:                                          <<01549>>03436000
                THIS ROUTINE REMOVES ENTRY STOP(LINK) FROM     <<01549>>03438000
                THE BREAK POINT CHAIN AND UPDATES THE PCB,     <<01549>>03440000
                PCB EXTENSION IF NEC. THE ENTRY IS RETURNED    <<01549>>03442000
                TO THE FREE LIST                               <<01549>>03444000
                CONVENTION:                                    <<01549>>03446000
                   ENTRY:   LINK IS INDEX OF ENTRY TO BE       <<01549>>03448000
                            REMOVED                            <<01549>>03450000
                   EXIT:    LINK IS INDEX OF NEXT ENTRY IN     <<01549>>03452000
                            CHAIN.                             <<01549>>03454000
                ;                                              <<01549>>03456000
             << REMOVE FROM BKPT CHAIN >>                      <<01549>>03458000
             IF LINKX <> EXT'X THEN                            <<01549>>03460000
                BEGIN << NOT FIRST ITEM IN CHAIN >>            <<01549>>03462000
                STOP(LINKX+LINKOFFSET) :=                      <<01549>>03464000
                   STOP(LINK+LINKOFFSET);                      <<01549>>03466000
                END                                            <<01549>>03468000
             ELSE << 1ST ITEM IN CHAIN >>                      <<01549>>03470000
                BEGIN                                          <<01549>>03472000
                STOP(EXT'X) := STOP(LINK+LINKOFFSET);          <<01549>>03474000
                IF STOP(EXT'X) = 0 THEN                        <<01549>>03476000
                   BEGIN << CHAIN IS EMPTY >>                  <<01549>>03478000
                   IF PRC = 0 THEN SYS'BKPT := 0               <<01549>>03480000
                   ELSE                                        <<01549>>03482000
                      BEGIN                                    <<01549>>03484000
                      PCBI'(PRC).PCB'BKPT'BITS := 0;           <<01549>>03486000
                      FREE'BKPT'EXT'X (EXT'X);                 <<01549>>03488000
                      END;                                     <<01549>>03490000
                   END;                                        <<01549>>03492000
                END;                                           <<01549>>03494000
             << GET READY TO RETURN TO FREE LIST >>            <<01549>>03496000
             LOC := LINK; << SAVE LINK >>                      <<01549>>03498000
             LINK := STOP(LINK+LINKOFFSET);                    <<01549>>03500000
                                                               <<01549>>03502000
             << RETURN TO FREE LIST >>                         <<01549>>03504000
             IF AVAIL <> 0 THEN                                <<01549>>03506000
                BEGIN  << INSERT BEFORE ENTRY >>               <<01549>>03508000
                       << POINTED TO BY AVAIL >>               <<01549>>03510000
                STOP(LOC+FORWLINK) := AVAIL;                   <<01549>>03512000
                STOP(LOC+BKWLINK) := STOP(AVAIL+BKWLINK);      <<01549>>03514000
                << THE PREDECESSOR OF THE OLD HEAD >>          <<01549>>03516000
                << NOW POINTS TO THE NEW HEAD: LOC >>          <<01549>>03518000
                STOP(STOP(AVAIL+BKWLINK)+FORWLINK) := LOC;     <<01549>>03520000
                << THE OLD HEAD PTS BACK TO LINK >>            <<01549>>03522000
                STOP(AVAIL+BKWLINK) := LOC;                    <<01549>>03524000
                END                                            <<01549>>03526000
             ELSE                                              <<01549>>03528000
                BEGIN << 1ST ENTRY IN LIST >>                  <<01549>>03530000
                STOP(LOC+FORWLINK) :=                          <<01549>>03532000
                   STOP(LOC+BKWLINK) := LOC;                   <<01549>>03534000
                END;                                           <<01549>>03536000
             AVAIL := LOC;                                     <<01549>>03538000
                                                               <<01549>>03540000
             << MARK AS AVAILABLE & ZERO ENTRY >>              <<01549>>03542000
             J := STOP(LOC) := STOP(LOC).BKPT'SIZE;            <<01549>>03544000
             STOP(LOC).BKPT'TAG := 1; << FREE >>               <<01549>>03546000
             I := 2;                                           <<01549>>03548000
             WHILE (I:=I+1) < J DO STOP(LOC+I) := 0;           <<01549>>03550000
             END; << REMOVE'ENTRY >>                           <<01549>>03552000
                                                               <<01549>>03554000
          INTEGER SUBROUTINE COND'LINK;                        <<01549>>03556000
             BEGIN                                             <<01549>>03558000
             COMMENT:                                          <<01549>>03560000
                THIS ROUTINE RETURNS THE INDEX OF              <<01549>>03562000
                THE BASE OF THE CONDITION FOR                  <<01549>>03564000
                STOP(LINK)                                     <<01549>>03566000
                ;                                              <<01549>>03568000
             I := LINK + STOP(LINK).BKPT'SIZE -1;              <<01549>>03570000
             WHILE STOP(I) = 0 DO I:=I-1;                      <<01549>>03572000
             COND'LINK := I;                                   <<01549>>03574000
             END; << COND'LINK >>                              <<01549>>03576000
                                                               <<01549>>03578000
          INTEGER SUBROUTINE OPER'LINK (LINK,OPNUM);           <<01549>>03580000
             VALUE LINK,OPNUM;                                 <<01549>>03582000
             INTEGER LINK,OPNUM;                               <<01549>>03584000
             BEGIN                                             <<01549>>03586000
             COMMENT:                                          <<01549>>03588000
                THIS RETURNS THE INDEX OF THE DESIRED          <<01549>>03590000
                OPERAND OF BREAKPNT ENTRY STOP(LINK).          <<01549>>03592000
                OPNUM IS THE OPERAND NUMBER (1 OR 2).          <<01549>>03594000
                ;                                              <<01549>>03596000
             LINK := COND'LINK;                                <<01549>>03598000
             << DEFINES LINKOP1,LINKOP2 KEY OFF OF 'LINK' >>   <<01549>>03600000
             IF OPNUM = 1 THEN OPER'LINK := LINKOP1            <<01549>>03602000
             ELSE OPER'LINK := LINKOP2;                        <<01549>>03604000
             END; << OPER'LINK >>                              <<01549>>03606000
                                                               <<01549>>03608000
          << >>                                                <<01549>>03610000
          COMMENT:                                             <<01549>>03612000
                          ***** WARNING *****                  <<01549>>03614000
             MUCH OF THE CODE OF THIS PROCEDURE IS DUPLICATED  <<01549>>03616000
             IN ENTERSTOP.  THEREFORE, ANY BUGS FOUND IN THIS  <<01549>>03618000
             ROUTINE MAY ALSO EXIST IN ENTERSTOP.              <<01549>>03620000
                                                               <<01549>>03622000
             IF REMOVING BREAKPOINTS FROM ANOTHER PROCESS      <<01549>>03624000
             THEN GET THE SEGMENT TAB. SIR. THIS PREVENTS A    <<01549>>03626000
             PROCESS OR DYNAMICALLY LOADED PROCEDURE           <<01549>>03628000
             FROM BEING UNLOADED FROM THE TIME WE GET THE      <<01549>>03630000
             PHYSICAL CST NUMBER UNTIL REMOVE BREAKPOINT.      <<01549>>03632000
             (NOTE THAT A PROCESS MAY BE PROCREATED BUT NOT    <<01549>>03634000
             CREATED).;                                        <<01549>>03636000
          << SET DB TO STAK >>                                 <<01549>>03638000
          SET'DB'DSEG (0,0,0D,0<<STAK>>);                      <<01549>>03640000
          << ORIGNAL DB STATE LEFT ON TOS >>                   <<01549>>03642000
          ORIG'DB := TOS;                                      <<01549>>03644000
          XDS := TOS;                                          <<01549>>03646000
          DB'STATE := TOS;                                     <<01549>>03648000
          IF PROC.CURRENTPCBBIT = 1 THEN                       <<01549>>03650000
             BEGIN<< CURRENT PROCESS-SET UP PROC >>            <<01549>>03652000
                  << ZERO IGNORED FIELDS         >>            <<01549>>03654000
             IF PROC.LOCBIT = 1 THEN                           <<01549>>03656000
                BEGIN                                          <<01549>>03658000
                PROC := (PINX:=PIX)/PCBSIZE;                   <<01549>>03660000
                PROC.LOCBIT := 1;                              <<01549>>03662000
                END                                            <<01549>>03664000
             ELSE PROC := (PINX:=PIX)/PCBSIZE;                 <<01549>>03666000
             END                                               <<01549>>03668000
          ELSE                                                 <<01549>>03670000
             BEGIN                                             <<01549>>03672000
             PINX := (PROC.(8:8))*PCBSIZE;                     <<01549>>03674000
             IF PINX = 0 THEN PINX := PIX;                     <<01549>>03676000
             END;                                              <<01549>>03678000
          Comment                                              <<04498>>03680000
          The loader SIR has to be obtained,to avoid a deadlock<<04498>>03682000
          with the break point table SIR. This happens because <<04498>>03684000
          the call to PHYSICALCST will inevitably need the     <<04498>>03686000
          loader SIR. The proper oerder of getting these SIR's <<04498>>03688000
          is to first get the loader SIR and than the break    <<04498>>03690000
          point table SIR.                                     <<04498>>03692000
          ;                                                    <<04498>>03694000
          SAVESEGSIR := GETSIR(SEGTABSIR);                     <<04498>>03696000
          << GET BKTP SIR TO MAKE SURE NO ONE LOCK/UNLOCKS >>  <<01549>>03700000
          << BKPT TABLE                                    >>  <<01549>>03702000
          SAVEBKPTSIR := GETSIR (BKPTSIR);                     <<01549>>03704000
          PDISABLE;                                            <<01549>>03706000
          IF NOT BKPT'TAB'LOCKED THEN                          <<01549>>03708000
             BEGIN << NO BREAK POINTS >>                       <<01549>>03710000
             RESULT := 0;                                      <<01549>>03712000
             XREG := 0;                                        <<02001>>03714000
             GOTO FIN;                                         <<01549>>03716000
             END;                                              <<01549>>03718000
          IF SEG.SEGTYPE <> ABS'SEG THEN                       <<01549>>03720000
             BEGIN << GET THE PHYSICAL CST NUMBER >>           <<01549>>03722000
             TEMP := 0;                                        <<01549>>03724000
             TEMP.(0:3) := SEG.SEGTYPE;                        <<01549>>03726000
             TEMP.(8:8) := SEG.(8:8);                          <<01549>>03728000
             PENABLE;                                          <<01549>>03730000
             RESULT := PHYSICALCST(PROC.(8:8),TEMP);           <<01549>>03732000
             PDISABLE;                                         <<01549>>03734000
             IF > THEN GOTO ER'SEG;                            <<01549>>03736000
             IF < THEN                                         <<01549>>03738000
                BEGIN                                          <<01549>>03740000
                IF VALIDATE(PROC.(8:8)) = 0 AND                <<01549>>03742000
                   PCBI'(PINX+9).(6:2) <> 0                    <<01549>>03744000
                THEN                                           <<01549>>03746000
                   BEGIN << SYS PROC--NOT IN LST           >>  <<01549>>03748000
                         << MUST SPECIFY A SSL OR PROG SEG >>  <<01549>>03750000
                   IF SEG.SEGTYPE = SSL'SEG THEN               <<01549>>03752000
                      BEGIN                                    <<01549>>03754000
                      PENABLE;                                 <<01549>>03756000
                      RESULT := PHYSICALCST(0,TEMP);           <<01549>>03758000
                      PDISABLE;                                <<01549>>03760000
                      IF <> THEN GOTO ER'SEG;                  <<01549>>03762000
                      END                                      <<01549>>03764000
                   ELSE IF SEG.SEGTYPE = PROG'SEG THEN         <<01549>>03766000
                      RESULT := SEG.(8:8) + %301               <<01549>>03768000
                   ELSE GOTO ER'SEG;                           <<01549>>03770000
                   END                                         <<01549>>03772000
                ELSE GOTO ER'PIN;                              <<01549>>03774000
                END;                                           <<01549>>03776000
             SEG.(1:15) := RESULT.(8:8);                       <<01549>>03778000
             END;                                              <<01549>>03780000
          COMMENT:                                             <<01549>>03782000
             MUST MAKE SURE THAT THE PIN IS A VALID            <<01549>>03784000
             PIN NUMBER (IN CASE ABS'SEG SPECIFIED),           <<01549>>03786000
             THAT THE PROCESS IS STILL ALIVE                   <<01549>>03788000
             (IE. THAT REMOVESTOP HASN'T BEEN CALLED)          <<01549>>03790000
             AND THAT WE HAVE A VALID PHYSICAL SEG #.;         <<01549>>03792000
          RESULT := IF SEG=0 THEN VALIDATE(PROC.(8:8))         <<01549>>03794000
                    ELSE VALIDATE(PROC.(8:8),SEG.(8:8));       <<01549>>03796000
          IF RESULT <> 0 THEN GOTO FIN;                        <<01549>>03798000
          CLABEL := SEG;                                       <<01549>>03800000
          IF CLABEL <> 0 THEN                                  <<01549>>03802000
             BEGIN                                             <<01549>>03804000
             CLABEL := BUILDSEGID (SEG'ID'TYPE(SEG.(8:8)),     <<01610>>03806000
                                   SEG.(8:8),PROC.(8:8));      <<01610>>03808000
             END;                                              <<01549>>03810000
                                                               <<01549>>03812000
TRYAGAIN: << THIS LABEL MARKS THE BEGINNING OF CODE   >>       <<01549>>03814000
          << TO BE REEXECUTED IF A DATA SEG OF THE    >>       <<01549>>03816000
          << BREAKPOINT CONDITION IS ABSENT.          >>       <<01549>>03818000
                                                               <<01549>>03820000
          << LINK GETS INDEX OF FIRST ENTRY IN CHAIN  >>       <<01549>>03822000
          << EXT'X  =  INDEX IN PCB BKPT. EXT. TABLE  >>       <<01549>>03824000
          << LINKX = INDEX OF LINK'S PREDECESSOR      >>       <<01549>>03826000
                                                               <<01549>>03828000
          IF LOCALBRKPNT THEN                                  <<01549>>03830000
             BEGIN                                             <<01549>>03832000
             PRC := PROC.(8:8)*PCBSIZE + PCB'BKPT'WD;          <<01549>>03834000
             EXT'X := LINKX := PCBI'(PRC).PCB'BKPT'BITS;       <<01549>>03836000
             END                                               <<01549>>03838000
          ELSE                                                 <<01549>>03840000
             BEGIN << SYSTEM BKPT >>                           <<01549>>03842000
             PRC := 0;                                         <<01549>>03844000
             EXT'X := LINKX := IF SYS'BKPT=1 THEN              <<01549>>03846000
                                  SYS'BKPT'EXT'X               <<01549>>03848000
                               ELSE 0;                         <<01549>>03850000
             END;                                              <<01549>>03852000
          IF EXT'X = 0 THEN                                    <<01549>>03854000
             BEGIN << NO BREAK POINTS >>                       <<01549>>03856000
             RESULT := 0;                                      <<01549>>03858000
             XREG := 0;                                        <<02001>>03860000
             GOTO FIN;                                         <<01549>>03862000
             END;                                              <<01549>>03864000
          << THERE ARE BREAKPOINTS. MAKE LOCAL >>              <<01549>>03866000
          << COPY OF VARIABLES BEFORE XCHDB    >>              <<01549>>03868000
          LOC'PLABEL := PLABEL;                                <<01549>>03870000
          << GET Q-REL LOC OF REGINFO >>                       <<01549>>03872000
          PUSH (Q);                                            <<01549>>03874000
          LOC'REGINFO := -(TOS-@REGINFO);                      <<01549>>03876000
          EXCHANGEDB (DEBUGDST);                               <<01549>>03878000
          EXCHDB := TRUE;                                      <<01549>>03880000
          LINK := STOP(EXT'X);                                 <<01549>>03882000
                                                               <<01549>>03884000
          IF HIT'BRKPNT THEN                                   <<01549>>03886000
             BEGIN                                             <<01549>>03888000
             XREG := 0; << INITIALIZE XREG >>                  <<01549>>03890000
             << FIND ENTRY >>                                  <<01549>>03892000
             WHILE LINK <> 0 AND NOT MATCHENTRY DO             <<01549>>03894000
                BEGIN                                          <<01549>>03896000
                LINKX := LINK;                                 <<01549>>03898000
                LINK := STOP(LINK+LINKOFFSET);                 <<01549>>03900000
                END;                                           <<01549>>03902000
             IF LINK <> 0 THEN                                 <<01549>>03904000
                BEGIN   << FOUND MATCH >>                      <<01549>>03906000
                << TELL DISC MONITOR TO IGNORE ENTRY >>        <<01549>>03908000
                STOP(LINK).BKPT'UPDATING := 1;                 <<01549>>03910000
                << REMOVE BKPT FROM CODE >>                    <<01549>>03912000
                MANAGESTOP (LINK,1,PINX);                      <<01549>>03914000
                IF STOP(LINK).BKPT'FAKE = 1 THEN               <<01549>>03916000
                   BEGIN                                       <<01549>>03918000
                   SWITCH'PLOC;                                <<01549>>03920000
                   XREG := 0;                                  <<01549>>03922000
                   END                                         <<01549>>03924000
                ELSE                                           <<01549>>03926000
                   BEGIN << REAL THING >>                      <<01549>>03928000
                   IF STOP(LINK).BKPT'COND = 1 THEN            <<01549>>03930000
                      BEGIN                                    <<01549>>03932000
                      << CONDITIONAL BKPT         >>           <<01549>>03934000
                                                               <<01549>>03936000
                      RESULT := PROCESS'CONDITION (COND'LINK,  <<01549>>03938000
                                STOP(LINK).BKPT'PRIV,          <<01549>>03940000
                                LOC'REGINFO);                  <<01549>>03942000
                      END                                      <<01549>>03944000
                   ELSE RESULT := TIME'FOR'BREAK;              <<01549>>03946000
                   IF RESULT = TIME'FOR'BREAK THEN             <<01549>>03948000
                      BEGIN                                    <<01549>>03950000
                      << RETURN INFO >>                        <<01549>>03952000
                      IF STOP(LINK).BKPT'USERLBL = 1 THEN      <<01549>>03954000
                         BEGIN                                 <<01549>>03956000
                         LOC'PLABEL:=STOP(LINK+USERLBLOFFSET); <<01549>>03958000
                         XREG := 2;                            <<01549>>03960000
                         END                                   <<01549>>03962000
                      ELSE XREG := 1;                          <<01549>>03964000
                      IF STOP(LINK).BKPT'PERM = 1 THEN         <<01549>>03966000
                         SWITCH'PLOC                           <<01549>>03968000
                      ELSE REMOVE'ENTRY;                       <<01549>>03970000
                      END                                      <<01549>>03972000
                   ELSE IF RESULT = NOT'THIS'TIME THEN         <<01549>>03974000
                      BEGIN                                    <<01549>>03976000
                      SWITCH'PLOC; << SET FAKE >>              <<01549>>03978000
                      XREG := 0;                               <<01549>>03980000
                      END                                      <<01549>>03982000
                   ELSE << UNABLE TO TEST CONDITION >>         <<01549>>03984000
                      BEGIN                                    <<01549>>03986000
                      COMMENT:                                 <<01549>>03988000
                         ONE OR MORE DATA SEGS, NOT PRESENT.   <<01549>>03990000
                         WILL ENABLE AND FREEZE SEGS. DUE TO   <<01549>>03992000
                         ENABLE MUST GO CHECK THINGS OUT AGAIN <<01549>>03994000
                         (BREAKPOINT MAY HAVE BEEN ALTERED OR  <<01549>>03996000
                         REMOVED UNDER US);                    <<01549>>03998000
                      << TRANSLATE OPERANDS TO BASE, OFFSET >> <<01549>>04000000
                      TRANSLATE (0,0,0,0,OPER'LINK(LINK,1),    <<01549>>04002000
                                 LOC'REGINFO);                 <<01549>>04004000
                      << SAVE RESULTS >>                       <<01549>>04006000
                      DDEL;  << DELETE OFFSET >>               <<01549>>04008000
                      OP1BASE := TOS;                          <<01549>>04010000
                      OP1TYPE := TOS;                          <<01549>>04012000
                      TRANSLATE (0,0,0,0,OPER'LINK(LINK,2),    <<01549>>04014000
                                 LOC'REGINFO);                 <<01549>>04016000
                      DDEL;                                    <<01549>>04018000
                      OP2BASE := TOS;                          <<01549>>04020000
                      OP2TYPE := TOS;                          <<01549>>04022000
                                                               <<01549>>04024000
                      PENABLE; EXCHANGEDB (0);                 <<01549>>04026000
                      << UNFREEZE ANY PREVIOUSLY FROZESEG >>   <<01549>>04028000
                      IF OLD'OP1TYPE = DA'SEG THEN             <<01549>>04030000
                         RESETSEG (FREEZEDSEG,OLD'OP1BASE);    <<01549>>04032000
                      IF OLD'OP2TYPE = DA'SEG THEN             <<01549>>04034000
                         RESETSEG (FREEZEDSEG,OLD'OP2BASE);    <<01549>>04036000
                      << FREEZE NEW SEGMENTS >>                <<01549>>04038000
                      IF (OLD'OP1TYPE:=OP1TYPE) = DA'SEG THEN  <<01549>>04040000
                         SETSEG (FREEZEDSEG,                   <<01549>>04042000
                                 (OLD'OP1BASE:=OP1BASE),J);    <<01549>>04044000
                      IF (OLD'OP2TYPE:=OP2TYPE) = DA'SEG THEN  <<01549>>04046000
                         SETSEG (FREEZEDSEG,                   <<01549>>04048000
                                 (OLD'OP2BASE:=OP2BASE),J);    <<01549>>04050000
                      PDISABLE;                                <<01549>>04052000
                      GOTO TRYAGAIN;                           <<01549>>04054000
                      END                                      <<01549>>04056000
                   END                                         <<01549>>04058000
                END                                            <<01549>>04060000
             END                                               <<01549>>04062000
          ELSE  << CLEARING ENTRIES >>                         <<01549>>04064000
             BEGIN                                             <<01549>>04066000
             WHILE LINK <> 0 DO                                <<01549>>04068000
                BEGIN                                          <<01549>>04070000
                IF MATCHENTRY THEN                             <<01549>>04072000
                   BEGIN                                       <<01549>>04074000
                   << TELL DISC MONITOR TO IGNORE ENTRY >>     <<01549>>04076000
                   STOP(LINK).BKPT'UPDATING := 1;              <<01549>>04078000
                   << REMOVE BKPT FROM CODE >>                 <<01549>>04080000
                   MANAGESTOP(LINK,1,PINX);                    <<01549>>04082000
                   REMOVE'ENTRY;                               <<01549>>04084000
                   END                                         <<01549>>04086000
                ELSE                                           <<01549>>04088000
                   BEGIN                                       <<01549>>04090000
                   << GET NEXT ENTRY - SAVE PREDECESSOR >>     <<01549>>04092000
                   LINKX := LINK;                              <<01549>>04094000
                   LINK := STOP(LINK+LINKOFFSET);              <<01549>>04096000
                   END;                                        <<01549>>04098000
                END                                            <<01549>>04100000
             END;                                              <<01549>>04102000
                                                               <<01549>>04104000
          << UNLOCK IF NO MORE ENTRIES >>                      <<01549>>04106000
          UNLOCK := NO'BKPT'ENTRIES;                           <<01549>>04108000
          RESULT := 0;                                         <<01549>>04110000
  FIN:    REMOVESTOP := RESULT;                                <<01549>>04112000
          PENABLE;                                             <<01549>>04114000
          IF EXCHDB THEN                                       <<01549>>04116000
             BEGIN                                             <<01549>>04118000
             EXCHANGEDB (0);                                   <<01549>>04120000
             PLABEL := LOC'PLABEL;                             <<01549>>04122000
             END;                                              <<01549>>04124000
          << IF WE EMPTIED TABLE THEN UNLOCK IT >>             <<01549>>04126000
          IF UNLOCK THEN UNLOCK'BKPT'TAB;                      <<01549>>04128000
          RELSIR (BKPTSIR,SAVEBKPTSIR);                        <<01549>>04130000
          IF SAVESEGSIR<>-1 THEN RELSIR (SEGTABSIR,SAVESEGSIR);<<01549>>04132000
          << UNFREEZE ANY SEGMENT FROZE WHILE PROCESSING >>    <<01549>>04134000
          << BREAKPOINT CONDITION                        >>    <<01549>>04136000
          IF OLD'OP1TYPE = DA'SEG THEN                         <<01549>>04138000
             RESETSEG (FREEZEDSEG,OLD'OP1BASE);                <<01549>>04140000
          IF OLD'OP2TYPE = DA'SEG THEN                         <<01549>>04142000
             RESETSEG (FREEZEDSEG,OLD'OP2BASE);                <<01549>>04144000
          << RESTORE ORIGINAL DB STATE >>                      <<01549>>04146000
          SET'DB (DB'STATE,XDS,ORIG'DB);                       <<01549>>04148000
          RETURN;                                              <<01549>>04150000
  ER'PIN: RESULT := INVALIDPIN;                                <<01549>>04152000
          GOTO FIN;                                            <<01549>>04154000
  ER'SEG: RESULT := INVALIDSEG;                                <<01549>>04156000
          GOTO FIN;                                            <<01549>>04158000
  END;                                                         <<01549>>04160000
                                                                        04162000
                                                                        04164000
          << >>                                                         04166000
          <<VALIDATE AND SET UP B.P. +ENTRY                             04168000
               PROC.(0: 1)=  RESERVED                                   04170000
                   .(1: 1)=1 PRIV                                       04172000
                          =0 NON PRIV                                   04174000
                   .(2: 1)=1 PROCESS LOCAL BREAK PNT           ((MPEIV))04176000
                          =0 SYSTEM BREAK PNT                  ((MPEIV))04178000
                   .(4: 1)=1 DOUBLE TRAP                       ((TB.MM))04180000
                   .(5: 1)=1 PERMANENT B.P.                             04182000
                   .(6: 1)=1 USER TRAP                         ((TB.MM))04184000
                   .(8: 8)=  PIN #                             ((MPEIV))04186000
                                                               ((MPEIV))04188000
               SEG .(8:8) = SEGMENT NUMBER                     ((MPEIV))04190000
                   .(1:3) =                                    ((MPEIV))04192000
                            0 --> SEG.(8:8) IS ABS SEG #       ((MPEIV))04194000
                            1 --> SEG.(8:8) IS SSL SEG #       ((MPEIV))04196000
                            2 --> SEG.(8:8) IS PSL SEG #       ((MPEIV))04198000
                            3 --> SEG.(8:8) IS GSL SEG #       ((MPEIV))04200000
                            4 --> SEG.(8:8) IS PROGRAM         ((MPEIV))04202000
                                                               ((MPEIV))04204000
               COND       = ARRAY CONTAINING BKPT CONDITION    ((MPEIV))04206000
                            SEE 'CONDITION' IN DEBUG FOR       ((MPEIV))04208000
                            ARRAY FORMAT (OPTIONAL)            ((MPEIV))04210000
                                                               ((MPEIV))04212000
               PARM       = TRAP LABEL IF PROC.(6:1)=1         ((MPEIV))04214000
                            OPTIONAL                           ((MPEIV))04216000
                                                               ((MPEIV))04218000
               ENTERSTOP  =0 OK                                ((MPEIV))04220000
                          =1 ERROR                             ((MPEIV))04222000
                          =2 TABLE FULL                        ((MPEIV))04224000
                          =3 PROCESS/SYSTEM CONFLICT           ((MPEIV))04226000
                          =4 LOCATION CONFLICT                 ((MPEIV))04228000
                          =5 INVALID PIN                       ((MPEIV))04230000
                          =6 INVALID SEG                       ((MPEIV))04232000
                                                               ((MPEIV))04234000
               ASSUMES:   PENABLED UPON ENTRY  >>              <<01549>>04236000
          << >>                                                         04238000
INTEGER PROCEDURE ENTERSTOP(PROC,SEG,PLOC,COND,PARM);          <<01549>>04240000
  VALUE     PROC,SEG,PLOC,PARM;                                <<01549>>04242000
  INTEGER   PROC,SEG,PLOC,PARM;                                <<01549>>04244000
  ARRAY     COND;                                              <<01549>>04246000
  OPTION    UNCALLABLE,PRIVILEGED;                                      04248000
  BEGIN                                                                 04250000
          EQUATE FREEZE = %100;                                <<00873>>04252000
          INTEGER PRC,LINK,LOC,PINX;                                    04254000
          INTEGER RESULT,TEMP,SAVESEGSIR,I,J,PCB'EXT'X;        <<01549>>04256000
          INTEGER DUB,CLABEL,ABS'SEGNUM,INSTR,BANK,SAVEBKPTSIR;<<01549>>04258000
          INTEGER RETURNVAL = ENTERSTOP;                       <<01549>>04260000
          LOGICAL FREEZESEG   := FALSE, << FROZE CODE >>       <<01549>>04262000
                  FOUND'EMPTY := FALSE, << TABLE EMPTY >>      <<01549>>04264000
                  EXCHDB      := FALSE;<< EXCH'DB TO BKPTTAB >><<01549>>04266000
          INTEGER ARRAY LOC'COND(0:MAX'COND'SIZE) = Q;         <<01549>>04268000
          DEFINE                                               <<01549>>04270000
             LOCALBRKPNT = LOGICAL(PROC.LOCBIT) #;             <<01549>>04272000
          << >>                                                         04274000
          LOGICAL SUBROUTINE TWO'WORDINSTR(INSTR);             <<00873>>04276000
            VALUE INSTR;                                       <<00873>>04278000
            INTEGER INSTR;                                     <<00873>>04280000
          BEGIN                                                <<00873>>04282000
             COMMENT:                                          <<00873>>04284000
                DETERMINE WHETHER OR NOT  INSTR IS A TWO       <<00873>>04286000
                WORD INSTRUCTION;                              <<00873>>04288000
             TWO'WORDINSTR := IF INSTR = %20477 THEN TRUE      <<00873>>04290000
                              ELSE FALSE;                      <<00873>>04292000
          END;                                                 <<00873>>04294000
          << >>                                                <<00873>>04296000
          COMMENT:                                             <<01549>>04298000
                          ***** WARNING *****                  <<01549>>04300000
             MUCH OF THE CODE OF THIS PROCEDURE IS DUPLICATED  <<01549>>04302000
             IN REMOVESTOP.  THEREFORE, ANY BUGS FOUND IN THIS <<01549>>04304000
             ROUTINE MAY ALSO EXIST IN REMOVESTOP.             <<01549>>04306000
                                                               <<01549>>04308000
             IF ENTERING BREAKPOINT IN ANOTHER PROCESS         <<01549>>04310000
             THEN GET THE SEGMENT TAB SIR. THIS PREVENT A      <<01549>>04312000
             PROCESS OR ANY DYNAMICALLY LOADED PROCEDURE       <<01549>>04314000
             FROM BEING UNLOADED FROM THE TIME WE GET THE      <<01549>>04316000
             PHYSICAL CST NUMBER UNTIL ENTER BREAKPOINT.       <<01549>>04318000
             (NOTE THAT A PROCESS MAY BE PROCREATED BUT NOT    <<01549>>04320000
             CREATED).;                                        <<01549>>04322000
          PINX _ PROC.(8:8)*PCBSIZE;                                    04324000
          IF = THEN PINX _ PIX;                                         04326000
          Comment                                              <<04498>>04328000
          The loader SIR has to be obtained,to avoid a deadlock<<04498>>04330000
          with the break point table SIR. This happens because <<04498>>04332000
          the call to PHYSICALCST will inevitably need the     <<04498>>04334000
          loader SIR. The proper order of getting these SIR's  <<04498>>04336000
          is to first get the loader SIR and than the break    <<04498>>04338000
          point table SIR.                                     <<04498>>04340000
          ;                                                    <<04498>>04342000
          SAVESEGSIR := GETSIR(SEGTABSIR);                     <<04498>>04344000
          SAVEBKPTSIR := GETSIR (BKPTSIR);                     <<01549>>04348000
          IF NOT BKPT'TAB'LOCKED THEN<< DEBUG MUST LOCK TAB >> <<01549>>04350000
             BEGIN                                             <<01549>>04352000
             LOCK'BKPT'TAB;                                    <<01549>>04354000
             FOUND'EMPTY := TRUE;                              <<01549>>04356000
             END;                                              <<01549>>04358000
          PDISABLE;                                            <<01549>>04360000
          TOS_0;                                                        04362000
          IF SEG.SEGTYPE <> ABS'SEG THEN                       <<01549>>04364000
             BEGIN << GET THE PHYSICAL CST NUMBER >>           <<01549>>04366000
             TEMP := 0;                                        <<01549>>04368000
             TEMP.(0:3) := SEG.SEGTYPE;                        <<01549>>04370000
             TEMP.(8:8) := SEG.(8:8);                          <<01549>>04372000
             PENABLE;                                          <<01549>>04374000
             RESULT := PHYSICALCST(PROC.(8:8),TEMP);           <<01549>>04376000
             PDISABLE;                                         <<01549>>04378000
             IF > THEN GOTO ER'SEG;                            <<01549>>04380000
             IF < THEN                                         <<01549>>04382000
                BEGIN                                          <<01549>>04384000
                IF VALIDATE(PROC.(8:8)) = 0 AND                <<01549>>04386000
                   PCBI'(PINX+9).(6:2) <> 0                    <<01549>>04388000
                THEN                                           <<01549>>04390000
                   BEGIN << SYS PROC--NOT IN LST           >>  <<01549>>04392000
                         << MUST SPECIFY A SSL OR PROG SEG >>  <<01549>>04394000
                   IF SEG.SEGTYPE = SSL'SEG THEN               <<01549>>04396000
                      BEGIN                                    <<01549>>04398000
                      PENABLE;                                 <<01549>>04400000
                      RESULT := PHYSICALCST(0,TEMP);           <<01549>>04402000
                      PDISABLE;                                <<01549>>04404000
                      IF <> THEN GOTO ER'SEG;                  <<01549>>04406000
                      END                                      <<01549>>04408000
                   ELSE IF SEG.SEGTYPE = PROG'SEG THEN         <<01549>>04410000
                      RESULT := SEG.(8:8) + %301               <<01549>>04412000
                   ELSE GOTO ER'SEG;                           <<01549>>04414000
                   END                                         <<01549>>04416000
                ELSE GOTO ER'PIN;                              <<01549>>04418000
                END;                                           <<01549>>04420000
             SEG := RESULT.(8:8);                              <<01549>>04422000
             END;                                              <<01549>>04424000
          COMMENT:                                             <<01549>>04426000
             MUST MAKE SURE THAT THE PIN IS A VALID            <<01549>>04428000
             PIN NUMBER (IN CASE ABS'SEG SPECIFIED),           <<01549>>04430000
             THAT THE PROCESS IS STILL ALIVE                   <<01549>>04432000
             (IE. THAT REMOVESTOP HASN'T BEEN CALLED)          <<01549>>04434000
             AND THAT WE HAVE A VALID PHYSICAL SEG #.;         <<01549>>04436000
          << VALIDITY CHECKS >>                                <<01549>>04438000
          CASE VALIDATE(PROC.(8:8),SEG) OF                     <<01549>>04440000
             BEGIN                                             <<01549>>04442000
             <<0>>  BEGIN END; << OK >>                        <<01549>>04444000
             <<1>>  GOTO ER'PIN;                               <<01549>>04446000
             <<2>>  GOTO ER'SEG;                               <<01549>>04448000
             END;                                              <<01549>>04450000
          ABS'SEGNUM := SEG;  << SAVE SEGMENT NUMBER >>        <<01549>>04452000
          CLABEL := BUILDSEGID (SEG'ID'TYPE(ABS'SEGNUM),       <<01610>>04454000
                                ABS'SEGNUM,PROC.(8:8));        <<01610>>04456000
          SEG := CONVSEGIDTOSTINX (CLABEL);                    <<01610>>04458000
          TOS _ DSTI'(SEG)&LSR(14);                            <<01610>>04460000
          IF TOS AND NOT LOGICAL(PROC&LSR(14)) THEN GOTO ERR;           04462000
          DUB := PROC.DBLTRAP;                                 <<01549>>04464000
          IF (PLOC+DUB)>=DSTI'(X)&LSL(4)&LSR(2) THEN GOTO ERR;          04466000
          COMMENT:                                             <<01549>>04468000
             GET INSTRUCTION SO THAT WE CAN LATER DETERMINE    <<01549>>04470000
             WHETHER BREAKPOINT IS BEING SET ON TWO-WORD       <<01549>>04472000
             INSTRUCTION;                                      <<01549>>04474000
          IF DSTI'(SEG) < 0 THEN                               <<00873>>04476000
             BEGIN << SEGMENT ABSENT >>                        <<00873>>04478000
             PENABLE;                                          <<00873>>04480000
             SETSEG(FREEZE,ABS'SEGNUM,BANK,PINX);              <<01549>>04482000
             FREEZESEG := TRUE;                                <<00873>>04484000
             PDISABLE;                                         <<00873>>04486000
             END;                                              <<00873>>04488000
          << GET INSTRUCTION >>                                <<00873>>04490000
TOS:=DSTI'(SEG+2);                                             <<01549>>04492000
          TOS := DSTI'(SEG+3) + PLOC;                          <<00873>>04494000
          LMEM;                                                <<00873>>04496000
          INSTR := TOS;                                        <<00873>>04498000
          DDEL;  << REMOVE BANK ADDRESS >>                     <<00873>>04500000
          IF INSTR = %36000 THEN                               <<00873>>04502000
             BEGIN                                             <<00873>>04504000
             << IF ANOTHER PROCESS HAS BRKPNT AT >>            <<00873>>04506000
             << THIS LOC, GET THE INSTRUCTION    >>            <<00873>>04508000
             TESTSTOP(CLABEL,PLOC,PINX);                       <<00873>>04510000
             IF > THEN                                         <<00873>>04512000
                BEGIN                                          <<00873>>04514000
TOS:=DSTI'(SEG+2);                                             <<01549>>04516000
                TOS := DSTI'(SEG+3) + PLOC;                    <<00873>>04518000
                LMEM;                                          <<00873>>04520000
                INSTR := TOS;                                  <<00873>>04522000
                DDEL;  << REMOVE BANK ADDRESS >>               <<00873>>04524000
                END;                                           <<00873>>04526000
             END;                                              <<00873>>04528000
          << SET DB TO BREAKPOINT TABLE              >>        <<01549>>04530000
          << MAKE LOCAL COPY OF ARRAY BEFORE EXCH'DB >>        <<01549>>04532000
          MOVE LOC'COND := COND, (COND(0)+1);                  <<01549>>04534000
          EXCHANGEDB (DEBUGDST);                               <<01549>>04536000
          EXCHDB := TRUE;                                      <<01549>>04538000
          << CHECK FOR SYSTEM/PROCESS CONFLICT          >>     <<01549>>04540000
          << OR SYSTEM/SYSTEM DUPLICATION               >>     <<01549>>04542000
          << SET UP FLAG 'DUB' FOR SEARCH/SCAN ROUTINES >>     <<01549>>04544000
          DUB_DUB+(IF TWO'WORDINSTR(INSTR) THEN 6 ELSE 2);     <<01549>>04546000
          IF SCANSTOP(STOP(SYS'BKPT'EXT'X),CLABEL,PLOC,DUB)    <<01549>>04548000
             <> 0 THEN                                         <<01549>>04550000
                IF LOCALBRKPNT THEN GOTO ERY ELSE GOTO ERZ;    <<01549>>04552000
          IF LOCALBRKPNT THEN                                  <<01549>>04554000
             BEGIN                                             <<01549>>04556000
             << PROCESS-LOCAL BREAKPOINT:       >>             <<01549>>04558000
             << HAS THIS PROCESS BEEN ALLOCATED >>             <<01549>>04560000
             << AN ENTRY IN PCB'EXT TABLE?      >>             <<01549>>04562000
             PRC := PCBSIZE*PROC.(8:8)+PCB'BKPT'WD;            <<01549>>04564000
             PCB'EXT'X := PCBI'(PRC).PCB'BKPT'BITS;            <<01549>>04566000
             IF PCB'EXT'X = 0 THEN                             <<01549>>04568000
                BEGIN << GET EXT. INDEX >>                     <<01549>>04570000
                PCB'EXT'X := GET'BKPT'EXT'X;                   <<01549>>04572000
                IF PCB'EXT'X = 0 THEN GOTO ERX; <<FULL>>       <<01549>>04574000
                END;                                           <<01549>>04576000
             LINK := STOP(PCB'EXT'X);                          <<01549>>04578000
             << CHECK FOR DUPLICATE >>                         <<01549>>04580000
             IF SCANSTOP(LINK,CLABEL,PLOC,DUB) <> 0 THEN       <<01549>>04582000
                GOTO ERZ;                                      <<01549>>04584000
             END                                               <<01549>>04586000
          ELSE                                                 <<01549>>04588000
             BEGIN                                             <<01549>>04590000
             << SYSTEM BREAK-POINT: CHECK FOR CONFLICT >>      <<01549>>04592000
             << WITH PROCESS BREAKPOINT                >>      <<01549>>04594000
             IF SEARCHSTOP(IND'ENT1,CLABEL,PLOC,DUB) <> 0      <<01549>>04596000
                THEN GOTO ERY;                                 <<01549>>04598000
             LINK := STOP(SYS'BKPT'EXT'X);                     <<01549>>04600000
             END;                                              <<01549>>04602000
          << FIGURE OUT SIZE NEEDED FOR ENTRY >>               <<01549>>04604000
          I := MIN'ENT'SIZE + LOC'COND + PROC.LABELBIT;        <<01549>>04606000
          LOC := GET'BKPT'ENTRY (I);                           <<01549>>04608000
          IF LOC = 0 THEN                                      <<01549>>04610000
             BEGIN << BKPT TABLE FULL >>                       <<01549>>04612000
             << RETURN EXT. ENTRY IF GOT NEW ONE >>            <<01549>>04614000
             IF LOCALBRKPNT AND STOP(PCB'EXT'X) = 0 THEN       <<01549>>04616000
                FREE'BKPT'EXT'X (PCB'EXT'X);                   <<01549>>04618000
             GOTO ERX;                                         <<01549>>04620000
             END;                                              <<01549>>04622000
          << SET UP FLAGS WORD-- SIZE FIELD SET BY GETENTRY  >><<01549>>04624000
          I := PROC; << SETS TAG,PRIV,SYS,DBLTRAP BITS >>      <<01549>>04626000
          I.BKPT'VALID := 0;                                   <<01549>>04628000
          I.BKPT'FAKE := 0;                                    <<01549>>04630000
          I.BKPT'TW := IF TWO'WORDINSTR (INSTR) THEN 1         <<01549>>04632000
                       ELSE 0;                                 <<01549>>04634000
          I.BKPT'USERLBL := PROC.LABELBIT;                     <<01549>>04636000
          I.BKPT'PERM := PROC.PERMBIT;                         <<01549>>04638000
          I.BKPT'COND := IF LOC'COND > 0 THEN 1 ELSE 0;        <<01549>>04640000
          I.BKPT'UPDATING := 0;                                <<01549>>04642000
          STOP(LOC).BKPT'FLAGS := I.BKPT'FLAGS;                <<01549>>04644000
          STOP(LOC+CLABELOFFSET) := CLABEL;                    <<01549>>04646000
          STOP(LOC+PLOCOFFSET) := PLOC;                        <<01549>>04648000
          << WILL BE 1ST ENTRY IN CHAIN >>                     <<01549>>04650000
          STOP(LOC+LINKOFFSET) := LINK;                        <<01549>>04652000
                                                               <<01549>>04654000
          << SET UP VARIABLE PART OF ENTRY >>                  <<01549>>04656000
          IF PROC.LABELBIT = 1 THEN                            <<01549>>04658000
             STOP(LOC+USERLBLOFFSET) := PARM;                  <<01549>>04660000
          IF STOP(LOC).BKPT'COND = 1 THEN                      <<01549>>04662000
             BEGIN << COPY CONDITION >>                        <<01549>>04664000
             I := LOC + MIN'ENT'SIZE + PROC.LABELBIT - 1;      <<01549>>04666000
             J := 0;                                           <<01549>>04668000
             WHILE (J:=J+1) <= LOC'COND DO                     <<01549>>04670000
                 STOP(I+J) := LOC'COND(J);                     <<01549>>04672000
             END;                                              <<01549>>04674000
                                                               <<01549>>04676000
          << EVERYTHING OK, ENTER IN BKPT CHAIN >>             <<01549>>04678000
          IF NOT LOCALBRKPNT THEN                              <<01549>>04680000
             BEGIN                                             <<01549>>04682000
             << IF 1ST SYSTEM BREAK POINT THEN MARK >>         <<01549>>04684000
             << SYSTEM BREAK POINTS PRESENT         >>         <<01549>>04686000
             IF STOP(SYS'BKPT'EXT'X) = 0 THEN SYS'BKPT := 1;   <<01549>>04688000
             STOP(SYS'BKPT'EXT'X) := LOC;                      <<01549>>04690000
             END                                               <<01549>>04692000
          ELSE                                                 <<01549>>04694000
             BEGIN                                             <<01549>>04696000
             << 1ST ENTRY IN CHAIN ? >>                        <<01549>>04698000
             IF STOP(PCB'EXT'X) = 0 THEN                       <<01549>>04700000
                PCBI'(PRC).PCB'BKPT'BITS := PCB'EXT'X;         <<01549>>04702000
             STOP(PCB'EXT'X) := LOC;                           <<01549>>04704000
             END;                                              <<01549>>04706000
          << PLACE BREAKPOINT IN CODE >>                       <<01549>>04708000
          MANAGESTOP(LOC,0,PINX);                              <<01549>>04710000
          GOTO FIN;                                                     04712000
                                                               <<01549>>04714000
  ER'SEG: TOS_TOS+1;                                           <<01549>>04716000
  ER'PIN: TOS_TOS+1;                                           <<01549>>04718000
  ERZ:    TOS_TOS+1;                                                    04720000
  ERY:    TOS_TOS+1;                                                    04722000
  ERX:    TOS_TOS+1;                                                    04724000
  ERR:    TOS_TOS+1;                                                    04726000
  FIN:    ENTERSTOP_TOS;                                                04728000
          PENABLE;                                                      04730000
          IF EXCHDB THEN EXCHANGEDB(0);                        <<01549>>04732000
          IF FOUND'EMPTY AND RETURNVAL<>0 THEN UNLOCK'BKPT'TAB;<<01549>>04734000
          RELSIR (BKPTSIR,SAVEBKPTSIR);                        <<01549>>04736000
          IF SAVESEGSIR<>-1 THEN RELSIR (SEGTABSIR,SAVESEGSIR);<<01549>>04738000
          IF FREEZESEG THEN RESETSEG(FREEZE,ABS'SEGNUM,PINX);  <<01549>>04740000
  END;                                                                  04742000
                                                                        04744000
                                                                        04746000
$PAGE " "                                                      <<01007>>04748000
                                                                        04750000
$CONTROL SEGMENT=DEBUG                                         <<01549>>04752000
            << >>                                                       04754000
  <<*************************>>                                         04756000
            << >>                                                       04758000
            << D E B U G (SYSTEMDEBUG) >>                               04760000
            << >>                                                       04762000
  <<*************************>>                                         04764000
            << >>                                                       04766000
PROCEDURE DEBUG;                                                        04768000
  OPTION  PRIVILEGED;                                                   04770000
    BEGIN                                                               04772000
                                                                        04774000
          ENTRY SYSTEMDEBUG;                                            04776000
          ENTRY SNOOP;                                                  04778000
                                                                        04780000
          EQUATE     BRPTCSTN=1,                                        04782000
                     TOOTHPICK=2,                              <<00315>>04784000
                     CHARCR=%15,                               <<01.KM>>04786000
                     CRBLANK=[8/CHARCR,8/" "];                 <<01.KM>>04788000
          EQUATE     CMNPC=0,                                           04790000
                     RMNPR=2,                                           04792000
                     BMNPD=4,                                           04794000
                     BMNPM=6,                                           04796000
                     BMPMD=8,                                           04798000
                     BMPMM=10;                                          04800000
          EQUATE                                               <<01549>>04802000
                     MSG'SYNTAX  = 0,                          <<01549>>04804000
                     MSG'NONO    = 1,                          <<01549>>04806000
                     MSG'BOUNDS  = 2,                          <<01549>>04808000
                     MSG'FULL    = 3,                          <<01549>>04810000
                     MSG'SAME    = 4,                          <<01549>>04812000
                     MSG'CHECK   = 5;                          <<01549>>04814000
          << >>                                                <<01549>>04816000
          << SUBROUTINE EQUATES >>                             <<01549>>04818000
          EQUATE                                               <<01549>>04820000
                     INBUF'END       = 46,                     <<01549>>04822000
                     << 'INFO' INDEXES FOR LOCATION >>         <<01549>>04824000
                     IND'NUM'FIELDS  = INBUF'END+1,            <<01549>>04826000
                     IND'PROCOFFSET  = IND'NUM'FIELDS+1,       <<01549>>04828000
                     IND'LOC'SEGTYPE = IND'PROCOFFSET+1,       <<01549>>04830000
                     IND'PIN'NUM     = IND'LOC'SEGTYPE+1,      <<01549>>04832000
                     IND'DELIM       = IND'PIN'NUM+1,          <<01549>>04834000
                     LAST'IND'LOC    = IND'DELIM,              <<01549>>04836000
                     << 'INFO' INDEXES FOR CONDITION >>        <<01549>>04838000
                     IND'PRIM'INFO   = LAST'IND'LOC+1,         <<01549>>04840000
                     IND'OP'INFO     = IND'PRIM'INFO+1,        <<01549>>04842000
                     LAST'IND'COND   = IND'OP'INFO,            <<01549>>04844000
                     << 'INFO' INDEXES FOR SENDIT    >>        <<01549>>04846000
                     IND'DECOMP'STATE= LAST'IND'COND + 1,      <<01549>>04848000
                     IND'ROW'SIZE    = IND'DECOMP'STATE +1,    <<01549>>04850000
                     LAST'IND'SENDIT = IND'ROW'SIZE,           <<01549>>04852000
                     << 'INFO' INDEX FOR COND'STAK(0:X) >>     <<01549>>04854000
                     IND'COND'STAK   = LAST'IND'SENDIT+1,      <<01549>>04856000
                     IND'WORKAREA    = IND'COND'STAK+          <<01549>>04858000
                                       MAX'COND'SIZE,          <<01549>>04860000
                     LAST'IND        = IND'WORKAREA +          <<01549>>04862000
                                       MAX'BKPT'SIZE;          <<01549>>04864000
          EQUATE                                               <<01549>>04866000
                     << EXPRESSION >>                          <<01549>>04868000
                     INVAL'EXP     = 0,                        <<01549>>04870000
                     VALID'EXP     = 1,                        <<01549>>04872000
                     NULL'EXP      = 2,                        <<01549>>04874000
                     << FIELD >>                               <<01549>>04876000
                     RHSMATCH      = 0,                        <<01549>>04878000
                     LHSMATCH      = 1,                        <<01549>>04880000
                     << L'PRIMARY >>                           <<01549>>04882000
                     CONST'PRIMARY = 0,                        <<01549>>04884000
                     ADDR'PRIMARY  = 1,                        <<01549>>04886000
                     NULL'PRIMARY  = 2,                        <<01549>>04888000
                     IND'PRIMARY   = 3,                        <<01549>>04890000
                     << SENDIT / MODES >>                      <<01549>>04892000
                     CODE          = 4,  << CODE MODE >>       <<01549>>04894000
                     NUM'MODES     = 5,                        <<01549>>04896000
                     OK'OPCODE     = 0,                        <<01549>>04898000
                     INGNORE'WD2   = -1,                       <<01549>>04900000
                     INSTR'1STWORD = 0,                        <<01549>>04902000
                     INSTR'2NDWORD = 1,                        <<01549>>04904000
                     << ASSUME %36000 NOT >>                   <<01549>>04906000
                     << VALID 2ND OP      >>                   <<01549>>04908000
                     BAD'2NDWORD   = %36000,                   <<01549>>04910000
                     INSTR'PER'ROW = 1,                        <<01549>>04912000
                     MAX'INSTR'ROW = 4,                        <<01549>>04914000
                     LEN'CODEFIELD = 16;                       <<01549>>04916000
          << >>                                                <<01549>>04918000
          << SUBROUTINE DEFINES >>                             <<01549>>04920000
          DEFINE                                               <<01549>>04922000
                     << DEFINES FOR FIELD >>                   <<01549>>04924000
                     NULL'FIELDBIT    = (13:1)#,               <<01549>>04926000
                     CRBIT            = (14:1)#,               <<01549>>04928000
                     DELIMBITS        = (14:2)#,               <<01549>>04930000
                     << DEFINES FOR GETTOKEN >>                <<01549>>04932000
                     TOKEN'TYPE       = (8:8)#,                <<01549>>04934000
                     TOKEN'LEN        = (0:8)#,                <<01549>>04936000
                     << DEFINES FOR CONDITION >>               <<01549>>04938000
                     OP1TYPE          = (0:2)#,                <<01549>>04940000
                     OP2TYPE          = (2:2)#,                <<01549>>04942000
                     RELOPTYPE        = (8:8)#,                <<01549>>04944000
                     << DEFINES FOR LOCATION >>                <<01549>>04946000
                     PINFIELD'PRESENT = (NUM'FIELDS >= 3)#,    <<01549>>04948000
                     SEGFIELD'PRESENT = (NUM'FIELDS >= 2)#,    <<01549>>04950000
                     SPECIFIED'PIN    = LOCBIT#;               <<01549>>04952000
          << >>                                                         04954000
          DEFINE     XCR           = %20015#,                  <<01040>>04956000
                     BREAK         = BREAKFLAG.(15:1)#,        <<01040>>04958000
                     DBL'INSTR'ADJ = BREAKFLAG.(14:1)#;        <<01040>>04960000
          << >>                                                         04962000
          ARRAY COMMAND(0:14)=PB_                                       04964000
                      "D ", <<DUMP REGISTERS/MEMORY>>                   04966000
                      "M ", <<MODIFY REGISTERS/MEMORY>>                 04968000
                      "L ", <<SWITCH LIST LOG DEVICE>>                  04970000
                      "B ", <<SET BREAKPOINT>>                          04972000
                      "C ", <<CLEAR BREAKPOINT>>                        04974000
                      "T ", <<TRACE>>                                   04976000
                      "F ", <<FREEZE SEGMENT>>                          04978000
                      "U ", <<UNFREEZE SEGMENT>>                        04980000
                      "R ", <<RETURN>>                                  04982000
                      "= ", <<CALCULATE>>                               04984000
                      "A ", <<ACCEPT BREAKPOINT MODE>>                  04986000
                      "E ", <<EXIT N / TERMINATE>>                      04988000
                      "H ", <<CALL HELP>>                               04990000
                      "$ ", <<SET REG VALUE>>                           04992000
                      "  "; <<FINI>>                                    04994000
          ARRAY REGY(0:REGEND)=PB_                                      04996000
                     "R ", "ST", "X ",                                  04998000
                     "A ", "SY", "V ",                                  05000000
                     "CO", "DA", "DX",                                  05002000
                     "DB", "DL", "Q ", "S ", "Z ",                      05004000
                     "PB", "P ", "PL", "EA",                            05006000
                     "1 ", "2 ", "3 ", "4 ";                            05008000
          ARRAY MASK(0:11)=PB_                                          05010000
                     %176324,0,                                         05012000
                     %060075,%036000,                                   05014000
                     %000173,%100000,                                   05016000
                     %000170,0,                                         05018000
                     %017773,%140000,                                   05020000
                     %014770,%040000;                                   05022000
          ARRAY LIB(0:5)=PB_                                            05024000
                     "A ", <<ABSOLUTE>>                                 05026000
                     "S ", <<SYSTEM SL>>                                05028000
                     "P ", <<PUBLIC SL>>                                05030000
                     "G ", <<GROUP SL>>                                 05032000
                     "  "; <<PROGRAM>>                                  05034000
          ARRAY CHARM(0:4)=PB_                                          05036000
                     "O ",   <<OCTAL>>                                  05038000
                     "I ",   <<DECIMAL>>                                05040000
                     "A ",   <<ASCII>>                                  05042000
                     "H ",   <<HEXIDECIMAL>>                            05044000
                     "C ",   <<CODE>>                          <<01549>>05046000
                     "  ";                                              05048000
          ARRAY SPECIALS(0:SPECIALS'END)=PB_                   <<01549>>05050000
                      "< ",                                    <<01549>>05052000
                      "> ",                                    <<01549>>05054000
                      "= ",                                    <<01549>>05056000
                      "@ ",                                    <<01549>>05058000
                      "# ",                                    <<01549>>05060000
                      ": ",                                    <<01549>>05062000
                      "<=",                                    <<01549>>05064000
                      ">=",                                    <<01549>>05066000
                      "<>";                                    <<01549>>05068000
          ARRAY ERRMSX(0:20)=PB_                                        05070000
                     "SYNTAX",         <<0>>                            05072000
                     "NO-NO ",         <<1>>                            05074000
                     "BOUNDS",         <<2>>                            05076000
                     "FULL  ",         <<3>>                            05078000
                     "SAME  ",         <<4>>                            05080000
                     "CHECK ";         <<5>>                            05082000
          ARRAY READMSG(0:6)=PB_                                        05084000
                     "READ PENDING";                                    05086000
            << >>                                                       05088000
          INTEGER X=X;                                                  05090000
          ARRAY BASE(*)=DB+0;                                           05092000
          ARRAY AS0(*)=S-0;                                    <<01069>>05094000
          ARRAY AS4(*)=S-4;                                    <<01069>>05096000
          INTEGER Q0=Q-0;                                      <<01069>>05098000
          ARRAY STAK(*)=Q+0;                                            05100000
          INTEGER S1=S-1, S2=S-2, S3=S-3, S4=S-4, S5=S-5, S6=S-6;       05102000
          INTEGER S0=S-0, S7=S-7;                                       05104000
          POINTER P1=S-1, P2=S-2, P3=S-3, P4=S-4, P5=S-5, P6=S-6;       05106000
          BYTE B1=S-1;                                                  05108000
          BYTE POINTER BPS0=S-0;                               <<01549>>05110000
          INTEGER USERS=Q-4, XREGISTER=Q-3, DELTAP=Q-2,                 05112000
                  MARK=Q+0;                                             05114000
          LOGICAL BREAKFLAG;       <<=Q+1>>                    <<01040>>05116000
          LOGICAL EXIT'TO'TRAP;    << USER TRAP >>             <<01069>>05118000
          INTEGER PLABEL;                                      <<01069>>05120000
          INTEGER J;               <<SUBR LOCALS>>                      05122000
          INTEGER NEG;                                                  05124000
          LOGICAL EXPRLAB;         <<EXPRESSION SUBR LABEL>>            05126000
          LOGICAL CONTLAB;         <<CONTENTS SUBR LABEL>>              05128000
          LOGICAL RVALLAB;         <<REGVALUE SUBR LABEL>>              05130000
          LOGICAL PRINTFLAG,LDEV,DEVICE,FNUM;                           05132000
          LOGICAL PRIV,SYS,DUMPFLAG,FLAG,SYSBRK,CRIT;                   05134000
          INTEGER I,K,CHAR,INDEX,SEG,MODE,DISPL,CNT,RCNT;               05136000
          INTEGER CHMODE,INX,PINX,BANK,CLABEL;                          05138000
          LOGICAL FLAGX,FLAGY,WARN;                                     05140000
          INTEGER SEGX,DISPLX;                                          05142000
          BYTE POINTER PINFO,POUT,PIN'LOC,SEG'LOC,PROCDESIG;   <<01549>>05144000
          POINTER COND'STAK;                                   <<01549>>05146000
          ARRAY   REG(0:REGEXX)=Q;                                      05148000
          ARRAY   TEMP(0:7)=Q;                                          05150000
          INTEGER    RPCB=REG+REGR   ,RSTK=REG+REGDB  ,                 05152000
                     RBNK=REG+REGBNK ,                                  05154000
                     RDBV=REG+REGDBV ,RDBX=REG+REGDBX ,                 05156000
                     RX  =REG+REGX   ,RST =REG+REGST  ,                 05158000
                     RDL =REG+REGDL  ,RQ  =REG+REGQ   ,                 05160000
                     RS  =REG+REGS   ,RZ  =REG+REGZ   ,                 05162000
                     RCST=REG+REGPB  ,RP  =REG+REGP   ,                 05164000
                     RPL =REG+REGPL , REA =REG+REGEA,                   05166000
                     RLOG=REG+REGLOG ,RDX =REG+REGDX  ,                 05168000
                     RTC =REG+REGTC  ,RTL =REG+REGTL  ,                 05170000
                     RTP =REG+REGTP  ;                                  05172000
          INTEGER    STTLEN;   <<LENGTH OF STT>>               <<00180>>05174000
          DOUBLE  DRDBV=RBNK;                                           05176000
          INTEGER MAXSTACK; << MAXIMUM STK RELATIVE TO DB >>   <<01.03>>05178000
          INTEGER POINTER PCBX,PXFIX,P;                        <<01.03>>05180000
          EQUATE PXMAX = 13,  << MAXDATA INDEX IN PXFIX >>     <<00445>>05182000
                 QINIT = 3;   << INITIAL Q INDEX IN PXFIX >>   <<00445>>05184000
          COMMENT:        **** WARNING ****                    <<01069>>05186000
                   ARRAY INFO MUST BE DECLARED LAST;           <<01069>>05188000
          ARRAY   INFO(0:LAST'IND)=Q;                          <<01549>>05190000
                                                               <<01549>>05192000
          << SUBROUTINE LOCALS >>                              <<01549>>05194000
          DEFINE                                               <<01549>>05196000
                     << LOCATION >>                            <<01549>>05198000
                     NUM'FIELDS    = INFO(IND'NUM'FIELDS)#,    <<01549>>05200000
                     PROCOFFSET'OK = INFO(IND'PROCOFFSET)#,    <<01549>>05202000
                     LOC'SEGTYPE   = INFO(IND'LOC'SEGTYPE)#,   <<01549>>05204000
                     PIN'NUM       = INFO(IND'PIN'NUM)#,       <<01549>>05206000
                     DELIM         = INFO(IND'DELIM)#,         <<01549>>05208000
                     << CONDITION >>                           <<01549>>05210000
                     PRIM'INFO     = INFO(IND'PRIM'INFO)#,     <<01549>>05212000
                     OP'INFO       = INFO(IND'OP'INFO)#,       <<01549>>05214000
                     << SENDIT >>                              <<01549>>05216000
                     DECOMP'STATE  = INFO(IND'DECOMP'STATE)#,  <<01549>>05218000
                     ROW'SIZE      = INFO(IND'ROW'SIZE)#,      <<01549>>05220000
                     << GENERAL SUBROUTINE TEMP >>             <<01549>>05222000
                     S'TEMP        = INFO(LAST'IND)#;          <<01549>>05224000
            << >>                                                       05226000
          SWITCH SWCOM_ DUMPL  ,MODIFYL,LISTL  ,BREAKL ,CLEARL ,        05228000
                        TRACEL ,FREEZL ,UNFRZL ,RETURNL,                05230000
                        CALCL  ,ACCEPT ,EXITL  ,HELPL  ,SETRL  ;        05232000
          SWITCH MRSW _ LLNO,LLST,LLXR,                                 05234000
                        LLNO,LLNO,LLNO,                                 05236000
                        LLNO,LLNO,LLNO,                                 05238000
                        LLNO,LLDL,LLQ ,LLS ,LLZ ,                       05240000
                        LLNO,LLP ,LLNO,LLNO,                            05242000
                        LLN ,LLN ,LLN ,LLN ;                            05244000
$PAGE "          I/O SUBROUTINES"                              <<01007>>05246000
            << >>                                                       05248000
  SUBROUTINE CLEAR;          <<CLEAR BUFFER>>                           05250000
    BEGIN                                                               05252000
          INFO_"  ";                                                    05254000
          MOVE INFO(1)_INFO,(46);                                       05256000
          TOS_@INFO&LSL(1);                                             05258000
          ASSEMBLE(DUP);                                                05260000
          @PINFO_TOS;                                                   05262000
          @POUT_TOS+2;                                                  05264000
    END;                                                                05266000
            << >>                                                       05268000
  SUBROUTINE GETCHAR;              <<SCAN TO NON BLANK OR CR>>          05270000
    BEGIN                                                               05272000
          IF LOGICAL(PINFO)=CHARCR THEN RETURN;                         05274000
          TOS_X;                                                        05276000
          SCAN PINFO(1) WHILE " ",1;                                    05278000
          @PINFO_TOS;                                                   05280000
          X_TOS;                                                        05284000
    END;                                                                05286000
            << >>                                                       05288000
  SUBROUTINE TYPE;                 <<TYPE PROMPT LINE - NO CRLF>>       05290000
    BEGIN                                                               05292000
          TOS_@INFO(1)&LSL(1)-@POUT;                                    05294000
          TOS_0D;                                                       05296000
          TOS_PRINTFLAG;                                                05298000
          IF = THEN                                                     05300000
               BEGIN DEL;                                               05302000
                     TOS_LDEV.(8:8);                                    05304000
               END;                                                     05306000
      IF SYS>1 THEN <<NEED TO BE IN CONSOLE MODE>>             <<00601>>05308000
      BEGIN                                                    <<00601>>05310000
         ASSEMBLE(DUP,DZRO); ASSEMBLE(CAB);                    <<00601>>05312000
         ATTACHIO(*,0,0,0,31,0,1,0,%411);<<CONSOLE MODE>>      <<00601>>05314000
         ATTACHIO(*,0,0,@INFO(1),1,S3,%320,0,%401);<<DO PROMPT><<00601>>05316000
      END                                                      <<00601>>05318000
      ELSE <<NORMAL I/O>>                                      <<00601>>05320000
          ATTACHIO(*,0,0,@INFO(1),1,S3,%320,0,1);                       05322000
          DEL;                                                          05324000
    END;                                                                05326000
            << >>                                                       05328000
  SUBROUTINE OUTPUT;                 <<OUTPUT LINE TO DEV>>             05330000
    BEGIN                                                               05332000
          X_47;                                                         05334000
          WHILE (X_X-1)>1 DO                                            05336000
               IF INFO(X)<>"  " THEN GOTO L;                            05338000
    L:    TOS_X;                                                        05340000
          TOS_0D;                                                       05342000
          TOS_PRINTFLAG;                                                05344000
          IF < THEN                                                     05346000
               BEGIN FWRITE(FNUM,INFO(1),S3,0);                         05348000
                     ASSEMBLE(DDEL,DDEL);                               05350000
                     RETURN;                                            05352000
               END;                                                     05354000
          IF = THEN                                                     05356000
               BEGIN DEL;                                               05358000
                     TOS_LDEV.(8:8);                                    05360000
               END;                                                     05362000
      ATTACHIO(*,0,0,@INFO(1),1,S3,0,0,(IF SYS>1 THEN %401 ELSE 1));    05364000
          DEL;                                                          05366000
    END;                                                                05368000
            << >>                                                       05370000
  SUBROUTINE INPUT;                <<TERMINAL INPUT>>                   05372000
    BEGIN                                                               05374000
    LL:   CLEAR;                                                        05376000
      TOS:=ATTACHIO(LDEV.(0:8),0,0,@INFO(1),0,34,5,0,          <<00601>>05378000
                    (IF SYS>1 THEN %401  ELSE 1));             <<00601>>05380000
          DEL;                                                          05382000
   IF TOS.(8:8)=%173 AND PCBI'(PINX+RESABORTWD).               <<01549>>05384000
      CRITFLAG = 0 THEN                                        <<01549>>05386000
             BEGIN CLEAR;                                               05388000
                   MOVE INFO(2)_READMSG(0),(6);                         05390000
                   OUTPUT;                                              05392000
                   GOTO LL;                                             05394000
             END;                                                       05396000
      IF SYS>1 THEN ATTACHIO(LDEV.(0:8),0,0,0,31,0,0,0,%401);  <<00803>>05398000
          X_47;                                                         05400000
          WHILE(X_X-1)>0 DO                                             05402000
               IF INFO(X)<>"  " THEN GOTO L;                            05404000
    L:    INFO(X_X+1)_XCR;                                              05406000
          GETCHAR;                                                      05408000
    END;                                                                05410000
            << >>                                                       05412000
  SUBROUTINE LINE;                   <<LINE SPACE>>                     05414000
    BEGIN                                                               05416000
          CLEAR;                                                        05418000
          OUTPUT;                                                       05420000
    END;                                                                05422000
            << >>                                                       05424000
  LOGICAL SUBROUTINE GETSTRING;                                         05426000
          <<RETURNS - 0 CR, 1 OK, 2 ">>                                 05428000
    BEGIN                                                               05430000
          @PINFO_@PINFO+1;                                              05432000
          TOS_1;                                                        05436000
          IF LOGICAL(PINFO)=CHARCR THEN TOS_TOS-1;                      05438000
          IF PINFO=%42 THEN TOS_TOS+1;                                  05440000
          S2_TOS;                                                       05442000
    END;                                                                05444000
            << >>                                              <<01549>>05446000
  SUBROUTINE GETTOKEN (TOKEN,DESCRIPTOR,STATE);                <<01549>>05448000
    VALUE STATE;                                               <<01549>>05450000
    INTEGER STATE, DESCRIPTOR;                                 <<01549>>05452000
    BYTE POINTER TOKEN;                                        <<01549>>05454000
    BEGIN                                                      <<01549>>05456000
    COMMENT:                                                   <<01549>>05458000
          THIS ROUTINE GETS THE NEXT TOKEN AND RETURNS         <<01549>>05460000
          A BYTE POINTER TO IT IN TOKEN.  STATE INDICATES      <<01549>>05462000
          WHETHER OR NOT BLANKS ARE IMPORTANT, AND THUS        <<01549>>05464000
          AFFECTS THE DEFINITION OF IDENTIFIERS. FOR STATE=0   <<01549>>05466000
          BLANKS ARE NOT IMPORTANT ( G 1. = G1.) AND           <<01549>>05468000
          IDENTIFIERS CONSIST OF ALPHA CHARACTERS ONLY.        <<01549>>05470000
          WHEN STATE=1 BLANKS ARE SIGNIFICANT AND IDENT.       <<01549>>05472000
          CONSIST OF ALPHANUMERICS AND "'"S. DESCRIPTOR IS     <<01549>>05474000
          DEFINED AS FOLLOWS:                                  <<01549>>05476000
             DESCRIPTOR.(8:8) = TOKEN NUMBER                   <<01549>>05478000
             DESCRIPTOR.(0:8) = TOKEN LENGTH <<IDENT&NUM ONLY>><<01549>>05480000
          CONVENTIONS:                                         <<01549>>05482000
             THIS ROUTINE ASSUMES PINFO IS POINTING TO THE     <<01549>>05484000
             FIRST CHARACTER OF THE TOKEN TO BE RETURNED.      <<01549>>05486000
             IT LEAVES PINFO POINTING TO THE 1ST CHARACTER     <<01549>>05488000
             OF THE NEXT TOKEN.;                               <<01549>>05490000
                                                               <<01549>>05492000
          @TOKEN := @PINFO;  << RETURN POINTER >>              <<01549>>05494000
          DESCRIPTOR.TOKEN'TYPE := T'INVALID;                  <<01549>>05496000
                                                               <<01549>>05498000
          IF PINFO = ALPHA THEN                                <<01549>>05500000
             BEGIN                                             <<01549>>05502000
             IF STATE=0 THEN                                   <<01549>>05504000
                BEGIN                                          <<01549>>05506000
                MOVE PINFO:=PINFO WHILE A,1;                   <<02344>>05508000
                @PINFO := TOS-1;                               <<01549>>05510000
                END                                            <<01549>>05512000
             ELSE                                              <<01549>>05514000
                BEGIN                                          <<01549>>05516000
                TOS := @PINFO-1; << SET UP POINTER >>          <<01549>>05518000
                DO                                             <<01549>>05520000
                  BEGIN                                        <<01549>>05522000
                  @BPS0 := @BPS0+1;                            <<01549>>05524000
                  MOVE * := BPS0 WHILE AN,1;                   <<02344>>05526000
                  END                                          <<01549>>05528000
                UNTIL PINFO <> "'";                            <<01549>>05530000
                @PINFO := TOS-1;                               <<01549>>05532000
                END;                                           <<01549>>05534000
             DESCRIPTOR.TOKEN'TYPE := T'IDENT;                 <<01549>>05536000
             DESCRIPTOR.TOKEN'LEN := @PINFO-@TOKEN+1;          <<01549>>05538000
             GETCHAR;  << PINFO SET TO BEGINNING NEXT TOKEN >> <<01549>>05540000
             END                                               <<01549>>05542000
          ELSE IF PINFO=NUMERIC OR PINFO="%" OR PINFO="#" THEN <<01549>>05544000
             BEGIN                                             <<01549>>05546000
             IF PINFO="#" OR PINFO="%" THEN GETCHAR;<<SKIP#-%>><<01549>>05548000
             WHILE PINFO=NUMERIC DO @PINFO := @PINFO+1;        <<01549>>05550000
             @PINFO := @PINFO-1;                               <<01549>>05552000
             DESCRIPTOR.TOKEN'TYPE := T'NUMBER;                <<01549>>05554000
             DESCRIPTOR.TOKEN'LEN := @PINFO-@TOKEN+1;          <<01549>>05556000
             GETCHAR; << PINFO SET TO BEGINNING NEXT TOKEN >>  <<01549>>05558000
             END                                               <<01549>>05560000
          ELSE  << SPECIAL >>                                  <<01549>>05562000
             BEGIN                                             <<01549>>05564000
             X := -1;                                          <<01549>>05566000
             WHILE (X:=X+1) < NUM'SPECIALS AND                 <<01549>>05568000
                   LOGICAL(PINFO) <> SPECIALS(X)&LSR(8) DO     <<01549>>05570000
                BEGIN END;                                     <<01549>>05572000
             IF X < NUM'SPECIALS THEN                          <<01549>>05574000
                BEGIN << HAD A MATCH >>                        <<01549>>05576000
                DESCRIPTOR.TOKEN'TYPE := X+FIRSTSPECIAL;       <<01549>>05578000
                IF DESCRIPTOR.TOKEN'TYPE = T'LT THEN           <<01549>>05580000
                   BEGIN << CHECK FOR "<>" & "<=" >>           <<01549>>05582000
                   GETCHAR;                                    <<01549>>05584000
                   IF PINFO = ">" THEN                         <<01549>>05586000
                      BEGIN                                    <<01549>>05588000
                      DESCRIPTOR.TOKEN'TYPE := T'NEQ;          <<01549>>05590000
                      GETCHAR;                                 <<01549>>05592000
                      END                                      <<01549>>05594000
                   ELSE IF PINFO = "=" THEN                    <<01549>>05596000
                      BEGIN                                    <<01549>>05598000
                      DESCRIPTOR.TOKEN'TYPE := T'LTE;          <<01549>>05600000
                      GETCHAR;                                 <<01549>>05602000
                      END;                                     <<01549>>05604000
                   END                                         <<01549>>05606000
                ELSE IF DESCRIPTOR.TOKEN'TYPE = T'GT THEN      <<01549>>05608000
                   BEGIN << CHECK FOR ">=" >>                  <<01549>>05610000
                   GETCHAR;                                    <<01549>>05612000
                   IF PINFO = "=" THEN                         <<01549>>05614000
                      BEGIN                                    <<01549>>05616000
                      DESCRIPTOR.TOKEN'TYPE := T'GTE;          <<01549>>05618000
                      GETCHAR;                                 <<01549>>05620000
                      END;                                     <<01549>>05622000
                   END                                         <<01549>>05624000
                ELSE GETCHAR;                                  <<01549>>05626000
                END;                                           <<01549>>05628000
             END;                                              <<01549>>05630000
                                                               <<01549>>05632000
    END; << GETTOKEN >>                                        <<01549>>05634000
                                                               <<01549>>05636000
            << >>                                              <<01549>>05638000
  INTEGER SUBROUTINE NEXTTOKEN;                                <<01549>>05640000
    BEGIN                                                      <<01549>>05642000
    COMMENT:                                                   <<01549>>05644000
          THIS ROUTINE RETURNS THE TYPE OF THE NEXT            <<01549>>05646000
          TOKEN.                                               <<01549>>05648000
          CONVENTIONS:                                         <<01549>>05650000
             ENTRY&   PINFO IS POINTING TO 1ST CHARACTER       <<01549>>05652000
             EXIT:    OF NEXT TOKEN.;                          <<01549>>05654000
                                                               <<01549>>05656000
          NEXTTOKEN := T'INVALID;                              <<01549>>05658000
          IF PINFO=ALPHA THEN NEXTTOKEN := T'IDENT             <<01549>>05660000
          ELSE IF PINFO=NUMERIC OR PINFO="#" OR PINFO="%" THEN <<01549>>05662000
             NEXTTOKEN := T'NUMBER                             <<01549>>05664000
          ELSE << SPECIAL >>                                   <<01549>>05666000
             BEGIN                                             <<01549>>05668000
             X := -1;                                          <<01549>>05670000
             WHILE (X:=X+1) < NUM'SPECIALS AND                 <<01549>>05672000
                   LOGICAL(PINFO) <> SPECIALS(X)&LSR(8) DO     <<01549>>05674000
                BEGIN END;                                     <<01549>>05676000
             IF X < NUM'SPECIALS THEN                          <<01549>>05678000
                BEGIN                                          <<01549>>05680000
                NEXTTOKEN := X+FIRSTSPECIAL;                   <<01549>>05682000
                IF PINFO = "<" THEN                            <<01549>>05684000
                   BEGIN << CHECK FOR "<>" OR "<=" >>          <<01549>>05686000
                   SCAN PINFO(1) WHILE " ",1;                  <<01549>>05688000
                   IF BPS0 = ">" THEN                          <<01549>>05690000
                      BEGIN                                    <<01549>>05692000
                      DEL;                                     <<01549>>05694000
                      NEXTTOKEN := T'NEQ;                      <<01549>>05696000
                      END                                      <<01549>>05698000
                   ELSE IF BPS0 = "=" THEN                     <<01549>>05700000
                      BEGIN                                    <<01549>>05702000
                      DEL;  << DELETE POINTER >>               <<01549>>05704000
                      NEXTTOKEN := T'LTE;                      <<01549>>05706000
                      END                                      <<01549>>05708000
                   ELSE DEL; << REMOVE BYTE POINTER >>         <<01549>>05710000
                   END                                         <<01549>>05712000
                ELSE IF PINFO = ">" THEN                       <<01549>>05714000
                   BEGIN << CHECK FOR ">=" >>                  <<01549>>05716000
                   SCAN PINFO(1) WHILE " ",1;                  <<01549>>05718000
                   IF BPS0 = "=" THEN                          <<01549>>05720000
                      BEGIN                                    <<01549>>05722000
                      DEL; << DELETE POINTER >>                <<01549>>05724000
                      NEXTTOKEN := T'GTE;                      <<01549>>05726000
                      END                                      <<01549>>05728000
                   ELSE DEL; << DELETE BYTE POINTER >>         <<01549>>05730000
                   END                                         <<01549>>05732000
                END;                                           <<01549>>05734000
             END;                                              <<01549>>05736000
                                                               <<01549>>05738000
    END; << NEXTTOKEN >>                                       <<01549>>05740000
            << >>                                              <<01549>>05742000
  LOGICAL SUBROUTINE OCTAL;        <<ASCII TO OCTAL IN X>>     <<01549>>05744000
          <<RETURNS - 0 ERROR, 1 OK, 2 NULL >>                          05746000
    BEGIN                                                               05748000
          X_0;                                                          05750000
          TOS_0;                                                        05752000
          IF PINFO=%42 THEN            <<">>                            05754000
               BEGIN TOS_1;                                             05756000
                     TOS_0;                                             05758000
                     TOS_GETSTRING;                                     05760000
                     TOS_TOS-1;                                         05762000
                     DEL;                                               05764000
                     IF < THEN GOTO LZ;                                 05766000
                     IF > THEN GOTO LA;                                 05768000
                     TOS_PINFO;                                         05770000
                     TOS_TOS LOR TOS;                                   05772000
                     TOS_GETSTRING;                                     05774000
                     TOS_TOS-1;                                         05776000
                     DEL;                                               05778000
                     IF < THEN GOTO LZ;                                 05780000
                     IF > THEN GOTO LA;                                 05782000
                     TOS_TOS&LSL(8);                                    05784000
                     TOS_PINFO;                                         05786000
                     TOS_TOS LOR TOS;                                   05788000
                     TOS_GETSTRING;                                     05790000
                     IF TOS<>2 THEN GOTO LZ;                            05792000
    LA:              ASSEMBLE(DUP,STAX);                                05794000
                     GETCHAR;                                           05796000
                     GOTO LX;                                           05798000
               END;                                                     05800000
          IF PINFO="#" THEN                                             05802000
               BEGIN TOS_TOS+1;                                         05804000
                     GETCHAR;                                           05806000
                     GOTO LL;                                           05808000
               END;                                                     05810000
          IF PINFO="%" THEN GETCHAR;                                    05812000
    LL:   TOS_2;                                                        05814000
    L:    TOS_PINFO;                                                    05816000
          IF <= THEN GOTO LX;                                           05818000
          TOS_TOS LAND %17;                                             05820000
          ASSEMBLE(DUP);                                                05822000
          IF LOGICAL(S3) THEN                                           05824000
               BEGIN IF TOS>9 THEN GOTO LX;                             05826000
                     TOS_10;                                            05828000
               END ELSE                                                 05830000
               BEGIN IF TOS>7 THEN GOTO LX;                             05832000
                     TOS_8;                                             05834000
               END;                                                     05836000
          TOS_X;                                                        05838000
          ASSEMBLE(LMPY);                                               05840000
          ASSEMBLE(XCH,DEL);                                            05842000
          IF <> THEN GOTO LY;                                           05844000
          TOS_TOS+TOS;                                                  05846000
          IF LOGICAL(S2) THEN                                           05848000
               BEGIN ASSEMBLE(TEST);                                    05850000
                     IF < THEN GOTO LZ;                                 05852000
               END;                                                     05854000
          X_TOS;                                                        05856000
          GETCHAR;                                                      05858000
          DEL;                                                          05860000
          TOS_1;                                                        05862000
          GOTO L;                                                       05864000
    LY:   DEL;                                                          05866000
    LZ:   ASSEMBLE(ZROB);                                               05868000
    LX:   ASSEMBLE(DEL,DELB);                                           05870000
          S2_TOS;                                                       05872000
    END;                                                                05874000
$PAGE "          ARITHMETIC SYNTAX ANALYZER AND EVALUATOR"     <<01007>>05876000
  LOGICAL SUBROUTINE FACTOR;       <<RESULT IN X>>                      05878000
          <<RETURNS - 0 ERROR, 1 OK, 2 NULL >>                          05880000
    BEGIN                                                               05882000
          IF PINFO="(" THEN GOTO L;                                     05884000
          IF PINFO="'" THEN GOTO L1;                                    05886000
          IF PINFO="$" THEN GOTO L2;                                    05888000
          TOS_OCTAL;                                                    05890000
          ASSEMBLE(DUP);                                                05892000
          IF NOT LOGICAL(TOS) THEN                                      05894000
             BEGIN S2_TOS; RETURN; END;                                 05896000
          DEL;                                                          05898000
          GOTO LX;                                                      05900000
    L:    GETCHAR;                                                      05902000
          TOS_0;                                                        05904000
          TOS_EXPRLAB;                                                  05906000
          ASSEMBLE(SCAL 0);                                             05908000
          IF NOT LOGICAL(TOS) THEN RETURN;                              05910000
          IF PINFO<>")" THEN RETURN;                                    05912000
          GETCHAR;                                                      05914000
          GOTO LX;                                                      05916000
    L1:   GETCHAR;                                                      05918000
          TOS_0;                                                        05920000
          TOS_CONTLAB;                                                  05922000
          ASSEMBLE(SCAL 0);                                             05924000
          IF NOT LOGICAL(TOS) THEN RETURN;                              05926000
          IF PINFO<>"'" THEN RETURN;                                    05928000
          GETCHAR;                                                      05930000
          GOTO LX;                                                      05932000
    L2:   GETCHAR;                                                      05934000
          TOS_0;                                                        05936000
          TOS_RVALLAB;                                                  05938000
          ASSEMBLE(SCAL 0);                                             05940000
          IF NOT LOGICAL(TOS) THEN RETURN;                              05942000
          GOTO LX;                                                      05944000
    LX:   IF PINFO="!" THEN                                             05946000
             BEGIN GETCHAR;                                             05948000
                   IF PINFO<>"(" THEN RETURN;                           05950000
                   GETCHAR;                                             05952000
                   TOS_X;                                               05954000
                   TOS_0;                                               05956000
                   TOS_EXPRLAB;                                         05958000
                   ASSEMBLE(SCAL 0);                                    05960000
                   IF NOT LOGICAL(TOS) OR PINFO<>":" THEN               05962000
                      BEGIN DEL; RETURN; END;                           05964000
                   GETCHAR;                                             05966000
                   TOS_X;                                               05968000
                   TOS_0;                                               05970000
                   TOS_EXPRLAB;                                         05972000
                   ASSEMBLE(SCAL 0);                                    05974000
                   IF NOT LOGICAL(TOS) OR PINFO<>")" THEN               05976000
                      BEGIN DDEL; RETURN; END;                          05978000
                   GETCHAR;                                             05980000
                   TOS_%26400;                                          05982000
                   ASSEMBLE(XCH);                                       05984000
                   TOS.( 8:4)_TOS;                                      05986000
                   TOS.(12:4)_X;                                        05988000
                   ASSEMBLE(XCH);                                       05990000
                   ASSEMBLE(XEQ 1);                                     05992000
                   X_TOS;                                               05994000
                   DEL;                                                 05996000
             END;                                                       05998000
          FACTOR_1;                                                     06000000
          RETURN;                                                       06002000
    END;                                                                06004000
           << >>                                                        06006000
  LOGICAL SUBROUTINE OPER(S);      <<CHAR TERMINATORS>>                 06008000
COMMENT:                                                       <<01007>>06010000
  FUNCTION: Test the next byte in the input buffer against     <<01007>>06012000
            two bytes in the parameter S.                      <<01007>>06014000
  INPUT: S=>Integer by value: Usually contains 2 ASCII chars   <<01007>>06016000
  OUTPUT: OPER=>Specifies which, if either, of the two bytes   <<01007>>06018000
                in S matches the next character in the input   <<01007>>06020000
                buffer "PINFO".   0=>No match                  <<01007>>06022000
                                  1=>Matches left byte of S    <<01007>>06024000
                                  2=>Matches right byte of S   <<01007>>06026000
  ;                                                            <<01007>>06028000
    VALUE   S;                                                          06030000
    INTEGER S;                                                          06032000
    BEGIN                                                               06034000
          IF INTEGER(PINFO)=S.(0:8) THEN                                06036000
               BEGIN TOS_1; GOTO L; END;                                06038000
          IF INTEGER(PINFO)=S.(8:8) THEN                                06040000
               BEGIN TOS_2; GOTO L; END;                                06042000
          TOS_0;                                                        06044000
    L:    S3_TOS;                  <<OPER>>                             06046000
    END;                                                                06048000
            << >>                                                       06050000
  LOGICAL SUBROUTINE TERM;         <<RESULT IN X>>                      06052000
Comment:                                                       <<01007>>06054000
  FUNCTION:Evaluate a single term of an arithmetic expression  <<01007>>06056000
           doing the multiply, devide, & calculations within   <<01007>>06058000
           parenthesis.                                        <<01007>>06060000
  OUTPUT:Value of expression is contained in the X-register.   <<01007>>06062000
        TERM => Indicates type of arithmetic term encountered  <<01007>>06064000
                0=>Invalid term or error                       <<01007>>06066000
                1=>Valid term      OK                          <<01007>>06068000
                2=>Null term                                   ((DL114))06070000
  ;                                                            <<01007>>06072000
    BEGIN                                                               06074000
          TERM_FACTOR;                                                  06076000
          IF NOT LOGICAL(S1) THEN RETURN;                               06078000
          TOS_X;                                                        06080000
          GOTO LL;                                                      06082000
    L:    GETCHAR;                                                      06084000
          IF NOT FACTOR THEN GOTO L2;                                   06086000
          IF TOS=1 THEN TOS_TOS*X ELSE                                  06088000
               IF X=0 THEN GOTO L1                                      06090000
                      ELSE TOS_TOS/X;                                   06092000
    LL:   TOS_OPER("*/");                                               06094000
          ASSEMBLE(TEST);                                               06096000
          IF <> THEN GOTO L;                                            06098000
          DEL;                                                          06100000
          X_TOS;                                                        06102000
          RETURN;                                                       06104000
    L2:   DEL;                                                          06106000
    L1:   DEL;                                                          06108000
          TERM_0;                                                       06110000
    END;                                                                06112000
            << >>                                                       06114000
  LOGICAL SUBROUTINE EXPRESSION;   <<RESULT IN X>>                      06116000
Comment:                                                       <<01007>>06118000
  FUNCTION:Evaluate an arithmetic expression of the form       <<01007>>06120000
           Term +or- Term  Where "Term" can be a single numeric<<01007>>06122000
           value, Term*Term, Term/Term, or (Term).             <<01007>>06124000
  OUTPUT:  Value of expression in X-register.                  <<01007>>06126000
   EXPRESSION=>Validity of expression syntax  0=>Error         <<01007>>06128000
                                              1=>Valid         <<01007>>06130000
                                              2=>Null          <<01007>>06132000
  ;                                                            <<01007>>06134000
    BEGIN                                                               06136000
          EXPRESSION_1;                                                 06138000
          TOS:=0;           <<Accumulator of expression value>><<01007>>06140000
          TOS:=OPER("+-");          <<Valid leading operators>><<01007>>06142000
          ASSEMBLE(TEST);                                               06144000
          IF <> THEN GOTO L;                                            06146000
          DDEL;                  <<Not +or- better be numeric>><<01007>>06148000
          EXPRESSION_TERM;                                              06150000
          IF NOT LOGICAL(S1) THEN RETURN;   <<Invalid of null>><<01007>>06152000
          TOS:=X;                             <<Value of term>><<01007>>06154000
          GOTO LL;                                                      06156000
    L:    GETCHAR;                    <<Bypass +or- character>><<01007>>06158000
          IF NOT TERM THEN GOTO L2;                            <<01007>>06160000
                         <<Must be a term after a +- operator>><<01007>>06162000
          IF TOS=1 THEN TOS:=TOS+X        <<Add term to accum>><<01007>>06164000
                   ELSE                                                 06166000
                    BEGIN                                               06168000
                     TOS _ TOS-X;                                       06170000
                     NEG:=1;<<This is a global flag to signal>><<01007>>06172000
                     <<a special type of syntax error in some>><<01007>>06174000
                                                   <<commands>><<01007>>06176000
                    END;                                                06178000
    LL:   TOS_OPER("+-");                                               06180000
          ASSEMBLE(TEST);                                               06182000
          IF <> THEN GOTO L;                                            06184000
          DEL;  <<Something other than +or- between two terms>><<01007>>06186000
                                                 <<is invalid>><<01007>>06188000
          X:=TOS;              <<Set expression value to zero>><<01007>>06190000
          RETURN;                                                       06192000
    L2:   DDEL;                                                         06194000
          EXPRESSION_0;                                                 06196000
    END;                                                                06198000
            << >>                                              <<01549>>06200000
            << >>                                                       06202000
  LOGICAL SUBROUTINE FIELD(F');    <<RESULT IN X>>                      06204000
Comment:                                                       <<01007>>06206000
  FUNCTION:Evaluate field of a debug command with the general  <<01007>>06208000
          format: Expression Delimiter  Where "Expression" is  <<01007>>06210000
          defined under the subroutine of the same name and    <<01007>>06212000
          "Delimiter" is either a carriage return or one of two<<01007>>06214000
          special delimiting characters specified in F'.       <<01007>>06216000
  OUTPUT:X-register is set by EXPRESSION.                      <<01007>>06218000
        FIELD=>The syntax of the expression and the delimiter  <<01007>>06220000
        0=>Valid syntax delimited by right byte of F'          <<01007>>06222000
        1=>Valid syntax delimited by left byte of F'           <<01007>>06224000
        2=>Valid syntax delimited by CR                        <<01007>>06226000
        3=>Unused                                              <<01007>>06228000
          4=>Invalid                   Right                   <<01007>>06230000
          5=>Invalid                   Left                    <<01007>>06232000
          6=>Invalid                   CR                      <<01007>>06234000
          SPECIAL CASE:If signbit of F' is set, any delimiter  <<01007>>06236000
                          will due and                         <<01007>>06238000
          2=>Valid expression with any delimiter               <<01007>>06240000
          6=>Null expression with any delimiterR               <<01007>>06242000
  ;                                                            <<01007>>06244000
    VALUE   F';                                                         06246000
    INTEGER F';                                                         06248000
    BEGIN                                                               06250000
          TOS_EXPRESSION;                                               06252000
          TOS_(TOS-1)&LSL(2);                                           06254000
          IF < THEN GOTO ERROR;       <<Zero return from EXPR>><<01007>>06256000
          TOS_OPER(S2.(1:15));                                          06258000
          TOS_TOS-1;                                                    06260000
          IF < THEN GOTO L;           <<Zero return from OPER>><<01007>>06262000
          GETCHAR;                                                      06264000
          GOTO LX;                                                      06266000
    L:    IF S3<0 THEN GOTO LX;                                         06268000
             <<Unexpected delimiters are non-fatal if signbit>><<01007>>06270000
                                               <<of F' was on>><<01007>>06272000
          IF LOGICAL(PINFO)<>CHARCR THEN GOTO ERROR;                    06274000
                                     <<CR is not fatal either>><<01007>>06276000
    LX:   TOS_TOS-1;                                                    06278000
          TOS_TOS-TOS;                                                  06280000
          S3_TOS;                  <<FIELD>>                            06282000
    END;                                                                06284000
$PAGE "          I/O SUBROUTINES"                              <<01007>>06286000
  SUBROUTINE SEND(N);              <<INSERT CHAR IN BUFFER>>            06288000
    VALUE   N;                                                          06290000
    INTEGER N;                                                          06292000
<< THE PRINTABLE ASCII CHARACTER SET LIES IN THE OCTAL >>      <<01161>>06294000
<< RANGE FROM %40 TO %176 INCLUSIVE.  A "." IS SUB-    >>      <<01161>>06296000
<< TITUTED FOR VALUES PASSED TO THIS ROUTINE THAT FALL >>      <<01161>>06298000
<< OUTSIDE THIS RANGE.  TERMINALS THAT DO NOT SUPPORT  >>      <<01161>>06300000
<< THE FULL RANGE TEND TO SUBSTITUTE UP-SHIFTED CHAR-  >>      <<01161>>06302000
<< ACTERS FOR ANY UNSUPPORTED CHARACTERS.              >>      <<01161>>06304000
    BEGIN                                                               06306000
          IF N<%40 THEN N_".";                                          06308000
          IF N > %176 THEN N := ".";                           <<01161>>06310000
          POUT_N;                                                       06312000
          @POUT_@POUT+1;                                                06314000
    END;                                                                06316000
            << >>                                                       06318000
  SUBROUTINE SENDID(N);            <<INSERT ID IN BUFFER>>              06320000
    VALUE   N;                                                          06322000
    INTEGER N;                                                          06324000
    BEGIN                                                               06326000
          IF N="  " THEN RETURN;                                        06328000
          SEND(N.(0:8));                                                06330000
          TOS_N.(8:8);                                                  06332000
          DUPLICATE;                                                    06334000
          IF TOS=" " THEN DEL                                           06336000
                     ELSE SEND(*);                                      06338000
    END;                                                                06340000
            << >>                                                       06342000
  SUBROUTINE SENDHEX(N);                                                06344000
     VALUE N;                                                           06346000
     INTEGER N;                                                         06348000
     BEGIN                                                              06350000
            N:=N+%60;                                                   06352000
            IF N > %71 THEN N:=N+%7; <<TO ADJUST FOR A-F>>              06354000
            SEND(N);                                                    06356000
     END;                                                               06358000
            <<  >>                                             <<01549>>06360000
  SUBROUTINE SENDIT(NUM,NUM'WORD2,M,FLUG);                     <<01549>>06362000
    VALUE   NUM,NUM'WORD2,M,FLUG;                              <<01549>>06364000
    LOGICAL NUM,NUM'WORD2,M,FLUG;                              <<01549>>06366000
    BEGIN                                                      <<01549>>06368000
          <<O/I/A/H/C TO ASCII>>                               <<01549>>06370000
                                                               <<01549>>06372000
          IF M = 4 THEN                                        <<01549>>06374000
             BEGIN << CODE >>                                  <<01549>>06376000
             COMMENT:                                          <<01549>>06378000
                DECODE 1 & 2 WORD INSTRUCTIONS. FOR 2 WORD     <<01549>>06380000
                INSTRUCTIONS 2 CALLS WILL BE MADE TO SENDIT.   <<01549>>06382000
                THE 1ST CALL WILL COME IN WITH THE 2ND         <<01549>>06384000
                OPERAND IN NUM'WORD2 AND ASCII IS SENT. THE    <<01549>>06386000
                2ND CALL WILL HAVE THE SAME 2ND OP. IN NUM, &  <<01549>>06388000
                BLANKS ARE EMITTED. DECOMP'STATE INDICATES     <<01549>>06390000
                WHETHER NUM IS NEW INSTR OR 2ND WORD OF INSTR. <<01549>>06392000
                ;                                              <<01549>>06394000
             << SEND OCTAL IF NOT IN CALC. (SHORT) MODE >>     <<01549>>06396000
             IF FLUG THEN                                      <<01549>>06398000
                BEGIN                                          <<01549>>06400000
                SENDIT(NUM,NUM'WORD2,0,FLUG);                  <<01549>>06402000
                SEND(" "); SEND(" ");                          <<01549>>06404000
                END;                                           <<01549>>06406000
             IF DECOMP'STATE = INSTR'2NDWORD THEN              <<01549>>06408000
                BEGIN << HAVE ALREADY OUTPUT ASCII >>          <<01549>>06410000
                MOVE POUT := "      ";                         <<01549>>06412000
                @POUT := @POUT + 6;                            <<01549>>06414000
                DECOMP'STATE := INSTR'1STWORD; << NEXT STATE >><<01549>>06416000
                END                                            <<01549>>06418000
             ELSE                                              <<01549>>06420000
                BEGIN                                          <<01549>>06422000
                S'TEMP := DEASSEMBLE (J,POUT,NUM,NUM'WORD2);   <<01549>>06424000
                << SET STATE OF NUM'WORD2 ... >>               <<01549>>06426000
                << FOR NEXT SENDIT CALL       >>               <<01549>>06428000
                IF J = OK'OPCODE THEN                          <<01549>>06430000
                   BEGIN << 2 WORD INSTR, NEEDED BOTH WORDS >> <<01549>>06432000
                   DECOMP'STATE := INSTR'2NDWORD;              <<01549>>06434000
                   @POUT := LOGICAL(@POUT) + S'TEMP;           <<01549>>06436000
                   END                                         <<01549>>06438000
                ELSE                                           <<01549>>06440000
                   BEGIN << ONLY USED 'NUM' >>                 <<01549>>06442000
                   DECOMP'STATE := INSTR'1STWORD;              <<01549>>06444000
                   << TEST FOR ERROR >>                        <<01549>>06446000
                   IF J<>INGNORE'WD2 THEN                      <<01549>>06448000
                      BEGIN << ERROR >>                        <<01549>>06450000
                      MOVE POUT := "......";                   <<01549>>06452000
                      @POUT := @POUT + 6;                      <<01549>>06454000
                      END                                      <<01549>>06456000
                   ELSE @POUT := LOGICAL(@POUT) + S'TEMP;      <<01549>>06458000
                   END;                                        <<01549>>06460000
                END;                                           <<01549>>06462000
             RETURN;                                           <<01549>>06464000
             END;                                              <<01549>>06466000
         IF M = 3 THEN                                                  06468000
            BEGIN                                                       06470000
              SENDHEX(NUM.(0:4));                                       06472000
              SENDHEX(NUM.(4:4));                                       06474000
              SENDHEX(NUM.(8:4));                                       06476000
              SENDHEX(NUM.(12:4));                                      06478000
              RETURN;                                                   06480000
            END;                                                        06482000
                                                                        06484000
          IF M=2 THEN                                                   06486000
               BEGIN SEND(NUM.(0:8));                                   06488000
                     SEND(NUM.(8:8));                                   06490000
                     RETURN;                                            06492000
               END;                                                     06494000
          IF M=1 THEN                                                   06496000
               BEGIN IF INTEGER(NUM)>=0 THEN TOS_"+" ELSE               06498000
                       BEGIN NUM_-INTEGER(NUM);                         06500000
                     TOS_"-";                                           06502000
                       END;                                             06504000
                     SEND(*);                                           06506000
                     X_4;                                               06508000
                     TOS_10;                                            06510000
                     TOS_10000;                                         06512000
               END ELSE                                                 06514000
               BEGIN X_5;                                               06516000
                     TOS_8;                                             06518000
                     TOS_%100000;                                       06520000
               END;                                                     06522000
          TOS_S6;                                              <<01549>>06524000
    L:    ASSEMBLE(ZERO,XCH);                                           06526000
          TOS_S2;                                                       06528000
          ASSEMBLE(LDIV,XCH);                                           06530000
          IF <> THEN GOTO LL;                                           06532000
          IF X=0 THEN GOTO LL;                                          06534000
          IF LOGICAL(S5) THEN GOTO LL;                                  06536000
          DEL;                                                          06538000
          GOTO LN;                                                      06540000
    LL:   S5_1;                                                         06542000
          TOS_TOS+"0";                                                  06544000
          SEND(*);                                                      06546000
    LN:   S1_LOGICAL(S1)/LOGICAL(S2);                                   06548000
          IF (X_X-1)>=0 THEN GOTO L;                                    06550000
          DEL;                                                          06552000
          DDEL;                                                         06554000
    END;                                                                06556000
            << >>                                                       06558000
  SUBROUTINE SENDOCT(N);           <<TRUNC OCT TO ASCII>>               06560000
    VALUE   N;                                                          06562000
    INTEGER N;                                                          06564000
    BEGIN                                                               06566000
          SENDIT(N,0,0,FALSE);                                 <<01549>>06568000
    END;                                                                06570000
            << >>                                                       06572000
  SUBROUTINE ERRMSG(N);                                                 06574000
    VALUE   N;                                                          06576000
    INTEGER N;                                                          06578000
    BEGIN                                                               06580000
          PRINTFLAG_0;                                                  06582000
          N_N*3;                                                        06584000
          TOS_@PINFO-(@INFO(1)&LSL(1));                                 06586000
          IF < THEN ASSEMBLE(DEL,ZERO);                                 06588000
          CLEAR;                                                        06590000
          MOVE INFO(2)_ERRMSX(S2),(3);                                  06592000
          @POUT_@POUT+10;                                               06594000
          SENDOCT(*);                                                   06596000
          OUTPUT;                                                       06598000
    END;                                                                06600000
            << >>                                                       06602000
  SUBROUTINE GETMODE;                                                   06604000
    BEGIN                                                               06606000
          X_-1;                                                         06608000
         WHILE(X:=X+1)<NUM'MODES DO                            <<01549>>06610000
               BEGIN TOS_CHARM(X)&LSR(8);                               06612000
                    IF TOS = (LOGICAL(PINFO) LAND %137) THEN   <<02344>>06614000
                       BEGIN GETCHAR;                                   06616000
                             RETURN;                                    06618000
                       END;                                             06620000
               END;                                                     06622000
          IF LOGICAL(PINFO)<>CHARCR THEN GOTO ERROR;                    06624000
          X_0;                                                          06626000
    END;                                                                06628000
            << >>                                                       06630000
  LOGICAL SUBROUTINE INOCTAL(NUM,P);                                    06632000
    VALUE   P;                                                          06634000
    INTEGER NUM,P;                                                      06636000
    BEGIN                                                               06638000
    L:    @POUT_P;                                                      06640000
          SEND(":");                                                    06642000
          SEND("=");                                                    06644000
          TYPE;                                                         06646000
          INPUT;                                                        06648000
          TOS_EXPRESSION;                                               06650000
          TOS_TOS-1;                                                    06652000
          IF < THEN                                                     06654000
    L1:        BEGIN CLEAR;                                             06656000
                     DEL;                                               06658000
                     GOTO L;                                            06660000
               END;                                                     06662000
          IF = THEN P3_X;          <<NUM>>                              06664000
          IF PINFO="." THEN                                             06666000
               BEGIN TOS_TOS+2;                                         06668000
                     GETCHAR;                                           06670000
               END;                                                     06672000
          IF LOGICAL(PINFO)<>CHARCR THEN GOTO L1;                       06674000
          S4_TOS;                  <<INOCTAL>>                          06676000
    END;                                                                06678000
            << >>                                                       06680000
  SUBROUTINE GETID(NUM);           <<ID IN X>>                          06682000
    VALUE   NUM;                                                        06684000
    LOGICAL NUM;                                                        06686000
    BEGIN                                                               06688000
          TOS_"  ";                                                     06690000
           TOS.(0:8):= IF PINFO=ALPHA THEN                     <<02344>>06692000
                        LOGICAL(PINFO) LAND %137   <<UPSHIFT>> <<02344>>06694000
                       ELSE PINFO;                             <<02344>>06696000
          IF PINFO<>ALPHA THEN                                          06698000
             BEGIN IF NOT LOGICAL(S2) THEN                              06700000
                      BEGIN DEL;X_-1;RETURN;END;                        06702000
                   GETCHAR;                                             06704000
             END ELSE                                                   06706000
             BEGIN GETCHAR;                                             06708000
                   IF PINFO=ALPHA THEN                                  06710000
                      BEGIN                                    <<02344>>06712000
                          TOS.(8:8):=LOGICAL(PINFO) LAND %137; <<02344>>06714000
                            GETCHAR;                                    06716000
                      END;                                              06718000
             END;                                                       06720000
          X_-1;                                                         06722000
          WHILE (X_X+1)<=REGEND DO                                      06724000
               BEGIN ASSEMBLE(DUP);                                     06726000
                     IF TOS=REGY(X) THEN                                06728000
                       BEGIN DEL; RETURN; END;                          06730000
               END;                                                     06732000
          GOTO ERROR;                                                   06734000
    END;                                                                06736000
$PAGE "          PRIMARILY CAPABILITY/BOUNDS CHECKING RELATED" <<01007>>06738000
  SUBROUTINE CHEKM(M,I);                                                06740000
    VALUE   M,I;                                                        06742000
    INTEGER M,I;                                                        06744000
    BEGIN                                                               06746000
          X_M;                                                          06748000
          TOS_I;                                                        06750000
          IF < THEN TOS_-TOS                                            06752000
               ELSE IF PRIV THEN GOTO L;                                06754000
          ASSEMBLE(TRBC 11);                                            06756000
          IF <> THEN X_X+1;                                             06758000
          TOS_MASK(X);                                                  06760000
          ASSEMBLE(XCH,STAX);                                           06762000
          TOS_TOS&LSL(X);                                               06764000
          IF >= THEN GOTO ERROR;                                        06766000
    L:    DEL;                                                          06768000
    END;                                                                06770000
          << >>                                                         06772000
  LOGICAL SUBROUTINE REGVALUE;  <<RESULT IN X>>                         06774000
    BEGIN          <<RETURNS - 0 ERROR, 1 OK >>                         06776000
          GETID(TRUE);                                                  06778000
          IF X<0 THEN RETURN;                                           06780000
          TOS_X;                                                        06782000
          CHEKM(RMNPR,-S0);                                             06784000
          X_TOS;                                                        06786000
          X_REG(X);                                                     06788000
          REGVALUE_1;                                                   06790000
    END;                                                                06792000
            << >>                                                       06794000
  LOGICAL SUBROUTINE GETLCST(C);                                        06796000
    VALUE   C;                                                          06798000
    LOGICAL C;                                                          06800000
    BEGIN                                                               06802000
          TOS_LOGICALCST(C);                                            06804000
          IF <> THEN ASSEMBLE(DDEL,ZERO) ELSE                           06806000
               BEGIN ASSEMBLE(XCH,INCA);                                06808000
                     TOS.(0:3)_TOS;                                     06810000
               END;                                                     06812000
          S3_TOS;                                                       06814000
    END;                                                                06816000
            << >>                                                       06818000
  SUBROUTINE SENDLCST(LC,C);                                            06820000
    VALUE   LC,C;                                                       06822000
    LOGICAL LC,C;                                                       06824000
    BEGIN                                                               06826000
          TOS_LC;                                                       06828000
          IF = THEN                                                     06830000
               BEGIN DEL;                                               06832000
                     TOS_C;                                             06834000
                     IF = THEN                                          06836000
                       BEGIN DEL;RETURN; END;                           06838000
               END;                                                     06840000
          DUPLICATE;                                                    06842000
          TOS_TOS LAND %377;                                            06844000
          EXCHANGE;                                                     06846000
          X_TOS&LSR(13);                                                06848000
          TOS_LIB(X);                                                   06850000
          SENDID(*);                                                    06852000
          SENDOCT(*);                                                   06854000
    END;                                                                06856000
            << >>                                                       06858000
  SUBROUTINE SENDREG(N,M,I);                                            06860000
    VALUE   N,M,I;                                                      06862000
    LOGICAL N,M,I;                                                      06864000
    BEGIN                                                               06866000
          IF @POUT<>@INFO(1)&LSL(1) THEN SEND(",");                     06868000
          IF N=0 THEN SENDID(REGY(I)) ELSE                              06870000
               BEGIN SENDID(N);                                         06872000
                     SENDID(M);                                         06874000
               END;                                                     06876000
          SEND("=");                                                    06878000
          IF I<>REGLOG AND I<>REGTL                                     06880000
               THEN SENDOCT(REG(I))                                     06882000
               ELSE SENDLCST(REG(I),0);                                 06884000
    END;                                                                06886000
            << >>                                                       06888000
  SUBROUTINE FORMT;                                                     06890000
    BEGIN                                                               06892000
          RTL_GETLCST(RTC);                                             06894000
          TOS_@POUT;                                                    06896000
          SENDREG("LC","ST",REGTL);                                     06898000
          TOS_TOS+10;                                                   06900000
          DUPLICATE;                                                    06902000
          @POUT_TOS;                                                    06904000
          SENDREG("P ","  ",REGTP);                                     06906000
          TOS_TOS+8;                                                    06908000
          DUPLICATE;                                                    06910000
          @POUT_TOS;                                                    06912000
          IF PRIV THEN                                                  06914000
               BEGIN SENDREG("CS","T ",REGTC);                          06916000
                     TOS_TOS+10;                                        06918000
               END;                                                     06920000
          @POUT _ TOS;                                                  06922000
    END;                                                                06924000
            << >>                                                       06926000
  LOGICAL SUBROUTINE CHEKK(MODE,SEG,BANK,DISPL,CNT);                    06928000
    VALUE   MODE,SEG,BANK,DISPL,CNT;                                    06930000
    INTEGER MODE,SEG,BANK,DISPL,CNT;                                    06932000
    BEGIN                                                               06934000
          IF MODE.(8:4)=0 THEN                                          06936000
             IF NOT PRIV THEN    <<STACK>>                              06938000
                BEGIN IF NOT(RDL<=DISPL<=RS) THEN GO BOUNDS;            06940000
                      X_RS;                                             06942000
                      GOTO LY;                                          06944000
                END ELSE                                                06946000
                BEGIN SEG_RSTK;                                         06948000
                      DISPL_DISPL-RDL+INTEGER(BASE(RDL-1));             06950000
                      MODE_%300;                                        06952000
                END;                                                    06954000
          IF MODE.(8:4)=1 THEN                                          06956000
             BEGIN IF NOT(0<=BANK<=NUMBANKS) THEN GO NONO;              06958000
                   X_IF BANK=LASTBANK THEN LASTADDR            <<01549>>06960000
                     ELSE %177777;                             <<01549>>06962000
                   DISPL_DISPL+SEG;                                     06964000
                   GOTO LX;                                             06966000
             END;                                                       06968000
          IF SEG<=0 THEN GOTO NONO;                                     06970000
          IF MODE.(8:1)=1 THEN         <<DATA SEGMENT>>                 06972000
             BEGIN IF SEG>DSTI'(0) THEN GO NONO;                        06974000
                   TOS_DSTI'(SEG&LSL(2))&LSL(2);                        06976000
                   TOS.(0:1)_0;                                         06978000
                   ASSEMBLE(TEST);                                      06980000
                   IF = THEN GOTO NONO;                                 06982000
                   X_TOS-1;                                             06984000
                   GOTO LX;                                             06986000
             END;                                                       06988000
          IF MODE.(9:1)=1 THEN         <<CODE SEGMENT>>                 06990000
             BEGIN IF SEG<=%300 THEN                                    06992000
                      BEGIN IF SEG>CSTI'(0) THEN GO NONO;               06994000
                      END ELSE                                          06996000
                      BEGIN IF PCBI'(PINX+PBX)=0 THEN GO NONO;          06998000
                            IF (SEG-%300)>ABSOLUTE(ABSOLUTE             07000000
                                    (CSTX)) THEN GO NONO;               07002000
                      END;                                              07004000
                   TOS_CSTCONV(SEG,PINX);                      <<01832>>07006000
                   IF S0 = 0 THEN GOTO NONO;                   <<01832>>07008000
                   TOS_DSTI'(TOS)&LSL(2);                      <<01832>>07010000
                   TOS.(0:2)_0;                                         07012000
                   ASSEMBLE(TEST);                                      07014000
                   IF = THEN GOTO NONO;                                 07016000
                   X_TOS-1;                                             07018000
                   GOTO LX;                                             07020000
              END;                                                      07022000
          GOTO ERROR;                                                   07024000
    LX:   IF LOGICAL(DISPL)>LOGICAL(X) THEN GOTO BOUNDS;                07026000
    LY:   X_X-DISPL;                                                    07028000
          IF LOGICAL(X)>=LOGICAL(CNT-1) THEN CHEKK_TRUE;                07030000
          X_X+1;                                                        07032000
    END;                                                                07034000
            << >>                                                       07036000
  LOGICAL SUBROUTINE DEVTYPE(LDEV);                                     07038000
    VALUE   LDEV;                                                       07040000
    INTEGER LDEV;                                                       07042000
    BEGIN                                                               07044000
          EXCHANGEDB(LDTDST);                                           07046000
          IF 1<=LDEV<=INTEGER(BASE(0).(0:8))                            07048000
             THEN TOS_BASE(LDEV*LDTSIZE+2).(10:6)                       07050000
             ELSE TOS_-1;                                               07052000
          EXCHANGEDB(0);                                                07054000
          ASSEMBLE(TEST);                                               07056000
          IF < THEN GOTO NONO;                                          07058000
          S3_TOS;                                                       07060000
    END;                                                                07062000
          << >>                                                         07064000
  SUBROUTINE MEMBASE(INDEX,MODE,SEG,BANK,DISPL);                        07066000
    VALUE   INDEX,MODE,SEG,BANK,DISPL;                                  07068000
    INTEGER INDEX,MODE,SEG,BANK,DISPL;                                  07070000
    BEGIN                                                               07072000
          IF INDEX=REGDX THEN                                           07074000
             IF RDX<1 THEN INDEX_REGDB ELSE                             07076000
                IF =  THEN                                              07078000
                   BEGIN MODE_%242;                                     07080000
                         SEG_RDBX;                                      07082000
                         GOTO L;                                        07084000
                   END ELSE                                             07086000
                   BEGIN MODE_%22;                                      07088000
                         SEG_RDBV;                                      07090000
                         BANK_RBNK;                                     07092000
                         GOTO L;                                        07094000
                   END;                                                 07096000
          IF INDEX=REGEA THEN                                           07098000
             BEGIN IF FACTOR=0 THEN GOTO ERROR;                         07100000
                   BANK_X;                                              07102000
                   GOTO LABS;                                           07104000
             END;                                                       07106000
          IF INDEX<=REGSY THEN                                          07108000
    LABS:    BEGIN X_INDEX;                                             07110000
                   SEG_REG(X);                                          07112000
                   MODE_%22;                                            07114000
                   GOTO L;                                              07116000
             END;                                                       07118000
          IF INDEX<=REGDA THEN                                          07120000
             BEGIN IF FACTOR=0 THEN GOTO ERROR;                         07122000
                   SEG_X;                                               07124000
                   MODE_IF INDEX=REGDA THEN %246 ELSE %126;             07126000
                   GOTO L;                                              07128000
             END;                                                       07130000
          IF INDEX>=REGPB THEN                                          07132000
             BEGIN IF > THEN                                            07134000
                      BEGIN MODE_1;                                     07136000
                            DISPL_REG(INDEX);                           07138000
                      END;                                              07140000
                   MODE_MODE+%120;                                      07142000
                   SEG_RCST;                                            07144000
                   GOTO L;                                              07146000
             END;                                                       07148000
          IF INDEX>=REGDB THEN                                          07150000
             BEGIN IF > THEN                                            07152000
                      BEGIN MODE_1;                                     07154000
                            DISPL_REG(INDEX);                           07156000
                      END;                                              07158000
                   GO TO L;                                             07160000
             END;                                                       07162000
    L:    CHEKK(MODE,SEG,BANK,DISPL,0);                                 07164000
          RETURN 0;                                                     07166000
    END;                                                                07168000
          << >>                                                         07170000
  LOGICAL SUBROUTINE CONTENTS;    <<RESULT IN X>>                       07172000
          <<RETURNS - 0 ERROR, 1 OK, 2 NULL >>                          07174000
    BEGIN                                                               07176000
          GETID(FALSE);                                                 07178000
          IF X=0 OR X=REGV THEN GOTO ERROR;                             07180000
          TOS_X;                                                        07182000
          IF < THEN                                                     07184000
             BEGIN DEL; TOS_REGDB; END;                                 07186000
          CHEKM(BMNPD,S0);                                              07188000
          CHEKM(BMPMD,-S0);                                             07190000
          MEMBASE(*,0,0,0,0);                                           07192000
          IF PINFO="'" THEN                                             07194000
             BEGIN TOS_@PINFO;                                          07196000
                   GETCHAR;                                             07198000
                   IF OPER("+-")<>0 OR OPER("*/")<>0                    07200000
                      OR LOGICAL(PINFO)=CHARCR THEN                     07202000
                         BEGIN @PINFO_TOS;X_0;GOTO L;END;               07204000
                   @PINFO_TOS;                                          07206000
             END;                                                       07208000
          TOS_EXPRESSION;                                               07210000
          IF TOS=0 OR PINFO<>"'" THEN                                   07212000
             BEGIN DDEL; DDEL; DEL; RETURN; END;                        07214000
    L:    TOS_TOS+X;                                                    07216000
          CHEKK(S3,S2,S1,S0,0);                                         07218000
          X_TOS;                                                        07220000
          SETSEG(S2,S1,S0);                                             07222000
          X_BASE(X);                                                    07224000
          RESETSEG(S2,S1);                                              07226000
          DDEL;                                                         07228000
          DDEL;                                                         07230000
          CONTENTS_1;                                                   07232000
    END;                                                                07234000
            << >>                                                       07236000
  SUBROUTINE GETVIRT;                                                   07238000
    BEGIN                                                               07240000
          IF SEG=0 THEN                                                 07242000
               BEGIN DISPLX_DISPL;                                      07244000
                     RCNT_RCNT*%200;                                    07246000
                     GOTO L;                                            07248000
               END;                                                     07250000
          DISPLX_DISPLX+1;                                              07252000
          IF = THEN SEGX_SEGX+1;                                        07254000
  L:      SEG_GETENTRY(CSTB);                                           07256000
          DSTI'(SEG&LSL(2)+DFC) _ %100040;                              07258000
          DSTI'(X_X+1) _ 0;                                             07260000
          DSTI'(X_X+1) _ SEGX;                                          07262000
          DSTI'(X_X+1) _ DISPLX;                                        07264000
          DISPL_0;                                                      07266000
    END;                                                                07268000
            << >>                                                       07270000
  SUBROUTINE RELVIRT;                                                   07272000
    BEGIN                                                               07274000
          RELCODESEG(SEG);                                              07276000
    END;                                                                07278000
$PAGE "          EXTRACT SEGMENT.OFFSET AND CONDITION",&       <<01549>>07280000
$     " FROM INPUT BUFFER"                                     <<01549>>07282000
  SUBROUTINE L'PRIMARY (STAK,STAKSIZE,PRI'TYPE);               <<01549>>07284000
    INTEGER ARRAY STAK;                                        <<01549>>07286000
    INTEGER STAKSIZE,PRI'TYPE;                                 <<01549>>07288000
    BEGIN                                                      <<01549>>07290000
    COMMENT:                                                   <<01549>>07292000
          THIS ROUTINE PARSES A LOGICAL PRIMARY OF THE         <<01549>>07294000
          FORM:                                                <<01549>>07296000
             <LPRIM>:  <MODBASE><OFFSET>|<EXPRESSION>          <<01549>>07298000
          RETURNS:                                             <<01549>>07300000
             STAK:     PUSHES THE PRIMARY ON STAK IN FORM      <<01549>>07302000
                       DESCRIBED IN SUBROUTINE 'CONDITION'     <<01549>>07304000
             PRI'TYPE: 0  -> CONSTANT PRIMARY                  <<01549>>07306000
                       1  -> ADDRESS (DOUBLE WORD).            <<01549>>07308000
                       2  -> NULL PRIMARY                      <<01549>>07310000
          CONVENTION:                                          <<01549>>07312000
             ENTRY:    STAKSIZE IS INDEX OF LAST ELEMENT       <<01549>>07314000
                       IN STAK. PINFO PTS TO NEXT TOKEN.       <<01549>>07316000
             EXIT:     STAKSIZE IS INDEX OF LAST ELEMENT       <<01549>>07318000
                       IN STAK. PINFO PTS TO NEXT TOKEN;       <<01549>>07320000
                                                               <<01549>>07322000
          IF NEXTTOKEN = T'IDENT THEN                          <<01549>>07324000
             BEGIN << MODBASE SPECIFIED >>                     <<01549>>07326000
             GETID (FALSE);   << GET REGISTER ID IN X >>       <<01549>>07328000
             STAK(STAKSIZE := STAKSIZE+1) := X;                <<01549>>07330000
             << CHECK VALIDITY OF REGISTER SPECIFIED >>        <<01549>>07332000
             IF NOT PRIV THEN CHEKM (BMNPM,STAK(STAKSIZE))     <<01549>>07334000
             ELSE CHEKM (BMPMM,-STAK(STAKSIZE));               <<01549>>07336000
             STAK(STAKSIZE).BKPT'REG := STAK(STAKSIZE);        <<01549>>07338000
             IF STAK(STAKSIZE).BKPT'REG = REGDA THEN           <<01549>>07340000
                BEGIN                                          <<01549>>07342000
                << GET SEG NUMBER >>                           <<01549>>07344000
                IF FACTOR=0 THEN GOTO ERROR;                   <<01549>>07346000
                J := X; << SAVE BASE >>                        <<01549>>07348000
                IF J <= 0 OR J > DSTI'(0) THEN GOTO NONO;      <<01549>>07350000
                END                                            <<01549>>07352000
             ELSE IF STAK(STAKSIZE).BKPT'REG = REGEA THEN      <<01549>>07354000
                BEGIN <<GET BANK NUMBER >>                     <<01549>>07356000
                IF FACTOR = 0 THEN GOTO ERROR;                 <<01549>>07358000
                J := X;  << SAVE BANK >>                       <<01549>>07360000
                IF NOT (0 <= J <= NUMBANKS) THEN GOTO NONO;    <<01549>>07362000
                END                                            <<01549>>07364000
             ELSE J := 0; << STK REL OR A OR SY SPECIFIED >>   <<01549>>07366000
                                                               <<01549>>07368000
             STAK(STAKSIZE).BKPT'BASE := J;                    <<01549>>07370000
             J := EXPRESSION;   << GET OFFSET >>               <<01549>>07372000
             IF J=INVAL'EXP THEN GOTO ERROR                    <<01549>>07374000
             ELSE IF J=NULL'EXP THEN X := 0;                   <<01549>>07376000
             STAK(STAKSIZE := STAKSIZE+1) := X;                <<01549>>07378000
             IF NEXTTOKEN = T'COLON THEN                       <<01549>>07380000
                BEGIN << INDIRECTION >>                        <<01549>>07382000
                TOS := 0; << SPACE FOR PNTR RET. BY GETTOKEN >><<01549>>07384000
                GETTOKEN (BPS0,J,0); DEL; << SKIP :,DEL PNTR >><<01549>>07386000
                J := EXPRESSION;                               <<01549>>07388000
                IF J=INVAL'EXP THEN GOTO ERROR;                <<01549>>07390000
                IF J=NULL'EXP THEN X := 0;                     <<01549>>07392000
                STAK(STAKSIZE := STAKSIZE+1) := X;             <<01549>>07394000
                PRI'TYPE := IND'PRIMARY;                       <<01549>>07396000
                END                                            <<01549>>07398000
             ELSE PRI'TYPE := ADDR'PRIMARY;                    <<01549>>07400000
             END                                               <<01549>>07402000
          ELSE                                                 <<01549>>07404000
             BEGIN << DISPLACEMENT ONLY >>                     <<01549>>07406000
             J := EXPRESSION;                                  <<01549>>07408000
             IF J=NULL'EXP THEN PRI'TYPE := NULL'PRIMARY       <<01549>>07410000
             ELSE IF J=INVAL'EXP THEN GOTO ERROR               <<01549>>07412000
             ELSE                                              <<01549>>07414000
                BEGIN                                          <<01549>>07416000
                STAK(STAKSIZE := STAKSIZE+1) := X;             <<01549>>07418000
                PRI'TYPE := CONST'PRIMARY;                     <<01549>>07420000
                END;                                           <<01549>>07422000
             END;                                              <<01549>>07424000
                                                               <<01549>>07426000
    END;  << L'PRIMARY >>                                      <<01549>>07428000
            << >>                                              <<01549>>07430000
  SUBROUTINE CONDITION (STAK,STAKSIZE);                        <<01549>>07432000
    INTEGER STAKSIZE;                                          <<01549>>07434000
    INTEGER ARRAY STAK;                                        <<01549>>07436000
    BEGIN                                                      <<01549>>07438000
    COMMENT:                                                   <<01549>>07440000
          THIS ROUTINE PARSES A CONDITION OF THE FORM:         <<01549>>07442000
                                                               <<01549>>07444000
          1)  <EXP>                                            <<01549>>07446000
                                                               <<01549>>07448000
          2)  <LEXP> <RELOP> <LEXP>                            <<01549>>07450000
                                                               <<01549>>07452000
              <LEXP>:  EXPRESSION\<MODBASE><OFFSET>            <<01549>>07454000
                                                               <<01549>>07456000
          THE RESULT IS ENTERED IN STAK IN POLISH (POSTFIX)    <<01549>>07458000
          FORM AS FOLLOWS:                                     <<01549>>07460000
                                                               <<01549>>07462000
             --------------------        --------------------  <<01549>>07464000
          1) |  OPERAND1        |     2) |  OPERAND1        |  <<01549>>07466000
             --------------------        --------------------  <<01549>>07468000
             |     0            |        |  OPERAND2        |  <<01549>>07470000
             --------------------        --------------------  <<01549>>07472000
             |         | T'NUM. |        |OPT1|OPt2| RELOP  |  <<01549>>07474000
             --------------------        --------------------  <<01549>>07476000
                                                               <<01549>>07478000
          T'NUM -> (8:8) TOKEN NUMBER OF A NUMBER -> COUNT     <<01549>>07480000
          RELOP -> (8:8) TOKEN NUMBER OF RELATIONAL OPERATOR   <<01549>>07482000
          OPT1  -> (0:2) OPERAND1'S TYPE                       <<01549>>07484000
          OPT2  -> (2:2) OPERAND2'S TYPE                       <<01549>>07486000
                                                               <<01549>>07488000
          OPERAND TYPES:                                       <<01549>>07490000
             0 ->  CONSTANT (SINGLE WORD)                      <<01549>>07492000
             1 ->  ADDRESS (DOUBLE WORD)                       <<01549>>07494000
             3 ->  INDIRECT ADDRESS (TRIPLE WORD)              <<01549>>07496000
                                                               <<01549>>07498000
          OPERAND FORMS:                                       <<01549>>07500000
             CONSTANT ->  -------------                        <<01549>>07502000
                          | CONST     |                        <<01549>>07504000
                          -------------                        <<01549>>07506000
                                                               <<01549>>07508000
             ADDRESS  ->  -------------                        <<01549>>07510000
                          | REG | BASE|                        <<01549>>07512000
                          -------------                        <<01549>>07514000
                          |  OFFSET   |                        <<01549>>07516000
                          -------------                        <<01549>>07518000
                          |IND. OFFSET|                        <<01549>>07520000
                          -------------                        <<01549>>07522000
                                                               <<01549>>07524000
             REG      -> (0:6)  CORRESPONDING INDEX INTO 'REGY'<<01549>>07526000
             BASE     -> (6:10) SEG # OR BANK # FOR EA/A/SY    <<01549>>07528000
                                                               <<01549>>07530000
          CONVENTIONS:                                         <<01549>>07532000
             ENTRY:   STAKSIZE IS INDEX OF LAST ELEMENT IN     <<01549>>07534000
                      STAK                                     <<01549>>07536000
             EXIT:    STAKSIZE IS INDEX OF LAST ELEMENT IN     <<01549>>07538000
                      STAK.;                                   <<01549>>07540000
                                                               <<01549>>07542000
          << GET LOGICAL EXPRESSION >>                         <<01549>>07544000
          L'PRIMARY (STAK,STAKSIZE,PRIM'INFO);                 <<01549>>07546000
          IF PRIM'INFO = NULL'PRIMARY THEN RETURN;             <<01549>>07548000
          OP'INFO.OP1TYPE := PRIM'INFO;                        <<01549>>07550000
                                                               <<01549>>07552000
          PRIM'INFO := NEXTTOKEN;                              <<01549>>07554000
          IF PRIM'INFO <> T'LT AND PRIM'INFO <> T'GT AND       <<01549>>07556000
             PRIM'INFO <> T'EQ AND PRIM'INFO <> T'GTE AND      <<01549>>07558000
             PRIM'INFO <> T'LTE AND PRIM'INFO <> T'NEQ         <<01549>>07560000
          THEN                                                 <<01549>>07562000
             BEGIN << NO RELOP-1ST OPERAND MUST BE COUNT >>    <<01549>>07564000
             IF OP'INFO.OP1TYPE <> CONST'PRIMARY THEN GO ERROR;<<01549>>07566000
             STAK(STAKSIZE := STAKSIZE+1) := 0;                <<01549>>07568000
             STAK(STAKSIZE := STAKSIZE+1) := T'NUMBER;         <<01549>>07570000
             END                                               <<01549>>07572000
          ELSE                                                 <<01549>>07574000
             BEGIN << RELOP PRESENT >>                         <<01549>>07576000
             TOS := 0; << SPACE FOR PNT'R RET. BY GETTOKEN >>  <<01549>>07578000
             GETTOKEN (BPS0,PRIM'INFO,0);                      <<01549>>07580000
             DEL;  << DEL RETURNED POINTER >>                  <<01549>>07582000
             OP'INFO.RELOPTYPE := PRIM'INFO.TOKEN'TYPE;        <<01549>>07584000
             << GET 2ND OPERAND >>                             <<01549>>07586000
             L'PRIMARY (STAK,STAKSIZE,PRIM'INFO);              <<01549>>07588000
             IF PRIM'INFO = NULL'PRIMARY THEN GOTO ERROR       <<01549>>07590000
             ELSE OP'INFO.OP2TYPE := PRIM'INFO;                <<01549>>07592000
             IF OP'INFO.OP1TYPE = CONST'PRIMARY AND            <<01549>>07594000
                OP'INFO.OP2TYPE = CONST'PRIMARY                <<01549>>07596000
             THEN GOTO ERROR;                                  <<01549>>07598000
             << PUSH OPERAND AND RELOP INFO >>                 <<01549>>07600000
             STAK (STAKSIZE := STAKSIZE+1) := OP'INFO;         <<01549>>07602000
             END;                                              <<01549>>07604000
                                                               <<01549>>07606000
    END; << CONDITION >>                                       <<01549>>07608000
            << >>                                              <<01549>>07610000
  LOGICAL SUBROUTINE LOCATION(PIN',SEG,DISP,COND'STAK);        <<01549>>07612000
          <<RETURNS - 0 OK, 2 OK CR, 4 NO, 6 NO CR >>          <<01549>>07614000
          <<          1 OK :, 3 OK :CR             >>          <<01549>>07616000
          <<SEG        =-1 --> ALL LOCATIONS       >>          <<01549>>07618000
          <<SEG       <>-1 THEN:                   >>          <<01549>>07620000
          <<SEG.(0:1)  =1 --> ':@'                 >>          <<01549>>07622000
          <<SEG.(1:3)  =SEGMENT TYPE               >>          <<01549>>07624000
          <<SEG.(8:8)  =SEGMENT NUMBER             >>          <<01549>>07626000
          <<                                       >>          <<01549>>07628000
          <<PIN'.LOCBIT=1 --> THEN PIN SPECIFIED   >>          <<01549>>07630000
          <<PIN'.(8:8) =PIN NUMBER                 >>          <<01549>>07632000
    INTEGER PIN',SEG,DISP;                                     <<01549>>07634000
    INTEGER ARRAY COND'STAK;                                   <<01549>>07636000
    BEGIN                                                      <<01549>>07638000
    COMMENT:                                                   <<01549>>07640000
          THIS ROUTINE PARSES ENTRIES OF THE FORM              <<01549>>07642000
          1) [[PIN'.][SEGTYPE]SEG.]DISP[:[@]COND]              <<01549>>07644000
          2) [PINUM..]PROCOFFSET [:[@]COND]                    <<01549>>07646000
          THE LOCATION MUST END IN A "," OR CR.                <<01549>>07648000
          THE CONDITION IS RETURNED IN INTERNAL FORM           <<01549>>07650000
          IN COND'STAK;                                        <<01549>>07652000
                                                               <<01549>>07654000
          << DETERMINE THE NUMBER OF FIELDS IN THE LOC >>      <<01549>>07656000
          << DESIGNATOR (1-3).  FIELDS ARE DELIMITED   >>      <<01549>>07658000
          << BY "." --> "." NOT ALLOWED IN EXPRESSIONS >>      <<01549>>07660000
                                                               <<01549>>07662000
          TOS := @PINFO-1;  << SET UP BYTE POINTER >>          <<01549>>07664000
          NUM'FIELDS := 1;                                     <<01549>>07666000
          DO                                                   <<01549>>07668000
             BEGIN                                             <<01549>>07670000
             @BPS0 := @BPS0 + 1;                               <<01549>>07672000
             MOVE * := BPS0 WHILE AN,1; << FIND DELIM >>       <<01549>>07674000
             IF BPS0 = "." THEN NUM'FIELDS := NUM'FIELDS+1;    <<01549>>07676000
             END                                               <<01549>>07678000
          UNTIL BPS0 = ":" OR BPS0 = "," OR BPS0 = CHARCR      <<01549>>07680000
                OR BPS0 = "@";                                 <<01549>>07682000
          << CHECK FOR [PIN.]@ --> NO DISP FIELD >>            <<01549>>07684000
          << --> MUST UP NUM'FIELDS              >>            <<01549>>07686000
          IF BPS0 = "@" THEN NUM'FIELDS := NUM'FIELDS+1;       <<01549>>07688000
          DEL;  << REMOVE BYTE POINTER >>                      <<01549>>07690000
                                                               <<01549>>07692000
          IF PINFIELD'PRESENT THEN                             <<01549>>07694000
             BEGIN                                             <<01549>>07696000
             J := FIELD (".");  << GET FIELD >>                <<01549>>07698000
             PIN' := X;  << SAVE X -- BEFORE IT IS DESTROYED >><<01549>>07700000
             IF J.NULL'FIELDBIT = 1 THEN GOTO ERROR;           <<01549>>07702000
             IF PIN' <> RPCB AND NOT PRIV THEN GOTO NONO;      <<01549>>07704000
             IF LOGICAL(PIN') >%377 THEN GOTO NONO;            <<01549>>07706000
             PIN'.LOCBIT := 1;                                 <<01549>>07708000
             END                                               <<01549>>07710000
          ELSE                                                 <<01549>>07712000
             BEGIN << NO PIN SPECIFIED >>                      <<01549>>07714000
             PIN' := RPCB;                                     <<01549>>07716000
             END;                                              <<01549>>07718000
          @PIN'LOC := @PINFO; << SAVE POINTER FOR ERROR >>     <<01549>>07720000
                                                               <<01549>>07722000
          IF SEGFIELD'PRESENT THEN                             <<01549>>07724000
             BEGIN                                             <<01549>>07726000
             IF NEXTTOKEN = T'ATSIGN THEN                      <<01549>>07728000
                BEGIN << ALL LOCATIONS >>                      <<01549>>07730000
                SEG := ALL'SEGS;                               <<01549>>07732000
                TOS := 0; << SPACE FOR PNTR RET. BY G'T >>     <<01549>>07734000
                GETTOKEN (BPS0,J,0); << SCAN PAST @ >>         <<01549>>07736000
                DEL;  << REMOVE POINTER >>                     <<01549>>07738000
                << MUST END IN "," OR CR >>                    <<01549>>07740000
                J := FIELD (",");                              <<01549>>07742000
                IF J.NULL'FIELDBIT <> 1 THEN GOTO ERROR;       <<01549>>07744000
                LOCATION.CRBIT := J.CRBIT;                     <<01549>>07746000
                RETURN;                                        <<01549>>07748000
                END;                                           <<01549>>07750000
             << GET TYPE OF SEG >>                             <<01549>>07752000
             X := -1;                                          <<01549>>07754000
             WHILE (X:=X+1) < 4 AND                            <<01549>>07756000
               (LIB(X)&LSR(8)) <> (LOGICAL(PINFO) LAND %137) DO<<02344>>07758000
                BEGIN   END;                                   <<01549>>07760000
             LOC'SEGTYPE := X;                                 <<01549>>07762000
             IF LOC'SEGTYPE < 2 AND NOT PRIV THEN GOTO ERROR;  <<01549>>07764000
             << SCAN PASS LIB SPECIFICATION IF PRESENT >>      <<01549>>07766000
             IF LOC'SEGTYPE < 4 THEN GETCHAR;                  <<01549>>07768000
             J := FIELD (".");  << GET SEG >>                  <<01549>>07770000
             SEG := X;                                         <<01549>>07772000
             IF J.NULL'FIELDBIT = 1 THEN                       <<01549>>07774000
                BEGIN                                          <<01549>>07776000
                << UNTIL PMAP INFO AVAILABLE: >>               <<01549>>07778000
                GOTO ERROR;                                    <<01549>>07780000
                << MUST BE OF FORM PIN..DISP >>                <<01549>>07782000
                IF NOT PINFIELD'PRESENT OR LOC'SEGTYPE < 4     <<01549>>07784000
                   THEN GOTO ERROR                             <<01549>>07786000
                ELSE PROCOFFSET'OK := TRUE;                    <<01549>>07788000
                END                                            <<01549>>07790000
             ELSE                                              <<01549>>07792000
                BEGIN                                          <<01549>>07794000
                IF LOC'SEGTYPE = PROG'SEG AND                  <<01549>>07796000
                   LOGICAL(SEG) > %76 OR                       <<01549>>07798000
                   LOC'SEGTYPE <> PROG'SEG AND                 <<01549>>07800000
                   LOGICAL(SEG) > %377                         <<01549>>07802000
                THEN GOTO NONO;                                <<01549>>07804000
                PROCOFFSET'OK := FALSE;                        <<01549>>07806000
                END;                                           <<01549>>07808000
             END                                               <<01549>>07810000
          ELSE << NO SEG FIELD >>                              <<01549>>07812000
             BEGIN                                             <<01549>>07814000
             SEG := RCST;                                      <<01549>>07816000
             LOC'SEGTYPE := ABS'SEG;                           <<01549>>07818000
             PROCOFFSET'OK := FALSE; << UNTIL PMAP AVAIL >>    <<01549>>07820000
             END;                                              <<01549>>07822000
                                                               <<01549>>07824000
          SEG.SEGTYPE := LOC'SEGTYPE;  << RETURN SEGTYPE >>    <<01549>>07826000
          @SEG'LOC := @PINFO; << FOR FUTURE ERROR MESS.  >>    <<01549>>07828000
                                                               <<01549>>07830000
          << IF PROCDESIGNATOR PRESENT, THEN TRANSLATE >>      <<01549>>07832000
          IF NEXTTOKEN = T'IDENT THEN                          <<01549>>07834000
             BEGIN                                             <<01549>>07836000
             IF NOT PROCOFFSET'OK THEN GOTO ERROR;             <<01549>>07838000
             << PROCOFFSET: PROCNAME[#SEGNAME] >>              <<01549>>07840000
             GETTOKEN (PROCDESIG,J,1);                         <<01549>>07842000
             << SCAN PASS #SEGNAME >>                          <<01549>>07844000
             IF NEXTTOKEN = T'POUNDSIGN THEN                   <<01549>>07846000
                BEGIN                                          <<01549>>07848000
                TOS := 0;<< SPACE FOR PNT'R RET. BY GETTOKEN >><<01549>>07850000
                GETTOKEN (BPS0,J,1);                           <<01549>>07852000
                IF NEXTTOKEN=T'IDENT THEN GETTOKEN (BPS0,J,1); <<01549>>07854000
                DEL;  << POINTER RETURNED BY GETTOKEN >>       <<01549>>07856000
                END;                                           <<01549>>07858000
             IF NOT TRANS'PROCOFFSET (PROCDESIG,SEG,DISP) THEN <<01549>>07860000
                GOTO ERROR;                                    <<01549>>07862000
             << GET DISPLACEMENT >>                            <<01549>>07864000
             J := FIELD (":" LOR %100000);                     <<01549>>07866000
             IF J.NULL'FIELDBIT = 0 THEN DISP := DISP+X;       <<01549>>07868000
             END                                               <<01549>>07870000
          ELSE << NO PROCOFFSET, JUST DISPLACEMENT >>          <<01549>>07872000
             BEGIN                                             <<01549>>07874000
             J := FIELD( ":" LOR %100000);                     <<01549>>07876000
             DISP := X;                                        <<01549>>07878000
             << CHECK FOR ':' & NULL FIELD >>                  <<01549>>07880000
             IF J.NULL'FIELDBIT = 1 AND                        <<01549>>07882000
                ((J.DELIMBITS = RHSMATCH) OR SEGFIELD'PRESENT) <<01549>>07884000
             THEN GOTO ERROR;                                  <<01549>>07886000
             LOCATION.NULL'FIELDBIT := J.NULL'FIELDBIT;        <<01549>>07888000
             END;                                              <<01549>>07890000
                                                               <<01549>>07892000
          << CHECK FOR CONDITION >>                            <<01549>>07894000
          IF J.DELIMBITS = RHSMATCH THEN                       <<01549>>07896000
             BEGIN << LAST DELIM WAS ":", PROCESS COND. >>     <<01549>>07898000
             LOCATION.(15:1) := 1;  << RETURN ":" SEEN >>      <<01549>>07900000
             IF NEXTTOKEN = T'ATSIGN THEN                      <<01549>>07902000
                BEGIN                                          <<01549>>07904000
                SEG.(0:1) := 1; << RETURN @ SEEN >>            <<01549>>07906000
                TOS := 0; << SPACE FOR PNT'R RET. BY G'T >>    <<01549>>07908000
                GETTOKEN (BPS0,J,0); << SCAN PASS @ >>         <<01549>>07910000
                DEL;  << REMOVE RETURNED POINTER >>            <<01549>>07912000
                END;                                           <<01549>>07914000
             << GET CONDITION IF PRESENT >>                    <<01549>>07916000
             COND'STAK(0) := 0;  << EMPTY STAK >>              <<01549>>07918000
             CONDITION (COND'STAK,COND'STAK(0));               <<01549>>07920000
             END                                               <<01549>>07922000
          ELSE  << TAKE DEFAULT: COUNT := 1 >>                 <<01549>>07924000
             BEGIN                                             <<01549>>07926000
             COND'STAK(0) := 0;                                <<01549>>07928000
             END;                                              <<01549>>07930000
                                                               <<01549>>07932000
          << MUST END IN "," OR CR >>                          <<01549>>07934000
          J := FIELD (",");                                    <<01549>>07936000
          LOCATION.CRBIT := J.CRBIT;                           <<01549>>07938000
                                                               <<01549>>07940000
    END; << LOCATION >>                                        <<01549>>07942000
$PAGE "          BREAKPOINT ENTRY MANIPULATORS"                <<01007>>07944000
  SUBROUTINE SETBREAK(PROC,SEG,PLOC,COND,PARM);                <<01549>>07946000
    VALUE   PROC,SEG,PLOC,PARM;                                <<01549>>07948000
    INTEGER PROC,SEG,PLOC,PARM;                                <<01549>>07950000
    INTEGER ARRAY COND;                                        <<01549>>07952000
    BEGIN                                                               07954000
          PROC.PRIVBIT := PRIV;                                <<01549>>07956000
          << IF REQUESTED LOCAL MODE THEN LOC. MODE >>         <<01549>>07958000
          << ELSE TAKE DEFAULT - SYS MODE IF SYSBRK >>         <<01549>>07960000
          PROC.LOCBIT := IF PROC.LOCBIT = 1 OR NOT SYSBRK      <<01549>>07962000
                         THEN 1                                <<01549>>07964000
                         ELSE 0;                               <<01549>>07966000
          PROC.PERMBIT := SEG < 0;  << @ SEEN >>               <<01549>>07968000
          << DBLTRAP IF CONDITION SPEICIED OR ... >>           <<01549>>07970000
          << COUNT SPECIFIED                      >>           <<01549>>07972000
          PROC.DBLTRAP := IF COND(0) > 0 OR                    <<01549>>07974000
                          PROC.PERMBIT = 1 THEN 1 ELSE 0;      <<01549>>07976000
          SEG.(0:1) := 0; << CLEAR PERM BIT >>                 <<01549>>07978000
          J := ENTERSTOP(PROC,SEG,PLOC,COND,PLABEL);           <<01549>>07980000
          IF J <> 0 THEN                                       <<01549>>07982000
             BEGIN << PROCESS ERROR >>                         <<01549>>07984000
             IF J = 1 THEN GOTO NONO                           <<01549>>07986000
             ELSE IF J = 4 THEN WARN_5                         <<01549>>07988000
             ELSE IF J = 5 THEN GOTO NONO'PIN                  <<01549>>07990000
             ELSE IF J = 6 THEN GOTO NONO'SEG                  <<01549>>07992000
             ELSE                                              <<01549>>07994000
                BEGIN                                          <<01549>>07996000
                ERRMSG(J+1);                                   <<01549>>07998000
                GOTO NEXT;                                     <<01549>>08000000
                END;                                           <<01549>>08002000
             END;                                              <<01549>>08004000
    END;                                                                08006000
            << >>                                                       08008000
  SUBROUTINE RELBREAK(PN,C,P,PLABEL);                          <<01549>>08010000
    VALUE   PN,C,P;                                            <<01549>>08012000
    INTEGER PN,C,P,PLABEL;                                     <<01549>>08014000
    BEGIN                                                               08016000
          << IF REQUESTED LOCAL MODE THEN LOC. MODE >>         <<01549>>08018000
          << ELSE TAKE DEFAULT - SYS MODE IF SYSBRK >>         <<01549>>08020000
          PN.LOCBIT := IF PN.LOCBIT = 1 OR NOT SYSBRK          <<01549>>08022000
                         THEN 1                                <<01549>>08024000
                         ELSE 0;                               <<01549>>08026000
          J := REMOVESTOP(PN,C,P,REG,PLABEL);                  <<01549>>08028000
          IF J = 1 THEN GOTO NONO'PIN                          <<01549>>08030000
          ELSE IF J=2 THEN GOTO NONO'SEG;                      <<01549>>08032000
    END;                                                                08034000
            << >>                                              <<01549>>08036000
  SUBROUTINE DEF'MOVEFROMDSEG;                                 <<01549>>08038000
            << >>                                              <<01549>>08040000
  INTEGER SUBROUTINE OPER'LINK (STOP,LINK,OPNUM);              <<01549>>08042000
    VALUE LINK,OPNUM;                                          <<01549>>08044000
    INTEGER LINK,OPNUM;                                        <<01549>>08046000
    INTEGER ARRAY STOP;                                        <<01549>>08048000
    BEGIN                                                      <<01549>>08050000
    COMMENT:                                                   <<01549>>08052000
          THIS ROUTINE RETURNS THE LINK OF THE                 <<01549>>08054000
          REQUESTED OPERAND.                                   <<01549>>08056000
          PARAMETERS:                                          <<01549>>08058000
             STOP:    ARRAY CONTAINING BREAKPOINT              <<01549>>08060000
                      ENTRY                                    <<01549>>08062000
             LINK:    INDEX OF COND. IN STOP.                  <<01549>>08064000
             OPNUM:   OPERAND NUMBER (1/2)                     <<01549>>08066000
          RETURNS:                                             <<01549>>08068000
                      INDEX OF OPERAND IN ARRAY STOP           <<01549>>08070000
          NOTE:                                                <<01549>>08072000
                      NAMES OF PARAMETERS MUST NOT             <<01549>>08074000
                      BE CHANGED. THEY ARE NEEDED FOR          <<01549>>08076000
                      THE DEFINES LINKOPX;                     <<01549>>08078000
                                                               <<01549>>08080000
          IF OPNUM = 1 THEN OPER'LINK := LINKOP1               <<01549>>08082000
          ELSE OPER'LINK := LINKOP2;                           <<01549>>08084000
                                                               <<01549>>08086000
  END;                                                         <<01549>>08088000
            << >>                                              <<01549>>08090000
  SUBROUTINE FORMAT'OPER (OPARR,INFO);                         <<01549>>08092000
    VALUE INFO;                                                <<01549>>08094000
    INTEGER INFO;                                              <<01549>>08096000
    INTEGER ARRAY OPARR;                                       <<01549>>08098000
    BEGIN                                                      <<01549>>08100000
                                                               <<01549>>08102000
    COMMENT:                                                   <<01549>>08104000
          THIS ROUTINE FORMATS THE OPERAND IN OPARR.           <<01549>>08106000
          OPERAND IS EITHER A CONSTANT OR AN ADDRESS.          <<01549>>08108000
          PARAMAETERS:                                         <<01549>>08110000
             OPARR:  ARRAY CONTAINING THE OPERAND              <<01549>>08112000
             INFO:   DESCRIPTOR OF OPERAND                     <<01549>>08114000
          RESULTS:                                             <<01549>>08116000
                     FORMATTED OPERAND PLACED AT NEXT          <<01549>>08118000
                     LOCATION IN OUTPUT ARRAY.;                <<01549>>08120000
                                                               <<01549>>08122000
          IF INFO <> CONST'PRIMARY THEN                        <<01549>>08124000
             BEGIN  << ADDRESS >>                              <<01549>>08126000
             SENDID (REGY(OPARR.BKPT'REG)); << SEND REG >>     <<01549>>08128000
             IF OPARR.BKPT'REG = REGEA OR                      <<01549>>08130000
                OPARR.BKPT'REG = REGDA                         <<01549>>08132000
             THEN SENDOCT (OPARR.BKPT'BASE); << BANK-DST NUM >><<01549>>08134000
             << HANDLE OFFSET >>                               <<01549>>08136000
             IF OPARR.BKPT'REG = REGA THEN SENDOCT (OPARR(1))  <<01549>>08138000
             ELSE IF OPARR.BKPT'REG = REGEA THEN               <<01549>>08140000
                BEGIN                                          <<01549>>08142000
                SEND ("+");                                    <<01549>>08144000
                SENDOCT (OPARR(1));                            <<01549>>08146000
                END                                            <<01549>>08148000
             ELSE                                              <<01549>>08150000
                BEGIN << SEND + OR - >>                        <<01549>>08152000
                IF OPARR(1) >= 0 THEN SEND ("+")               <<01549>>08154000
                ELSE SEND ("-");                               <<01549>>08156000
                SENDOCT (\OPARR(1)\);                          <<01549>>08158000
                END;                                           <<01549>>08160000
             << INDIRECTION >>                                 <<01549>>08162000
             IF INFO = IND'PRIMARY THEN                        <<01549>>08164000
                BEGIN                                          <<01549>>08166000
                SEND (":");                                    <<01549>>08168000
                IF OPARR(2) < 0 THEN SEND ("-");               <<01549>>08170000
                SENDOCT (\OPARR(2)\);                          <<01549>>08172000
                END                                            <<01549>>08174000
             END  << ADDRESS >>                                <<01549>>08176000
          ELSE                                                 <<01549>>08178000
             BEGIN << CONSTANT >>                              <<01549>>08180000
             IF OPARR < 0 THEN SEND ("-");                     <<01549>>08182000
             SENDOCT (\OPARR\);                                <<01549>>08184000
             END;                                              <<01549>>08186000
    END;                                                       <<01549>>08188000
            << >>                                              <<01549>>08190000
  SUBROUTINE FORMAT'COND (STOP,COND'LINK);                     <<01549>>08192000
    VALUE COND'LINK;                                           <<01549>>08194000
    INTEGER COND'LINK;                                         <<01549>>08196000
    INTEGER ARRAY STOP;                                        <<01549>>08198000
    BEGIN                                                      <<01549>>08200000
    COMMENT:                                                   <<01549>>08202000
          THIS ROUTINE FORMATS THE CONDITION WHOSE             <<01549>>08204000
          BASE IS AT STOP(COND'LINK).                          <<01549>>08206000
          (A CONDITON IS EITHER A COUNT OR                     <<01549>>08208000
          'OPER RELOP OPER');                                  <<01549>>08210000
                                                               <<01549>>08212000
          IF STOP(COND'LINK).BKPT'CONDTYPE  <> T'NUMBER THEN   <<01549>>08214000
             BEGIN << CONDITON >>                              <<01549>>08216000
             J := OPER'LINK (STOP,COND'LINK,1);<<LINK 1ST OP>> <<01549>>08218000
             FORMAT'OPER(STOP(J),STOP(COND'LINK).BKPT'OP1INFO);<<01549>>08220000
             << SEND RELOP >>                                  <<01549>>08222000
             J := STOP(COND'LINK).BKPT'CONDTYPE-FIRSTSPECIAL;  <<01549>>08224000
             SENDID (SPECIALS(J));                             <<01549>>08226000
             J := OPER'LINK (STOP,COND'LINK,2);<<LINK 2ND OP>> <<01549>>08228000
             FORMAT'OPER(STOP(J),STOP(COND'LINK).BKPT'OP2INFO);<<01549>>08230000
             END                                               <<01549>>08232000
          ELSE                                                 <<01549>>08234000
             BEGIN << COUNT >>                                 <<01549>>08236000
             FORMAT'OPER (STOP(COND'LINK-2),CONST'PRIMARY);    <<01549>>08238000
             SEND ("/");                                       <<01549>>08240000
             << NUMBER OF HITS >>                              <<01549>>08242000
             FORMAT'OPER (STOP(COND'LINK-1),CONST'PRIMARY);    <<01549>>08244000
             END;                                              <<01549>>08246000
    END;                                                       <<01549>>08248000
                                                               <<01549>>08250000
            << >>                                              <<01549>>08252000
  SUBROUTINE FORMAT'BKPT (STOP);                               <<01549>>08254000
    INTEGER ARRAY STOP;                                        <<01549>>08256000
    BEGIN                                                      <<01549>>08258000
    COMMENT:                                                   <<01549>>08260000
          THIS ROUTINE FORMATS THE BREAKPOINT ENTRY            <<01549>>08262000
          STARTING AT STOP(0);                                 <<01549>>08264000
                                                               <<01549>>08266000
          RTC := STOP (CLABELOFFSET); << CLABEL >>             <<01549>>08268000
          << TRANSLATE SEGIDTYPE TO PHYSICAL CST >>            <<01610>>08270000
          IF RTC.SEGIDTYPE = SEGIDSL THEN                      <<01610>>08272000
             BEGIN << SL SEGMENT - CHANGE TO SEG # >>          <<01610>>08274000
             RTC := (CONVSEGIDTOSTINX (RTC) - DFC) & LSR (2);  <<01610>>08276000
             END                                               <<01610>>08278000
          ELSE << PROGRAM SEGMENT IDENTIFER >>                 <<01610>>08280000
             RTC := (LOGICAL(RTC) LAND % 77) LOR %300;         <<01610>>08282000
          RTP := STOP(PLOCOFFSET);                             <<01549>>08284000
          << ADJUST FOR FAKE BREAKPOINT >>                     <<01549>>08286000
          IF STOP.BKPT'FAKE = 1 THEN                           <<01549>>08288000
             RTP := RTP - 1 - STOP.BKPT'TW;                    <<01549>>08290000
          FORMT;  << FORMAT LOCATION >>                        <<01549>>08292000
          IF STOP.BKPT'COND = 1 OR STOP.BKPT'PERM = 1 THEN     <<01549>>08294000
             BEGIN                                             <<01549>>08296000
             SEND (",");                                       <<01549>>08298000
             IF STOP.BKPT'PERM = 1 THEN SEND ("@");            <<01549>>08300000
             IF STOP.BKPT'COND = 1 THEN                        <<01549>>08302000
                FORMAT'COND (STOP,(STOP.BKPT'SIZE-1));         <<01549>>08304000
             END;                                              <<01549>>08306000
    END;                                                       <<01549>>08308000
                                                               <<01549>>08310000
            << >>                                              <<01549>>08312000
  INTEGER SUBROUTINE HEAD'BKPT'LIST (PROC,DSTNUM);             <<01549>>08314000
    VALUE PROC,DSTNUM;                                         <<01549>>08316000
    INTEGER PROC,DSTNUM;                                       <<01549>>08318000
    BEGIN                                                      <<01549>>08320000
    COMMENT:                                                   <<01549>>08322000
          THIS ROUTINE RETURNS THE INDEX OF THE                <<01549>>08324000
          1ST ENTRY OF THE BREAKPOINT CHAIN OF                 <<01549>>08326000
          PROC.                                                <<01549>>08328000
          PARAMETERS:                                          <<01549>>08330000
             PROC:    IF 0 THEN SYS BREAKPOINT CHAIN           <<01549>>08332000
                      ELSE PIN NUMBER                          <<01549>>08334000
             DSTNUM:  DST NUMBER OF SEGMENT CONTAINING         <<01549>>08336000
                      TABLE                                    <<01549>>08338000
          RETURNS:                                             <<01549>>08340000
             <> 0:    INDEX OF 1ST ENTRY                       <<01549>>08342000
                0:    CHAIN IS EMPTY;                          <<01549>>08344000
                                                               <<01549>>08346000
          IF PROC = 0 THEN J := SYS'BKPT'EXT'X                 <<01549>>08348000
          ELSE J := PCBI'                                      <<01549>>08350000
                    (PROC*PCBSIZE+PCB'BKPT'WD).PCB'BKPT'BITS;  <<01549>>08352000
          IF J <> 0 THEN MOVEFROMDSEG (@J,DSTNUM,J,1);         <<01549>>08354000
          HEAD'BKPT'LIST := J;                                 <<01549>>08356000
    END;                                                       <<01549>>08358000
                                                               <<01549>>08360000
            << >>                                              <<01549>>08362000
  SUBROUTINE COPY'BKPT'ENTRY (INDEX,DSTNUM,RESULT);            <<01549>>08364000
    VALUE INDEX,DSTNUM;                                        <<01549>>08366000
    INTEGER INDEX,DSTNUM;                                      <<01549>>08368000
    INTEGER ARRAY RESULT;                                      <<01549>>08370000
    BEGIN                                                      <<01549>>08372000
    COMMENT:                                                   <<01549>>08374000
          THIS ROUTINE COPYS THE REQUEST BREAKPOINT            <<01549>>08376000
          ENTRY.                                               <<01549>>08378000
          PARAMETERS:                                          <<01549>>08380000
             INDEX:    INDEX OF ENTRY IN THE BREAKPOINT        <<01549>>08382000
                       TABLE                                   <<01549>>08384000
             DSTNUM:   DST NUMBER OF THE BREAKPOINT TABLE      <<01549>>08386000
          RETURNS:                                             <<01549>>08388000
             RESULT:   THE REQUESTED BREAKPOINT ENTRY          <<01549>>08390000
                       (TRAILING ZEROS HAVE BEEN REMOVED);     <<01549>>08392000
                                                               <<01549>>08394000
          MOVEFROMDSEG (@RESULT,DSTNUM,INDEX,MAX'BKPT'SIZE);   <<01549>>08396000
          J := RESULT.BKPT'SIZE - 1;                           <<01549>>08398000
          WHILE RESULT(J) = 0 DO J := J-1;                     <<01549>>08400000
          RESULT.BKPT'SIZE := J+1;                             <<01549>>08402000
    END;                                                       <<01549>>08404000
                                                               <<01549>>08406000
$PAGE "          ENTER AND DETERMINE ENVIRONMENT"              <<01007>>08408000
            << >>                                                       08410000
                                                                        08412000
                                                                        08414000
  SYSTEMDEBUG:                                                          08416000
  SNOOP:                                                                08418000
                                                                        08420000
          TRAPSOFF;                                                     08422000
          BREAK_FALSE;                                                  08424000
          DBL'INSTR'ADJ_0;                                     <<01040>>08426000
          IF STATUS.(8:8)=BRPTCSTN THEN                                 08428000
               BEGIN DISABLE;      <<BREAKPOINT>>                       08430000
                     X_XREGISTER; << SAVE X FROM ININ >>       <<01040>>08432000
                     TOS_MARK;                                          08434000
                     DUPLICATE;                                         08436000
                     PUSH(S,Q);                                         08438000
                     ASSEMBLE(CAB,SUB; XCH,CAB; SUB,XCH);               08440000
                     SET(Q,S);                                          08442000
                     ENABLE;                                            08444000
                     IF X=TRUE THEN DBL'INSTR'ADJ_1;           <<01040>>08446000
                     BREAK_TRUE;                                        08448000
               END;                                                     08450000
          DISABLE;                                                      08452000
          X_@INFO(LAST'IND)-@MARK;                             <<01549>>08454000
          ENABLE;                                                       08456000
          WHILE (X_X-1)>1 DO STAK(X)_0;                                 08458000
          ERRORON;                                                      08460000
          CRIT_SETCRITICAL;                                             08462000
          RDX_0;                   <<SAVE DB ENVIRONMENT>>              08464000
          TOS _ PCBI'((PINX_PIX)+2);                                    08466000
          IF >= THEN TOS _ 0D ELSE                                      08468000
               BEGIN PUSH(DB);                                          08470000
                     RDX_2;                                             08472000
                     RESETDB(-1);                                       08474000
               END;                                                     08476000
          DRDBV _ TOS;       <<BANK,DB>>                                08478000
          TOS_TOS.(1:10);                                               08480000
          DUPLICATE;                                                    08482000
          RDBX_TOS;                                                     08484000
          IF TOS<>0 THEN                                                08486000
               BEGIN RDX_RDX+1;                                         08488000
                     EXCHANGEDB(0);                                     08490000
               END;                                                     08492000
          PUSH(Q,DL);              <<VALIDATE ACCESS>>                  08494000
          ASSEMBLE(XCH,SUB; DUP,STAX);                                  08496000
          TOS_STAK(X_X-1);                                              08498000
          I_TOS-TOS;               <<GET LOG I/O DEV>>                  08500000
            LDEV:=STAK(I+3)&LSL(8) + STAK(I+4).(8:8);          <<00590>>08502000
         K:=F(%1074).(8:8);<<CONSOLE LDEV #>>                  <<00552>>08504000
         IF STAK(I+6).(5:1)=0 THEN                             <<00829>>08506000
            BEGIN                                              <<00829>>08508000
                                                               <<00829>>08510000
            <<BATCH JOBS WHOSE INPUT DEVICE IS NOT CONSOLE MAY <<00829>>08512000
            <<USE DEBUG IF THEY ARE IN BREAK MODE, AND THEN THE<<00829>>08514000
            <<INPUT & OUTPUT DEVICES ARE THE SYSTEM CONSOLE>>  <<00829>>08516000
                                                               <<00829>>08518000
            IF NOT BREAK THEN GO TO FINI;<<DEBUG NOT ALLOWED>> <<00829>>08520000
            LDEV:=K&LSL(8) + K;                                <<00829>>08522000
         END;                                                  <<00829>>08524000
         SYS:=PCBI'(PINX+9).(6:2);<<SYSTEM PROCESS FLAG>>      <<00552>>08526000
         IF SYS<>0 THEN <<SYSTEM PROCESS>>                     <<00590>>08528000
         BEGIN                                                 <<00590>>08530000
            PRIV := TRUE;                                               08532000
            IF PCBI'(PINX+9).(6:3)  = 2 THEN <<    CI PROCESS>><<00590>>08534000
               SYSBRK := FALSE                                          08536000
            ELSE                                                        08538000
            BEGIN                                              <<00590>>08540000
               LDEV:=K&LSL(8) + K; <<CONSOLE IS IN&OUT DEVICE>><<00590>>08542000
               SYSBRK:=TRUE;  <<PRIVILEGED, SYSTEM BREAK>>     <<00590>>08544000
            END;                                               <<00590>>08546000
         END                                                   <<00590>>08548000
         ELSE       <<NON-SYSTEM PROCESS>>                     <<00590>>08550000
         BEGIN                                                 <<00590>>08552000
            K:=STAK(I+6).(6:10);  <<JIT>>                      <<00552>>08554000
            EXCHANGEDB(K);                                     <<00552>>08556000
            SYSBRK := FALSE;                                   <<00590>>08558000
            PRIV:=BASE(39).(9:1);<<GET PRIVILEGED BIT>>        <<00590>>08560000
            EXCHANGEDB(0);                                     <<00552>>08562000
         END;                                                  <<00552>>08564000
          REG(REGSY) _ %1000;          <<PROCESS REGISTERS>>            08566000
          RPCB _ PINX/PCBSIZE;                                          08568000
          RSTK _ PCBI'(PINX+3).(1:10);                                  08570000
          RS  _@USERS;                                                  08572000
          RQ  _@MARK-MARK;                                              08574000
          PUSH(Z,DL);                                                   08576000
          RDL _TOS;                                                     08578000
          RZ  _TOS;                                                     08580000
          RX  _XREGISTER;                                               08582000
          RP  _DELTAP.(2:14);                                           08584000
          TOS_STATUS;                                                   08586000
          DUPLICATE;                                                    08588000
          RST _TOS;                                                     08590000
          RCST _TOS.(8:8);                                              08592000
          PDISABLE;                                                     08594000
          CLABEL := BUILDSEGID (SEG'ID'TYPE(RCST),RCST,RPCB);  <<01610>>08596000
          TOS := CONVSEGIDTOSTINX (CLABEL);                    <<01610>>08598000
          RPL _ (DSTI'(TOS).(4:12))&LSL(2)-1;                           08600000
          PENABLE;                                                      08602000
          SETSEG(%120,RCST,BANK); <<FREEZE CURRENT CODE SEG>>  <<00180>>08604000
          STTLEN:=BASE(RPL).(8:8)+1; <<LAST STT ENTRY + 1>>    <<00180>>08606000
          RESETSEG(%120,RCST);  <<UNFREEZE CODE SEGMENT>>      <<00180>>08608000
          EXIT'TO'TRAP := FALSE; << USER TRAP >>               <<01069>>08610000
          IF BREAK THEN                                                 08612000
               BEGIN                                           <<01040>>08614000
                     COMMENT: RP POINTS TO 1ST WORD            <<01040>>08616000
                        OF INSTR. IF DBL'INSTR'ADJ THEN        <<01040>>08618000
                        %36000 AT RP+1;                        <<01040>>08620000
                     TOS _ TESTSTOP(CLABEL,                    <<01040>>08622000
                            RP+INTEGER(DBL'INSTR'ADJ),PINX);   <<01040>>08624000
                     ASSEMBLE(TBC 1);                                   08626000
                     IF <> THEN PRIV_TRUE;                              08628000
                     ASSEMBLE(TBC 2);                                   08630000
                     DEL;                                               08632000
                     IF = THEN SYSBRK_TRUE ELSE SYSBRK_FALSE;  <<01549>>08634000
                     IF STATUS<0 THEN PRIV_TRUE;                        08636000
                     RELBREAK(RPCB,RCST+%100000,               <<01549>>08638000
                             RP+INTEGER(DBL'INSTR'ADJ),PLABEL);<<01549>>08640000
                     IF X=0 THEN GOTO FINI   <<NULL BREAK>>    <<01069>>08642000
                     ELSE IF X=2 THEN        <<USER TRAP>>     <<01069>>08644000
                        BEGIN                                  <<01069>>08646000
                        << IF ARMED IN USER MODE AND EXEC.  >> <<01069>>08648000
                        << IN PRIV MODE THEN IGNORE ELSE OR >> <<01069>>08650000
                        IF NOT (PLABEL < 0 LAND STATUS < 0)    <<01069>>08652000
                           THEN EXIT'TO'TRAP := TRUE;          <<01069>>08654000
                        GOTO FINI;                             <<01069>>08656000
                        END                                    <<01069>>08658000
                     ELSE PLABEL := 0;<< WILL CLEAR USER &...>><<01069>>08660000
                                      << DEBUG TRAPS FOR 'C' >><<01069>>08662000
               END;                                                     08664000
          RLOG_IF SYS<>0 THEN 0 ELSE GETLCST(RCST);                     08666000
          LINE;                                                         08668000
          TOS_@POUT;                                                    08670000
          IF BREAK   THEN MOVE *_"*BREAK* ",2                           08672000
                     ELSE MOVE *_"*DEBUG* ",2;                          08674000
          IF SYSBRK THEN MOVE *_"SYS.",2;                               08676000
          IF PRIV THEN MOVE *_"PRIV.",2;                                08678000
          @POUT_TOS;                                                    08680000
          SENDLCST(RLOG,RCST);                                          08682000
          SEND(".");                                                    08684000
          SENDOCT(RP+INTEGER(DBL'INSTR'ADJ));                  <<01040>>08686000
          OUTPUT;                                                       08688000
          IF DBL'INSTR'ADJ THEN                                <<01040>>08690000
               BEGIN << WARN BREAK AT 2ND WORD OF >>           <<01040>>08692000
                     << INSTR. BUT P AT 1ST       >>           <<01040>>08694000
                     CLEAR;                                    <<01040>>08696000
                     MOVE POUT :=                              <<01040>>08698000
                        ( "**WARNING: BREAK AT 2ND OF TWO",    <<01040>>08700000
                          " WORD INSTRUCTION ==> P = "),2;     <<01040>>08702000
                     @POUT := TOS;                             <<01040>>08704000
                     SENDLCST(RLOG,RCST);                      <<01040>>08706000
                     SEND(".");                                <<01040>>08708000
                     SENDOCT(RP);                              <<01040>>08710000
                     OUTPUT;                                   <<01040>>08712000
               END;                                            <<01040>>08714000
          WARN_0;                                                       08716000
          EXPRLAB_@EXPRESSION;                                          08718000
          CONTLAB_@CONTENTS;                                            08720000
          RVALLAB_@REGVALUE;                                            08722000
          @COND'STAK := @INFO(IND'COND'STAK);                  <<01549>>08724000
        <<HELP;>>                                              <<01549>>08726000
        <<SETUPTABLE;>>                                        <<01549>>08728000
  NEXT:                                                                 08730000
          IF WARN<>0 THEN GOTO WARNING;                                 08732000
          TOS_@INFO(LAST'IND);                                 <<01549>>08734000
          SET(S);                                                       08736000
          RESETCRITICAL(CRIT);                                          08738000
          PRINTFLAG_0;                                                  08740000
          CLEAR;                                                        08742000
          SEND("?");                                                    08744000
          TYPE;                                                         08746000
          INPUT;                                                        08748000
          CRIT_SETCRITICAL;                                             08750000
          TOS_"  ";                                                     08752000
         TOS.(0:8) := IF PINFO=ALPHA                           <<02344>>08754000
                       THEN LOGICAL(PINFO) LAND %137           <<02344>>08756000
                      ELSE PINFO;                              <<02344>>08758000
          CHAR_TOS;                                                     08760000
          GETCHAR;                                                      08762000
          INDEX_-1;                                                     08764000
          WHILE (INDEX_INDEX+1)>=0 DO                                   08766000
               BEGIN TOS_COMMAND(INDEX);                                08768000
                     DUPLICATE;                                         08770000
                     IF TOS="  " THEN GOTO ERROR;                       08772000
                     IF TOS=CHAR THEN                                   08774000
                       BEGIN CHEKM(CMNPC,INDEX);                        08776000
                             GOTO SWCOM(INDEX);                         08778000
                       END;                                             08780000
               END;                                                     08782000
$PAGE "          ERROR CONDITION HANDLERS"                     <<01007>>08784000
  ERROR:                                                                08786000
          ERRMSG(0);                   <<SYNTAX>>                       08788000
          GOTO NEXT;                                                    08790000
  NONO:                                                                 08792000
          ERRMSG(1);                   <<ERROR>>                        08794000
          GOTO NEXT;                                                    08796000
  NONO'PIN:                                                    <<01549>>08798000
          << SET UP POINTER TO PIN >>                          <<01549>>08800000
          @PINFO := @PIN'LOC;                                  <<01549>>08802000
          GOTO NONO;                                           <<01549>>08804000
  NONO'SEG:                                                    <<01549>>08806000
          << SET UP POINTER TO SEG >>                          <<01549>>08808000
          @PINFO := @SEG'LOC;                                  <<01549>>08810000
          GOTO NONO;                                           <<01549>>08812000
  BOUNDS:                                                               08814000
          ERRMSG(2);                   <<BOUNDS>>                       08816000
          GOTO NEXT;                                                    08818000
  WARNING:                                                              08820000
          ERRMSG(WARN);                <<WARNING MSG>>                  08822000
          WARN_0;                                                       08824000
          GOTO NEXT;                                                    08826000
$PAGE "          HELP/SET REGISTER VALUE COMMANDS"             <<01007>>08828000
            << >>                                                       08830000
            << H E L P >>                                               08832000
            << >>                                                       08834000
  HELPL:                                                                08836000
          COMMENT:                                             <<01.KM>>08838000
            COMMAND MUST HAVE ONE OF THE FOLLOWING FORMS:      <<01.KM>>08840000
              (H   ) <BLANKS> (TERM    )                       <<01.KM>>08842000
              (HELP)          (TERMINAL)                       <<01.KM>>08844000
            WE DISALLOW "H T" TO AVOID CONFUSION WITH USER     <<01.KM>>08846000
            HELP FACILITY, "T" REFERRING TO DEBUG T-COMMAND;   <<01.KM>>08848000
                                                               <<01.KM>>08850000
          MOVE PINFO := PINFO WHILE ANS; <<UPSHIFT>>           <<00590>>08852000
          IF PINFO(-1)="HELP" THEN                             <<01.KM>>08854000
            BEGIN                                              <<01.KM>>08856000
            @PINFO:=@PINFO(2);         <<PTR TO "P">>          <<01.KM>>08858000
            GETCHAR;                   <<SKIP ANY BLANKS>>     <<01.KM>>08860000
            END;                                               <<01.KM>>08862000
          MOVE PINFO := PINFO WHILE ANS; <<UPSHIFT>>           <<00590>>08864000
          IF PINFO<>"TERMINAL",2 AND                           <<01.KM>>08866000
             PINFO<>"TERM",2 THEN GOTO ERROR;                  <<01.KM>>08868000
          SCAN * WHILE CRBLANK;                                <<01.KM>>08870000
          IF NOCARRY THEN GOTO ERROR;  <<NOT END OF LINE>>     <<01.KM>>08872000
          HELP;                                                         08874000
          GOTO NEXT;                                                    08876000
          << >>                                                         08878000
          << SET REGISTER VALUE >>                                      08880000
          << >>                                                         08882000
  SETRL:                                                                08884000
          GETID(TRUE);                                                  08886000
          INDEX_X;                                                      08888000
          IF < THEN GOTO ERROR;                                         08890000
          CHEKM(RMNPR,-INDEX);                                          08892000
          IF PINFO<>"_" THEN                                            08894000
             BEGIN                                                      08896000
             IF PINFO<>":" THEN GOTO ERROR;                             08898000
             GETCHAR;                                                   08900000
             IF PINFO<>"=" THEN GOTO ERROR;                             08902000
             END;                                                       08904000
          GETCHAR;                                                      08906000
          TOS_FIELD(0);                                                 08908000
          IF TOS=6 THEN GOTO NEXT;                                      08910000
          K_X;                                                          08912000
          FLAGY_1;                                                      08914000
          GOTO MRSW(INDEX);                                             08916000
          GOTO NEXT;                                                    08918000
$PAGE "          DUMP/MODIFY COMMANDS"                         <<01007>>08920000
            << >>                                                       08922000
            << DUMP REGISTERS/MEMORY >>                                 08924000
            << >>                                                       08926000
  DUMPL:                                                                08928000
          DUMPFLAG_TRUE;                                                08930000
          PRINTFLAG_DEVICE;                                             08932000
          TOS_BMNPD;                                                    08934000
          TOS_BMPMD;                                                    08936000
          GOTO DML;                                                     08938000
            << >>                                                       08940000
            << MODIFY REGISTERS/MEMORY >>                               08942000
            << >>                                                       08944000
  MODIFYL:                                                              08946000
          DUMPFLAG_FALSE;                                               08948000
          TOS_BMNPM;                                                    08950000
          TOS_BMPMM;                                                    08952000
  DML:                                                                  08954000
          K_TOS;                                                        08956000
          MODE_TOS;                                                     08958000
          GETID(FALSE);                                                 08960000
          INDEX_X;                                                      08962000
          IF = THEN GOTO LREG;                                          08964000
          IF < THEN INDEX_REGDB;                                        08966000
          CHEKM(MODE,INDEX);                                            08968000
          CHEKM(K,-INDEX);                                              08970000
          IF INDEX=REGV THEN GOTO LVIRT;                                08972000
          GOTO LMEMO;                                                   08974000
  LREG:   I_K_0;                                                        08976000
  LR1:    IF LOGICAL(PINFO)=CHARCR THEN GOTO LR2;                       08978000
          IF PINFO<>"," THEN GOTO ERROR;                                08980000
          GETCHAR;                                                      08982000
          GETID(TRUE);                                                  08984000
          INDEX_X;                                                      08986000
          IF < THEN GOTO LR1;                                           08988000
          CHEKM(RMNPR,-INDEX);                                          08990000
          TOS_1&CSR(INDEX+1);                                           08992000
          IF INDEX>=16                                                  08994000
               THEN  K_TOS LOR LOGICAL(K)                               08996000
               ELSE  I_TOS LOR LOGICAL(I);                              08998000
          GOTO LR1;                                                     09000000
  LR2:    IF (LOGICAL(I) LOR LOGICAL(K))=0 THEN                         09002000
               BEGIN I_MASK(RMNPR);                                     09004000
                     K_MASK(X_X+1);                                     09006000
                     MODE_0;                                            09008000
               END;                                                     09010000
          INDEX_0;                                                      09012000
          FLAGY_0;                                                      09014000
          TOS_I;                                                        09016000
          TOS_K;                                                        09018000
  LLNO:   CLEAR;                                                        09020000
  LR5:    IF (INDEX_INDEX+1)>REGEND THEN GOTO LR6;                      09022000
          IF INDEX=REG1 AND MODE=0 AND DUMPFLAG THEN                    09024000
             BEGIN OUTPUT;                                              09026000
                   CLEAR;                                               09028000
             END;                                                       09030000
          TOS_TOS&DLSL(1);                                              09032000
          IF >= THEN GOTO LR5;                                          09034000
          SENDREG(0,0,INDEX);                                           09036000
          IF DUMPFLAG THEN GOTO LR5;                                    09038000
          I_@POUT;                                                      09040000
  LR7:    TOS_INOCTAL(K,I);                                             09042000
          TOS.(14:1)_0;                                                 09044000
          IF <> THEN                                                    09046000
               BEGIN ASSEMBLE(DELB,DELB);                               09048000
                     TOS_0D;                                            09050000
                     ASSEMBLE(CAB);                                     09052000
               END;                                                     09054000
          IF TOS<>0 THEN GOTO LLNO;                                     09056000
          GOTO MRSW(INDEX);                                             09058000
  LLST:   IF NOT PRIV THEN K_STATUS CAT K(2:2:6);                       09060000
          STATUS_K;                                                     09062000
          GOTO LLYES;                                                   09064000
  LLXR:   XREGISTER_K;                                                  09066000
          GOTO LLYES;                                                   09068000
  LLDL:   IF K>0 THEN GOTO LLERR;                                       09070000
          K_DLSIZE(K);                                                  09072000
          GOTO LLYES;                                                   09074000
  LLQ:    IF K>RS THEN GOTO LLERR;                                      09076000
          COMMENT:                                             <<00445>>09078000
            DL MAY MOVE THEREFORE MUST ALWAYS REPEG;           <<00445>>09080000
          PUSH(DL);                                            <<00445>>09082000
          @P:=TOS;                                             <<00445>>09084000
          @PXFIX:=@P(-P(-2));                                  <<00445>>09086000
          IF K<PXFIX(QINIT) THEN GOTO LLERR;                   <<00445>>09088000
          MARK_@MARK-K;                                                 09090000
          GOTO LLYES;                                                   09092000
  LLS:    IF K<RQ THEN GOTO LLERR;                                      09094000
          IF K>RZ THEN GOTO LLERR;                                      09096000
          PUSH(DL);                                            <<01.03>>09098000
          @P:=TOS;                                             <<01.03>>09100000
          @PCBX:=@P(-P(-1));                                   <<01.03>>09102000
          @PXFIX:=@P(-P(-2));                                  <<01.03>>09104000
          MAXSTACK:=PXFIX(PXMAX)-PCBX(1);                      <<01.03>>09106000
          IF K > MAXSTACK THEN << Z MAY BE BEYOND MAXSTACK >>  <<01.03>>09108000
            << BECAUSE OF A STKOVERFLOW AND THUS THIS EXTRA >> <<01.03>>09110000
            << CHECK IS NEEDED FOR S                        >> <<01.03>>09112000
            GOTO LLERR;  << CANNOT MODIFY S BEYOND MAXSTACK >> <<01.03>>09114000
          X_K-RS;                                                       09116000
          IF = THEN GOTO LLYES;                                         09118000
          MARK_MARK+X;                                                  09120000
          IF X<0 THEN                                                   09122000
               BEGIN TOS_K+1;      <<DECREMENT>>                        09124000
                     ASSEMBLE(DUP);                                     09126000
                     TOS_TOS-X;                                         09128000
                     PUSH(S);                                           09130000
                     TOS_TOS-2-RS;                                      09132000
                     ASSEMBLE(MOVE 3);                                  09134000
                     PUSH(S);                                           09136000
                     TOS_TOS+X;                                         09138000
               END ELSE                                                 09140000
               BEGIN PUSH(S);      <<INCREMENT>>                        09142000
                     TOS_TOS+X;                                         09144000
                     SET(S);                                            09146000
                     PUSH(S);                                           09148000
                     ASSEMBLE(DUP);                                     09150000
                     TOS_TOS-X;                                         09152000
                     ASSEMBLE(DUP);                                     09154000
                     TOS_TOS-RS;                                        09156000
                     TOS_-TOS;                                          09158000
                     ASSEMBLE(MOVE 3);                                  09160000
                     PUSH(S);                                           09162000
               END;                                                     09164000
          PUSH(Q);                                                      09166000
          TOS_TOS+X;                                                    09168000
          SET(Q,S);                                                     09170000
          GOTO LLYES;                                                   09172000
  LLZ:    IF K<RS THEN GOTO LLERR;                                      09174000
          K_ZSIZE(K);                                                   09176000
          GOTO LLYES;                                                   09178000
  LLP:    IF K>RPL-STTLEN THEN GOTO LLERR;                     <<00180>>09180000
          IF K<0 THEN GOTO LLERR;                                       09182000
          DELTAP.(2:14)_K;                                              09184000
          GOTO LLYES;                                                   09186000
  LLN:    GOTO LLYES;                                                   09188000
  LLERR:  CLEAR;                                                        09190000
          IF FLAGY THEN GOTO NONO;                                      09192000
          GOTO LR7;                                                     09194000
  LLYES:  REG(INDEX)_K;                                                 09196000
          PUSH(Z);                                                      09198000
          RZ  _TOS;                                                     09200000
          IF FLAGY THEN GOTO NEXT;                                      09202000
          GOTO LLNO;                                                    09204000
  LR6:    IF NOT DUMPFLAG THEN GOTO NEXT;                               09206000
          IF MODE<>0 THEN GOTO LR3;                                     09208000
          IF NOT PRIV THEN GOTO LR8;                                    09210000
          OUTPUT;                                                       09212000
          CLEAR;                                                        09214000
          SENDREG("PC","B ",REGR );                                     09216000
          SENDREG("CS","T ",REGPB);                                     09218000
  LR8:    RLOG_GETLCST(RCST);                                           09220000
          SENDREG("LC","ST",REGLOG);                                    09222000
          IF NOT PRIV THEN GOTO LR3;                                    09224000
          SENDREG("ST","AK",REGDB);                                     09226000
          TOS_RDX-1;                                                    09228000
          DEL;                                                          09230000
          IF < THEN GOTO LR3;                                           09232000
          IF = THEN SENDREG("DS","T ",REGDBX)                           09234000
               ELSE BEGIN SENDREG("BA","NK",REGBNK);                    09236000
                          SENDREG("D ","X ",REGDBV);                    09238000
                    END;                                                09240000
  LR3:    OUTPUT;                                                       09242000
          IF PRINTFLAG<>0 THEN LINE;                                    09244000
          GOTO NEXT;                                                    09246000
  LVIRT:  TOS_1;                                                        09248000
          TOS_INDEX;                                                    09250000
          IF FACTOR=0 THEN GOTO ERROR;                                  09252000
          TOS_X;                                                        09254000
          IF = THEN TOS_TOS+SYSLDEV;                                    09256000
          SEGX_TOS;                                                     09258000
          IF DEVTYPE(SEGX)>=8 THEN GOTO NONO;                           09260000
          SEGX_SEGX&LSL(8);                                             09262000
          IF OPER("++")=0 THEN GOTO NONO;  <<MISSING +>>       <<00282>>09264000
          TOS_%136;                                                     09266000
          TOS_0;                                                        09268000
          TOS_0D;                                                       09270000
          GOTO LLX;                                                     09272000
  LMEMO:  TOS_0;                                                        09274000
          MEMBASE(INDEX,0,0,0,0);                                       09276000
  LLX:    DISPL_TOS;                                                    09278000
          BANK_TOS;                                                     09280000
          SEG_TOS;                                                      09282000
          MODE_TOS;                                                     09284000
          INDEX_TOS;                                                    09286000
          FLAGX_TOS;                                                    09288000
          FLAGY_0;                                                      09290000
          NEG _ 0;                                                      09292000
  LLY:    TOS_FIELD(":,");                                              09294000
          DISPL_DISPL+X;                                                09296000
          IF NEG = 0 THEN FLAGY _ 1;                                    09298000
          IF NOT FLAGX THEN CHEKK(MODE,SEG,BANK,DISPL,0);               09300000
          IF LOGICAL(TOS) THEN                                          09302000
               BEGIN IF FLAGX THEN                                      09304000
                       BEGIN TOS_FIELD(":,");                           09306000
                             IF LOGICAL(TOS) THEN GOTO ERROR;           09308000
                             IF X>%17 OR X<0  THEN GOTO ERROR; <<00264>>09310000
                             SEGX_SEGX+X;                               09312000
                             GOTO LLYC;                                 09314000
                       END;                                             09316000
                     FLAGY _ 1;                                         09318000
                     TOS_MODE;                                          09320000
                     ASSEMBLE(TRBC 15);                                 09322000
                     IF <> THEN                                         09324000
                       BEGIN ASSEMBLE(TEST);                            09326000
                             IF = THEN TOS_REGDB ELSE                   09328000
                               BEGIN SEG_RCST;                          09330000
                                     TOS_REGPB;                         09332000
                               END;                                     09334000
                             INDEX_TOS;                                 09336000
                       END;                                             09338000
                     MODE_TOS;                                          09340000
                     SETSEG(MODE,SEG,BANK);                             09342000
                     DISPL_BASE(DISPL);                                 09344000
                     RESETSEG(MODE,SEG);                                09346000
                     GOTO LLY;                                          09348000
               END;                                                     09350000
  LLYC:   X _ 0;                                                        09352000
          IF PINFO <> ALPHA THEN FIELD(",");                            09354000
          TOS_X;                                                        09356000
          IF = THEN TOS_TOS+1;                                          09358000
          RCNT_TOS;                                                     09360000
          CNT_0;                                                        09362000
          IF NOT FLAGX AND NOT CHEKK(MODE,SEG,BANK,DISPL,RCNT) THEN     09364000
             BEGIN WARN_2;                                              09366000
                   RCNT_X;                                              09368000
             END;                                                       09370000
          GETMODE;                                                      09372000
          CHMODE_X;                                                     09374000
          << SET NUMBER OF WORDS DUMPED PER ROW >>             <<01549>>09376000
          ROW'SIZE := IF CHMODE=CODE THEN INSTR'PER'ROW ELSE 8;<<01549>>09378000
  CONT:                                                                 09380000
          IF FLAGX THEN GETVIRT;                                        09382000
          SETSEG(MODE,SEG,BANK);                                        09384000
          K_-1;                                                         09386000
          WHILE(K_K+1)<INTEGER(ROW'SIZE) DO                    <<01549>>09388000
               BEGIN TEMP(K)_BASE(DISPL+K);                             09390000
                     IF CHMODE = CODE THEN                     <<01549>>09392000
                        BEGIN << GET 2ND WORD >>               <<01549>>09394000
                        TEMP(MAX'INSTR'ROW+K) :=               <<01549>>09396000
                           IF (CNT+1)<RCNT THEN BASE(DISPL+K+1)<<01549>>09398000
                           ELSE BAD'2NDWORD;                   <<01549>>09400000
                        END;                                   <<01549>>09402000
                     IF (CNT_CNT+1)>=RCNT THEN GOTO CONTX;              09404000
                     IF NOT DUMPFLAG THEN GOTO CONTX;                   09406000
               END;                                                     09408000
          K_K-1;                                                        09410000
  CONTX:  RESETSEG(MODE,SEG);                                           09412000
          K_K+1;                                                        09414000
          CLEAR;                                                        09416000
          IF FLAGX=2 THEN GOTO CONTW;                                   09418000
          SENDID(REGY(INDEX));                                          09420000
          IF FLAGX THEN                                                 09422000
               BEGIN SENDOCT(SEGX.(0:8));                               09424000
                     SEND("+");                                         09426000
                     TOS_SEGX.(12:4);                                   09428000
                     IF = THEN DEL ELSE SENDOCT(*);                     09430000
                     SENDOCT(DISPLX);                                   09432000
                     OUTPUT;                                            09434000
                     CLEAR;                                             09436000
                     GOTO CONTW;                                        09438000
               END;                                                     09440000
          IF LOGICAL(MODE.(13:1)) THEN SENDOCT(SEG);                    09442000
          IF INDEX=REGEA THEN SENDOCT(BANK);                            09444000
  CONTW:  TOS_DISPL;                                                    09446000
          IF INDEX=REGA THEN GOTO CONTY;                                09448000
          IF INDEX=REGEA THEN                                           09450000
             BEGIN SEND("+");                                           09452000
                   GOTO CONTY;                                          09454000
             END;                                                       09456000
          IF INDEX = REGDB AND FLAGY THEN                               09458000
           BEGIN                                                        09460000
            SEND("+");                                                  09462000
            GOTO CONTY;                                                 09464000
           END;                                                         09466000
          IF LOGICAL(MODE) THEN TOS_TOS-REG(INDEX);                     09468000
          ASSEMBLE(TEST);                                               09470000
          IF >= THEN SEND("+") ELSE                                     09472000
               BEGIN SEND("-");                                         09474000
                     TOS_-TOS;                                          09476000
               END;                                                     09478000
  CONTY:  TOS_@POUT;                                                    09480000
          EXCHANGE;                                                     09482000
          SENDOCT(*);                                                   09484000
          @POUT_TOS+7;                                                  09486000
          I_-1;                                                         09488000
          WHILE (I_I+1)<K DO                                            09490000
               BEGIN IF CHMODE = CODE                          <<01549>>09492000
                     THEN SENDIT(TEMP(I),TEMP(MAX'INSTR'ROW+I),<<01549>>09494000
                                 CHMODE,TRUE)                  <<01549>>09496000
                     ELSE SENDIT(TEMP(I),0,CHMODE,TRUE);       <<01549>>09498000
                     IF CHMODE<>2 THEN SEND(" ");                       09500000
               END;                                                     09502000
          DISPL_DISPL+K;                                                09504000
          IF DUMPFLAG THEN OUTPUT ELSE                                  09506000
               BEGIN                                                    09508000
                     TOS_INOCTAL(K,@POUT);                              09510000
                     TOS.(14:1)_0;                                      09512000
                     IF <> THEN CNT_RCNT;                               09514000
                     IF TOS=0 THEN                                      09516000
                       BEGIN SETSEG(MODE,SEG,BANK);                     09518000
                             BASE(DISPL-1)_K;                           09520000
                             RESETSEG(MODE,SEG);                        09522000
                       END;                                             09524000
               END;                                                     09526000
          IF INDEX=REGV THEN                                            09528000
               BEGIN TOS_CNT;                                           09530000
                     TOS_TOS LAND %177;                                 09532000
                     DEL;                                               09534000
                     FLAGX_IF = THEN 1 ELSE 2;                          09536000
               END;                                                     09538000
          IF FLAGX THEN RELVIRT;                                        09540000
          IF INDEX<>REGV OR FLAGX THEN                                  09542000
               BEGIN RESETCRITICAL(CRIT);                               09544000
                     CRIT_SETCRITICAL;                                  09546000
               END;                                                     09548000
          IF CNT<RCNT THEN GOTO CONT;                                   09550000
          IF PRINTFLAG<>0 THEN LINE;                                    09552000
          GOTO NEXT;                                                    09554000
            << >>                                                       09556000
            << SWITCH LIST LOGICAL DEVICE >>                            09558000
            << >>                                                       09560000
  LISTL:                                                                09562000
          IF PINFO=ALPHA THEN GOTO LS1;                                 09564000
          FIELD(0);                                                     09566000
          TOS_X;                                                        09568000
          IF <> THEN                                                    09570000
             BEGIN IF NOT PRIV THEN GOTO ERROR;                         09572000
                   ASSEMBLE(DUP,ZERO; XCH);                             09574000
                   TOS_DEVTYPE(*);                                      09576000
                   I_TOS;                                               09578000
                   IF I<>16 AND I<>32 THEN GOTO NONO;                   09580000
             END;                                                       09582000
          IF INTEGER(DEVICE)<0 THEN FCLOSE(FNUM,0,0);                   09584000
          DEVICE_TOS;                                                   09586000
          GOTO NEXT;                                                    09588000
  LS1:    IF LOGICAL(SYS.(14:1)) THEN GOTO ERROR;                       09590000
          TOS_"LP";                                                     09592000
          TOS_0;                                                        09594000
          TOS_FOPEN(PINFO,%107,2,-128,B1);                              09596000
          IF <> THEN GOTO NONO;                                         09598000
          IF INTEGER(DEVICE)<0 THEN FCLOSE(FNUM,0,0);                   09600000
          FNUM_TOS;                                                     09602000
          DEVICE_-1;                                                    09604000
          GOTO NEXT;                                                    09606000
$PAGE "          BREAK/CLEAR COMMANDS"                         <<01007>>09608000
            << SET BREAKPOINT >>                                        09610000
            << >>                                                       09612000
  BREAKL:                                                               09614000
          I_1;                                                          09616000
          GOTO BC4;                                                     09618000
            << >>                                                       09620000
            << CLEAR BREAKPOINT >>                                      09622000
            << >>                                                       09624000
  CLEARL:                                                               09626000
          I_0;                                                          09628000
  BC4:    TOS_LOCATION(PIN'NUM,SEG,DISPL,COND'STAK);           <<01549>>09630000
          DUPLICATE;                                                    09632000
          IF TOS=6 THEN GOTO ERROR;   <<No allowable defaults>><<01007>>09634000
          IF SEG = ALL'SEGS THEN                               <<01549>>09636000
             BEGIN << @ >>                                     <<01549>>09638000
             << (FOR NOW) MUST BE ONLY COM. ON LINE >>         <<01549>>09640000
             IF TOS <> 2 THEN GOTO ERROR;                      <<01549>>09642000
             IF I = 0 THEN                                     <<01549>>09644000
                BEGIN                                          <<01549>>09646000
                RELBREAK (PIN'NUM,0,0,PLABEL);                 <<01549>>09648000
                GOTO NEXT;                                     <<01549>>09650000
                END                                            <<01549>>09652000
             ELSE GOTO BC5; << DISPLAY ALL BREAKPOINTS >>      <<01549>>09654000
             END;                                              <<01549>>09656000
          GOTO BC2;                                                     09658000
  BC1:    TOS_LOCATION(PIN'NUM,SEG,DISPL,COND'STAK);           <<01549>>09660000
  BC2:    ASSEMBLE(TBC 15);<<Test for location delimited by :>><<01007>>09662000
          IF <> THEN IF I=0 THEN GOTO ERROR;                            09664000
                         <<Not valid syntax for clear command>><<01007>>09666000
                    <<Check displ within bounds for this user>><<01007>>09668000
          TOS_TOS&LSR(1);                                               09670000
          ASSEMBLE(TBC 14);                                             09672000
                <<Test for null location field delimited by ,>><<01007>>09674000
          IF <> THEN GOTO BC3;              <<It was null, so>><<01007>>09676000
          TOS_PIN'NUM;                                         <<01549>>09678000
          TOS_SEG;                                                      09680000
          TOS_DISPL;                                                    09682000
          IF I=0 THEN RELBREAK(*,*,*,PLABEL)                   <<01549>>09684000
                 ELSE SETBREAK(*,*,*,COND'STAK,0);             <<01549>>09686000
  BC3:    IF LOGICAL(TOS) THEN GOTO NEXT;                               09688000
               <<If location not followed by a comma, go read>><<01007>>09690000
                                 <<next command from terminal>><<01007>>09692000
          GOTO BC1;               <<Handle next BP of command>><<01007>>09694000
                  <<----------------------------------------->><<01007>>09696000
                  << Print list of breakpoints on list device>><<01007>>09698000
                  <<----------------------------------------->><<01007>>09700000
  BC5:    PRINTFLAG_DEVICE;                                    <<01549>>09702000
          << GET SIR TO PREVENT ANYONE FROM UNLOCK SEG >>      <<01549>>09704000
          TEMP := GETSIR (BKPTSIR);                            <<01549>>09706000
          IF NOT BKPT'TAB'LOCKED THEN                          <<01549>>09708000
             BEGIN << NOTHING TO DISPLAY >>                    <<01549>>09710000
             RELSIR (BKPTSIR,TEMP);                            <<01549>>09712000
             GOTO NEXT;                                        <<01549>>09714000
             END;                                              <<01549>>09716000
          I := DSTI'(DEBUGDST*4).DST'LENFLD & LSL(2);          <<01549>>09718000
          I := GETDATASEG (I,I);                               <<01549>>09720000
          IF <> THEN                                           <<01549>>09722000
             BEGIN                                             <<01549>>09724000
             WARN := MSG'FULL;                                 <<01549>>09726000
             RELSIR (BKPTSIR,TEMP);                            <<01549>>09728000
             GOTO NEXT;                                        <<01549>>09730000
             END;                                              <<01549>>09732000
          << EXCHANGEDB TO I >>                                <<01549>>09734000
          SETSEG (%240,I,0);                                   <<01549>>09736000
          << COPY BKPT TABLE >>                                <<01549>>09738000
          PDISABLE;                                            <<01549>>09740000
          MOVEFROMDSEG (@BASE,DEBUGDST,0,                      <<01549>>09742000
                        DSTI'(DEBUGDST*4).DST'LENFLD & LSL(2));<<01549>>09744000
          RESETSEG (%240,I);  << BACK TO STAK >>               <<01549>>09746000
                                                               <<01549>>09748000
          IF PIN'NUM.(8:8) <> LOGICAL(RPCB) AND                <<01549>>09750000
             VALIDATE (PIN'NUM.(8:8)) <> 0                     <<01549>>09752000
          THEN                                                 <<01549>>09754000
             BEGIN                                             <<01549>>09756000
             TEMP(1) := INVALID'PIN; << FLAG ERROR >>          <<01549>>09758000
             K := 0; << MARK LIST EMPTY >>                     <<01549>>09760000
             END                                               <<01549>>09762000
          ELSE                                                 <<01549>>09764000
             BEGIN                                             <<01549>>09766000
             TEMP(1) := EVERYTHINGOK; << NO ERRORS >>          <<01549>>09768000
             << DETERMINE WHETHER LIST PROC OR SYS >>          <<01549>>09770000
             << BREAK POINTS                       >>          <<01549>>09772000
             IF PIN'NUM.SPECIFIED'PIN OR NOT SYSBRK THEN       <<01549>>09774000
                PIN'NUM := PIN'NUM.(8:8)                       <<01549>>09776000
             ELSE PIN'NUM := 0;                                <<01549>>09778000
             K := HEAD'BKPT'LIST (PIN'NUM,I);                  <<01549>>09780000
             END;                                              <<01549>>09782000
          PENABLE;                                             <<01549>>09784000
          RELSIR (BKPTSIR,TEMP);                               <<01549>>09786000
          WHILE K <> 0 DO                                      <<01549>>09788000
             BEGIN                                             <<01549>>09790000
             CLEAR;                                            <<01549>>09792000
             COPY'BKPT'ENTRY (K,I,INFO(IND'WORKAREA));         <<01549>>09794000
             FORMAT'BKPT (INFO(IND'WORKAREA));                 <<01549>>09796000
             OUTPUT;                                           <<01549>>09798000
             K := INFO(IND'WORKAREA+LINKOFFSET);               <<01549>>09800000
             END;                                              <<01549>>09802000
          RELDATASEG (I);                                      <<01549>>09804000
          RESETCRITICAL (CRIT);                                <<01549>>09806000
          CRIT := SETCRITICAL;                                 <<01549>>09808000
          IF TEMP(1) = INVALID'PIN THEN GOTO NONO'PIN          <<01549>>09810000
          ELSE GOTO NEXT;                                      <<01549>>09812000
$PAGE "          ACCEPT/TRACE/FREEZE/UNFREEZE COMMANDS"        <<01007>>09814000
            << >>                                                       09816000
            << ACCEPT BREAKPOINT MODE >>                                09818000
            << >>                                                       09820000
  ACCEPT:                                                               09822000
          IF (LOGICAL(PINFO) LAND %137) = "S" THEN             <<02344>>09824000
               BEGIN SYSBRK_TRUE;GOTO NEXT; END;                        09826000
          IF (LOGICAL(PINFO) LAND %137) = "P" THEN             <<02344>>09828000
               BEGIN SYSBRK_FALSE;GOTO NEXT; END;                       09830000
          GOTO ERROR;                                                   09832000
            << >>                                                       09834000
            << TRACE >>                                                 09836000
            << >>                                                       09838000
  TRACEL:                                                               09840000
          K_BASE(RDL-INTEGER(BASE(RDL-2))+3);                           09842000
          K_K-@MARK;                                                    09844000
          IF SYS=0 THEN K_K+2;                                          09846000
          PRINTFLAG_DEVICE;                                             09848000
          I_0;                                                          09850000
  TL:     CLEAR;                                                        09852000
          DISPL_STAK(I);                                                09854000
          IF DISPL<4 THEN GOTO NONO;                                    09856000
          I_I-DISPL;                                                    09858000
          IF I>=0 OR I<=K THEN GOTO TX;                                 09860000
          RTC_STAK(I-1).(8:8);                                          09862000
          RTP_STAK(X_X-1).(2:14);                                       09864000
          TOS_@POUT;                                                    09866000
          SEND("Q");                                                    09868000
          SEND("-");                                                    09870000
          SENDOCT(-I-INTEGER(STAK(0)));                                 09872000
          TOS_TOS+8;                                                    09874000
          @POUT_TOS;                                                    09876000
          FORMT;                                                        09878000
          OUTPUT;                                                       09880000
          RESETCRITICAL(CRIT);                                          09882000
          CRIT_SETCRITICAL;                                             09884000
          GOTO TL;                                                      09886000
  TX:     IF PRINTFLAG<>0 THEN LINE;                                    09888000
          GOTO NEXT;                                                    09890000
            << >>                                                       09892000
            << FREEZE SEGMENT >>                                        09894000
            << >>                                                       09896000
  FREEZL:                                                               09898000
          I_1;                                                          09900000
          GOTO FUL;                                                     09902000
            << >>                                                       09904000
            << UNFREEZE SEGMENT >>                                      09906000
            << >>                                                       09908000
  UNFRZL:                                                               09910000
          I_0;                                                          09912000
  FUL:    GETID(FALSE);                                                 09914000
          INDEX_X;                                                      09916000
          IF NOT (REGCO<=INDEX<=REGDA) THEN GOTO ERROR;                 09918000
          MODE_IF INDEX=REGDA THEN %300 ELSE %100;                      09920000
          FIELD(0);                                                     09922000
          SEG_X;                                                        09924000
          CHEKK(MODE,SEG,0,0,0);                                        09926000
          IF I=0 THEN RESETSEG(MODE,SEG)                                09928000
                 ELSE SETSEG(MODE,SEG,0);                               09930000
          GOTO NEXT;                                                    09932000
$PAGE "          CALCULATE/EXIT/RETURN COMMANDS"               <<01007>>09934000
            << >>                                                       09936000
            << CALCULATE >>                                             09938000
            << >>                                                       09940000
  CALCL:                                                                09942000
          FIELD(",");                                                   09944000
          I_X;                                                 <<01549>>09946000
          GETMODE;                                                      09948000
          CHMODE_X;                                            <<01549>>09950000
          CLEAR;                                                        09952000
          SEND(" ");                                                    09954000
          SEND("=");                                                    09956000
          SENDIT(I,BAD'2NDWORD,CHMODE,FALSE);                  <<01549>>09958000
          OUTPUT;                                                       09960000
          GOTO NEXT;                                                    09962000
            << >>                                                       09964000
            <<EXIT / TERMINATE>>                                        09966000
            << >>                                                       09968000
  EXITL:                                                                09970000
          IF PINFO="@" THEN                                             09972000
               BEGIN RESETCRITICAL(CRIT);                               09974000
                     TERMINATE;                                         09976000
               END;                                                     09978000
          FIELD(0);                                                     09980000
          IF X > MARK-4 THEN GOTO NONO;                                 09982000
          TOS_X;                                                        09984000
          IF < THEN GOTO NONO;                                          09986000
          IF INTEGER(DEVICE)<0 THEN FCLOSE(FNUM,0,0);          <<00.04>>09988000
          GOTO FXL;                                                     09990000
            << >>                                                       09992000
            << R E T U R N >>                                           09994000
            << >>                                                       09996000
  RETURNL:                                                              09998000
          TOS_LOCATION(PIN'NUM,SEG,DISPL,COND'STAK);           <<01549>>10000000
          ASSEMBLE(TBC 14);                                             10002000
          IF = THEN GOTO ERROR;                                         10004000
          IF TOS<>6 THEN                                                10006000
             BEGIN SETBREAK(PIN'NUM,SEG,DISPL,COND'STAK,0);    <<01549>>10008000
             END;                                                       10010000
          IF WARN THEN GOTO WARNING;                                    10012000
          IF INTEGER(DEVICE)<0 THEN FCLOSE(FNUM,0,0);                   10014000
          LINE;                                                         10016000
  FINI:   TOS _ 0;                                                      10018000
          IF EXIT'TO'TRAP THEN                                 <<01069>>10020000
             BEGIN                                             <<01069>>10022000
             COMMENT:                                          <<01069>>10024000
                EXIT TO USER TRAP PROCEDURE. BUILD STAK        <<01069>>10026000
                MARKER. ADD 4 WORDS TO STACK AND MOVE DEBUG'S  <<01069>>10028000
                VARIABLES UP 4 WORDS. SET Q TO Q+4 AND BUILD   <<01069>>10030000
                MARKER AT STAK(Q-3) TO STAK(Q);                <<01069>>10032000
             ASSEMBLE( ADDS 4);                                <<01069>>10034000
             << MOVE VARIABLES UP >>                           <<01069>>10036000
             MOVE AS0 := AS4, (-(@S4-@Q0)); << MOVE REVERSE >> <<01069>>10038000
             TOS := @Q0 + 4;                                   <<01069>>10040000
             SET(Q);                                           <<01069>>10042000
             STAK(-3) := 0;     << X REGISTER >>               <<01069>>10044000
             << GET PB RELATIVE PLOC >>                        <<01069>>10046000
             PLABEL.(0:1) := 1; << RESET EXT. LABEL BIT >>     <<01069>>10048000
I:=PLABEL.(8:8);                                               <<01549>>10050000
STAK(-2):=CONVEXTLABELTODELTAP(PLABEL);                        <<01549>>10052000
             << SET UP NEW STATUS REG, OLD STATUS = STAK(-5) >><<01832>>10054000
             TOS := I;         << CST NUMBER >>                <<01832>>10056000
             TOS.STATUS'I := 1;<< INTERRUPTS ENABLED >>        <<01832>>10058000
             TOS.STATUS'T := STAK(-5).STATUS'T; << TRAPS >>    <<01832>>10060000
             COMMENT:                                          <<01832>>10062000
                IF THE USER WAS EXECUTING IN PRIV MODE THEN    <<01832>>10064000
                HE CONTINUES TO EXECUTE IN PRIV MODE.;         <<01832>>10066000
                                                               <<01832>>10068000
             IF  STAK(-5).STATUS'M THEN TOS.STATUS'M := 1      <<01832>>10070000
             ELSE                                              <<01069>>10072000
                BEGIN  << GET PRIV MODE BIT FROM CST >>        <<01069>>10074000
                X := 0;                                        <<01069>>10076000
                IF  I > %300  THEN                             <<01069>>10078000
                   BEGIN                                       <<01069>>10080000
                   X := 1;     << IN EXTENDED CST >>           <<01069>>10082000
                   I := I-%300;                                <<01069>>10084000
                   END;                                        <<01069>>10086000
                DISABLE;                                       <<01069>>10088000
                TOS.STATUS'M := F(F(X)+I&LSL(2))&CSL(2);       <<01832>>10090000
                ENABLE;                                        <<01069>>10092000
                END;                                           <<01069>>10094000
             STAK(-1) := TOS; << STATUS REGISTER >>            <<01069>>10096000
             STAK(0) := 4;    << DELTA Q >>                    <<01069>>10098000
             END;                                              <<01069>>10100000
  FXL:    IF LOGICAL(RDX) THEN EXCHANGEDB(RDBX);                        10102000
          IF RDX>=2 THEN                                                10104000
               BEGIN SETSYSDB;                                          10106000
                     TOS_DRDBV;                                         10108000
                     SET(DB);                                           10110000
               END;                                                     10112000
          RESETCRITICAL(CRIT);                                          10114000
          TOS.(0:10) _ 99;    <<SPECIAL #>>                             10116000
          ERROREXIT(*,0,0);                                             10118000
            << >>                                                       10120000
$TITLE "          LOCAL VARIABLES, EQUATES, AND DEFINES"                10122000
    END;                                                                10124000
$TITLE "     PROGRAMMTIC SET/CLEAR BKPT. ROUTINES"             <<01549>>10126000
$CONTROL SEGMENT=DEBUG                                         <<01549>>10128000
                                                                        10130000
INTEGER PROCEDURE ABSOLUTESEG( TYPESEG,SEG,ERROR );            <<01069>>10132000
   VALUE TYPESEG,SEG;                                          <<01069>>10134000
   INTEGER TYPESEG,SEG,ERROR;                                  <<01069>>10136000
   OPTION PRIVILEGED, UNCALLABLE;                              <<01069>>10138000
BEGIN                                                          <<01069>>10140000
   COMMENT:                                                    <<01069>>10142000
      THIS PROCEDURE TRANSLATES SEG TO AN ABSOLUTE             <<01069>>10144000
      SEGMENT. IT IS ASSUMED THAT SEG IS A SEGMENT             <<01069>>10146000
      OF THE CALLING PROCESS.                                  <<01069>>10148000
         TYPESEG = 0 --> ABSOLUTE SEGMENT                      <<01069>>10150000
                   1 --> SSL                                   <<01069>>10152000
                   2 --> PSL                                   <<01069>>10154000
                   3 --> GSL                                   <<01069>>10156000
                   4 --> PROG SEG                              <<01069>>10158000
         SEG     = SEGMENT NUMBER                              <<01069>>10160000
         ERROR   = 0 --> NOERR                                 <<01069>>10162000
                   6 --> INVALID SEG                           <<01069>>10164000
      RETURNS THE ABSOLUTE SEGMENT NUMBER;                     <<01069>>10166000
                                                               <<01069>>10168000
   INTEGER                                                     <<01069>>10170000
      TEMP;                                                    <<01069>>10172000
                                                               <<01069>>10174000
   ERROR := 0;                                                 <<01069>>10176000
   IF TYPESEG = ABS'SEG THEN ABSOLUTESEG := SEG                <<01069>>10178000
   ELSE                                                        <<01069>>10180000
      BEGIN                                                    <<01069>>10182000
      TEMP := 0;                                               <<01069>>10184000
      TEMP.(0:3) := TYPESEG;                                   <<01069>>10186000
      TEMP.(8:8) := SEG.(8:8);                                 <<01069>>10188000
      TEMP := PHYSICALCST( PIN,TEMP );                         <<01069>>10190000
      IF = THEN ABSOLUTESEG := TEMP.(8:8)                               10192000
      ELSE IF > THEN ERROR := INVALID'SEG                      <<01069>>10194000
      ELSE IF < THEN                                           <<01069>>10196000
         BEGIN << INVALID PIN >>                               <<01069>>10198000
         IF PCBI'(PIX+9).PTYPE >= 2 THEN                       <<01069>>10200000
            BEGIN << SYS PROC--NOT IN LST         >>           <<01069>>10202000
                  << MUST SPECIFY SSL OR PROG SEG >>           <<01069>>10204000
            IF TYPESEG = SSL'SEG THEN                          <<01069>>10206000
               BEGIN                                           <<01069>>10208000
               ABSOLUTESEG := PHYSICALCST( 0,TEMP );           <<01069>>10210000
               IF <> THEN ERROR := INVALID'SEG;                <<01069>>10212000
               END                                             <<01069>>10214000
            ELSE IF TYPESEG = PROG'SEG AND                     <<01069>>10216000
                    SEG.(8:8) <= MAX'NUMPROGSEG                <<01069>>10218000
               THEN ABSOLUTESEG := SEG + %301                  <<01069>>10220000
            ELSE ERROR := INVALID'SEG;                         <<01069>>10222000
            END;                                               <<01069>>10224000
          END;                                                 <<01069>>10226000
      END;                                                     <<01069>>10228000
END;  << ABSOLUTESEG >>                                        <<01069>>10230000
                                                               <<01549>>10232000
PROCEDURE SET'DB'DSEG( DB'STATE,XDS,ORIG'DB,DSTNUM );          <<01549>>10234000
   VALUE DB'STATE,XDS,ORIG'DB,DSTNUM;                          <<01549>>10236000
   INTEGER DB'STATE,XDS,DSTNUM;                                <<01549>>10238000
   DOUBLE ORIG'DB;                                             <<01549>>10240000
   OPTION PRIVILEGED, UNCALLABLE;                              <<01549>>10242000
BEGIN                                                          <<01549>>10244000
   COMMENT:                                                    <<01549>>10246000
      THIS PROCEDURE SETS DB TO THE XTRA DATA SEG. 'DSTNUM'    <<01549>>10248000
      AND RETURNS DB'S ORGINAL STATE.                          <<01549>>10250000
                                                               <<01549>>10252000
      RETURNS: (ON TOS)                                        <<01549>>10254000
         DB'STATE = 0 ==> DB ORIG. AT STAK                     <<01549>>10256000
         S3         1 ==> DB AT XDS                            <<01549>>10258000
                    2 ==> DB AT ABSDB -- NO XDS                <<01549>>10260000
                    3 ==> DB AT ABSDB -- XDS                   <<01549>>10262000
         XDS      = XDS NUMBER IF DB'STATE = 1,3               <<01549>>10264000
         S2                                                    <<01549>>10266000
         ORIG'DB  = ORIGINAL DB IF ABSDB                       <<01549>>10268000
         S1/S0                                                 <<01549>>10270000
         ;                                                     <<01549>>10272000
   EQUATE NUMPARM = 1; << DELETE DSTNUM >>                     <<01549>>10274000
                                                               <<01549>>10276000
   DB'STATE := 0; <<SET STATE TO DB ORIG AT STACK >>           <<01549>>10278000
   XDS := PCBI'(PIX+2);                                        <<01549>>10280000
   << CHECK FOR ABSOLUTE DB >>                                 <<01549>>10282000
   IF XDS.ABSDB = 1 THEN                                       <<01549>>10284000
      BEGIN                                                    <<01549>>10286000
      PUSH(DB);                                                <<01549>>10288000
      ORIG'DB := TOS;                                          <<01549>>10290000
      DB'STATE := 2; << ABS DB ON ENTRY >>                     <<01549>>10292000
      RESETDB(-1);  << RESETS DB TO XDS OR STACK >>            <<01549>>10294000
      END;                                                     <<01549>>10296000
                                                               <<01549>>10298000
   << CHECK FOR EXCHANGE TO XTRA DATA SEGMENT >>               <<01549>>10300000
   IF (XDS := XDS.(1:10)) <> 0 THEN                            <<01549>>10302000
      BEGIN                                                    <<01549>>10304000
      DB'STATE := DB'STATE + 1;                                <<01549>>10306000
      END;                                                     <<01549>>10308000
   EXCHANGEDB (DSTNUM);                                        <<01549>>10310000
   RETURN NUMPARM;                                             <<01549>>10312000
END; << SET'DB'STAK >>                                         <<01549>>10314000
                                                               <<01069>>10316000
PROCEDURE SET'DB( DB'STATE,XDS,DB'REG );                       <<01069>>10318000
   VALUE DB'STATE,XDS,DB'REG;                                  <<01069>>10320000
   INTEGER DB'STATE,XDS;                                       <<01069>>10322000
   DOUBLE DB'REG;                                              <<01069>>10324000
   OPTION PRIVILEGED, UNCALLABLE;                              <<01069>>10326000
BEGIN                                                          <<01069>>10328000
   COMMENT:                                                    <<01069>>10330000
      THIS PROCEDURE SETS DB TO THE REQUESTED                  <<01069>>10332000
      STATE. IT ASSUMES THAT UPON ENTRY DB IS                  <<01069>>10334000
      POINTING TO THE STAK.                                    <<01069>>10336000
                                                               <<01069>>10338000
         DB'STATE = 0 ==> SET DB TO STAK                       <<01069>>10340000
                    1 ==> DB TO EXTRA DS                       <<01069>>10342000
                    2 ==> DB TO ABSDB -- NO XDS                <<01069>>10344000
                    3 ==> DB AT ABSDB -- XDS                   <<01069>>10346000
         XDS      = XDS NUMBER IS DB'STATE = 1,3               <<01069>>10348000
         DB'REG   = DB IF ABSDB IS REQUESTED;                  <<01069>>10350000
                                                               <<01069>>10352000
   IF DB'STATE = 1 OR DB'STATE = 3 THEN EXCHANGEDB( XDS );     <<01069>>10354000
   IF DB'STATE >= 2 THEN                                       <<01069>>10356000
      BEGIN                                                    <<01069>>10358000
      SETSYSDB;                                                <<01069>>10360000
      TOS := DB'REG;                                           <<01069>>10362000
      SET(DB);                                                 <<01069>>10364000
      END;                                                     <<01069>>10366000
                                                               <<01069>>10368000
END;  << SET'DB >>                                             <<01069>>10370000
                                                               <<01069>>10372000
LOGICAL PROCEDURE PRIVBREAKPNT;                                <<01069>>10374000
   OPTION PRIVILEGED, UNCALLABLE;                              <<01069>>10376000
BEGIN                                                          <<01069>>10378000
   COMMENT:                                                    <<01069>>10380000
      THIS PROCEDURE DETERMINES WHETHER BREAKPOINTS SET        <<01069>>10382000
      BY THIS PROCESS ARE PRIVILEGED, IF SO THEN RETURN        <<01069>>10384000
      TRUE.  THE BREAK POINTS WILL BE PRIVILEGED IF WE         <<01069>>10386000
      ARE IN A SYSTEM PROCESS OR IF ARE CALLED BY A PRIV       <<01069>>10388000
      USER;                                                    <<01069>>10390000
                                                               <<01069>>10392000
   INTEGER                                                     <<01069>>10394000
      I;                                                       <<01069>>10396000
   LOGICAL                                                     <<01069>>10398000
      PRIV;                                                    <<01069>>10400000
                                                               <<01069>>10402000
   SUBROUTINE DEF'MOVEFROMDSEG;                                <<01069>>10404000
                                                               <<01069>>10406000
   IF PCBI'(PIX+9).PTYPE >= 2 THEN PRIVBREAKPNT := TRUE        <<01069>>10408000
   ELSE                                                        <<01069>>10410000
      BEGIN << USER PROCESS >>                                 <<01069>>10412000
      GETJITINDEX;                                             <<01069>>10414000
      I := TOS; << JIT INDEX >>                                <<01069>>10416000
      MOVEFROMDSEG(@PRIV,I,JIT'UCAP2,1);                       <<01069>>10418000
      PRIVBREAKPNT := PRIV.UCAP'PM                             <<01069>>10420000
      END;                                                     <<01069>>10422000
END;  << PRIVBREAKPNT >>                                       <<01069>>10424000
                                                               <<01069>>10426000
PROCEDURE VALIDATE'BREAKPNT( ERROR,SEG,PLOC,TYPESEG,           <<01069>>10428000
                             BREAKPNT'TYPE,CNT,FLAGS );        <<01069>>10430000
   VALUE SEG,PLOC,TYPESEG,BREAKPNT'TYPE,CNT,FLAGS;             <<01069>>10432000
   INTEGER ERROR,SEG,PLOC,TYPESEG,CNT;                         <<01069>>10434000
   LOGICAL BREAKPNT'TYPE,FLAGS;                                <<01069>>10436000
   OPTION VARIABLE, PRIVILEGED, UNCALLABLE;                    <<01069>>10438000
BEGIN                                                          <<01069>>10440000
   COMMENT:                                                    <<01069>>10442000
      THIS PROCEDURE VALIDATES THE LOCATION AND                <<01069>>10444000
      TYPE OF BREAK POINT THAT IS TO BE SET.                   <<01069>>10446000
      ERROR IS SET TO 0 IF EVERYTHING IS OK, ELSE ERROR        <<01069>>10448000
      CONTAINS THE ERROR NUMBER AS DEFINED IN                  <<01069>>10450000
      SET'BREAKPOINT & CLEAR'BREAKPOINT;                       <<01069>>10452000
                                                               <<01069>>10454000
   DEFINE                                                      <<01069>>10456000
      CNT'PASSED           = PARMMASK.(14:1)#,                 <<01069>>10458000
      BREAKPNT'TYPE'PASSED = PARMMASK.(13:1)#,                 <<01069>>10460000
      TYPESEG'PASSED       = PARMMASK.(12:1)#,                 <<01069>>10462000
      PLOC'PASSED          = PARMMASK.(11:1)#,                 <<01069>>10464000
      SEG'PASSED           = PARMMASK.(10:1)#,                 <<01069>>10466000
      PRIV                 = FLAGS.(15:1)#,                    <<01069>>10468000
      ABS'SEG'OK           = FLAGS.(14:1)#;                    <<01069>>10470000
                                                               <<01069>>10472000
   ERROR := 0;                                                 <<01069>>10474000
                                                               <<01069>>10476000
   << VALIDATE TYPESEG >>                                      <<01069>>10478000
   IF TYPESEG'PASSED THEN                                      <<01069>>10480000
      BEGIN                                                    <<01069>>10482000
      IF NOT ( ABS'SEG <= TYPESEG <= PROG'SEG ) OR             <<01069>>10484000
         TYPESEG = SSL'SEG AND NOT PRIV OR                     <<01069>>10486000
         TYPESEG = ABS'SEG AND NOT PRIV AND NOT ABS'SEG'OK     <<01069>>10488000
      THEN                                                     <<01069>>10490000
         BEGIN                                                 <<01069>>10492000
         ERROR := INVALID'TYPESEG;                             <<01069>>10494000
         RETURN;                                               <<01069>>10496000
         END;                                                  <<01069>>10498000
       END;                                                    <<01069>>10500000
                                                               <<01069>>10502000
   << VALIDATE SEG >>                                          <<01069>>10504000
   IF SEG'PASSED THEN                                          <<01069>>10506000
      BEGIN                                                    <<01069>>10508000
      IF TYPESEG = PROG'SEG AND SEG > %76 OR                   <<01549>>10510000
         TYPESEG <> PROG'SEG AND SEG > %377                    <<01549>>10512000
      THEN                                                     <<01549>>10514000
         BEGIN                                                 <<01069>>10516000
         ERROR := INVALID'SEG;                                 <<01069>>10518000
         RETURN;                                               <<01069>>10520000
         END;                                                  <<01069>>10522000
      IF TYPESEG <> ABS'SEG THEN                               <<01069>>10524000
         BEGIN                                                 <<01069>>10526000
         << TRANSLATE SEG TO ABSOLUTE SEG NUMBER >>            <<01069>>10528000
         SEG := ABSOLUTESEG( TYPESEG,SEG,ERROR );              <<01069>>10530000
         IF ERROR <> 0 THEN                                    <<01069>>10532000
            BEGIN                                              <<01069>>10534000
            ERROR := INVALID'SEG;                              <<01069>>10536000
            RETURN;                                            <<01069>>10538000
            END;                                               <<01069>>10540000
          END;                                                 <<01069>>10542000
      IF VALIDATE(,SEG) <> 0 THEN                              <<01069>>10544000
         BEGIN                                                 <<01069>>10546000
         ERROR := INVALID'SEG;                                 <<01069>>10548000
         RETURN;                                               <<01069>>10550000
         END;                                                  <<01069>>10552000
      END;                                                     <<01069>>10554000
                                                               <<01069>>10556000
   IF PLOC'PASSED AND PLOC < 0 THEN                            <<01069>>10558000
      BEGIN                                                    <<01069>>10560000
      ERROR := INVALID'PLOC;                                   <<01069>>10562000
      RETURN;                                                  <<01069>>10564000
      END;                                                     <<01069>>10566000
                                                               <<01069>>10568000
   IF BREAKPNT'TYPE'PASSED THEN                                <<01069>>10570000
      BEGIN                                                    <<01069>>10572000
      IF BREAKPNT'TYPE.SYSBRKPNT=1 AND NOT PRIV THEN           <<01069>>10574000
         BEGIN                                                 <<01069>>10576000
         ERROR := INVALID'CAP;                                 <<01069>>10578000
         RETURN;                                               <<01069>>10580000
         END                                                   <<01069>>10582000
      ELSE IF BREAKPNT'TYPE.SYSBRKPNT > 1 THEN                 <<01069>>10584000
         BEGIN                                                 <<01069>>10586000
         ERROR := INVALID'BRKTYPE;                             <<01069>>10588000
         RETURN;                                               <<01069>>10590000
         END;                                                  <<01069>>10592000
      END;                                                     <<01069>>10594000
                                                               <<01069>>10596000
   IF CNT'PASSED THEN                                          <<01069>>10598000
      BEGIN                                                    <<01069>>10600000
      IF CNT <= 0 THEN                                         <<01069>>10602000
         BEGIN                                                 <<01069>>10604000
         ERROR := INVALID'CNT;                                 <<01069>>10606000
         RETURN;                                               <<01069>>10608000
         END;                                                  <<01069>>10610000
      END;                                                     <<01069>>10612000
                                                               <<01069>>10614000
END;  << VALIDATE'BREAKPNT >>                                  <<01069>>10616000
                                                               <<01069>>10618000
                                                               <<01069>>10620000
PROCEDURE SET'BREAKPNT( ERROR,SEG,PLOC,TYPESEG,BREAKPNT'TYPE,  <<01069>>10622000
                        CNT,BREAKPNT'COND,PLABEL );            <<01069>>10624000
                                                               <<01069>>10626000
   VALUE SEG,PLOC,TYPESEG,BREAKPNT'TYPE,CNT,PLABEL;            <<01069>>10628000
   INTEGER ERROR,SEG,PLOC,TYPESEG,CNT,PLABEL;                  <<01069>>10630000
   LOGICAL BREAKPNT'TYPE;                                      <<01069>>10632000
   LOGICAL ARRAY BREAKPNT'COND;                                <<01069>>10634000
   OPTION VARIABLE, PRIVILEGED;                                <<01069>>10636000
BEGIN                                                          <<01069>>10638000
   COMMENT:                                                    <<01069>>10640000
      This procedure permits the programmatic setting of break <<01069>>10642000
      points within the calling process.  When the break point <<01069>>10644000
      is encountered control is transfered to a user defined   <<01069>>10646000
      trap procedure.  The procedure is defined as follows:    <<01069>>10648000
                                                               <<01069>>10650000
      seg           Integer by value - optional.               <<01069>>10652000
                    The segment in which the break point is to <<01069>>10654000
                    be set.  Default: the segment from which   <<01069>>10656000
                    the procedure is invoked.                  <<01069>>10658000
                                                               <<01069>>10660000
      ploc          Integer by value - required.               <<01069>>10662000
                    The PB relative location of the break point<<01069>>10664000
                                                               <<01069>>10666000
      segtype       Integer by value - optional                <<01069>>10668000
                    The segment type of the segment number.    <<01069>>10670000
                                                               <<01069>>10672000
                    0 --> absolute segment number  (*)         <<01069>>10674000
                    1 --> SSL segment number (*)               <<01069>>10676000
                    2 --> PSL segment number                   <<01069>>10678000
                    3 --> GSL segment number                   <<01069>>10680000
                    4 --> Program segment (default)            <<01069>>10682000
                                                               <<01069>>10684000
      breakpnt'type Logical by value - optional.               <<01069>>10686000
                    This word describes the type of break point<<01069>>10688000
                                                               <<01069>>10690000
                    (13:3) = 0   process local break point     <<01069>>10692000
                                 (default).                    <<01069>>10694000
                           = 1   system break point (*)        <<01069>>10696000
                             2/7 currently undefined           <<01069>>10698000
                    (12:1) = 0   non-permanent break point     <<01069>>10700000
                                 (default)                     <<01069>>10702000
                           = 1   permanent                     <<01069>>10704000
                    (0:11)       ignored                       <<01069>>10706000
                                                               <<01069>>10708000
      frequency     Integer by value - optional.               <<01069>>10710000
                    The frequency of the break point (i.e. the <<01069>>10712000
                    break point is to be recognized the nth    <<01069>>10714000
                    time the instruction is executed)          <<01069>>10716000
                                                               <<01069>>10718000
      break'cond    Logical array - optional.                  <<01069>>10720000
                    Currently unused.  In the future it may be <<01069>>10722000
                    used to pass qualifying information such   <<01069>>10724000
                    as break when DB+7=3.                      <<01069>>10726000
                                                               <<01069>>10728000
      plabel        Integer by value - optional.               <<01069>>10730000
                    The external label of the user's trap      <<01069>>10732000
                    procedure.                                 <<01069>>10734000
                    Default: DEBUG wil be invoked when the trap<<01069>>10736000
                    is encountered.                            <<01069>>10738000
                                                               <<01069>>10740000
      error         Integer by reference - required            <<01069>>10742000
                    0 --> no error                             <<01069>>10744000
                    1 --> invalid ploc                         <<01069>>10746000
                    2 --> break point table full               <<01069>>10748000
                    3 --> process/system conflict              <<01069>>10750000
                    4 --> location conflict (process/process   <<01069>>10752000
                          or system/system)                    <<01069>>10754000
                    5 --> reserved for future use              <<01069>>10756000
                    6 --> invalid segment                      <<01069>>10758000
                    7 --> invalid segment type                 <<01069>>10760000
                    8 --> invalid frequency                    <<01069>>10762000
                    9 --> insufficient capability              <<01069>>10764000
                   10 --> invalid plabel                       <<01069>>10766000
                   11 --> invalid break point type             <<01069>>10768000
                                                               <<01069>>10770000
      (*)          privileged users or system processes only   <<01069>>10772000
                                                               <<01069>>10774000
      condition code returned:                                 <<01069>>10776000
                   cce:  successful completion of procedure    <<01069>>10778000
                   ccl:  unsuccessful ( error > 0 )            <<01069>>10780000
                   ccg:  not currently returned;               <<01069>>10782000
                                                               <<01069>>10784000
                                                               <<01069>>10786000
                                                               <<01069>>10788000
   DEFINE                                                      <<01069>>10790000
      PLABEL'PASSED        = PARMMASK.(15:1) #,                <<01069>>10792000
      BREAKPNT'COND'PASSED = PARMMASK.(14:1) #,                <<01069>>10794000
      CNT'PASSED           = PARMMASK.(13:1) #,                <<01069>>10796000
      BREAKPNT'TYPE'PASSED = PARMMASK.(12:1) #,                <<01069>>10798000
      TYPESEG'PASSED       = PARMMASK.(11:1) #,                <<01069>>10800000
      PLOC'PASSED          = PARMMASK.(10:1) #,                <<01069>>10802000
      SEG'PASSED           = PARMMASK.( 9:1) #,                <<01069>>10804000
      PRIV                 = FLAGS.(15:1)#,                    <<01069>>10806000
      ABS'SEG'OK           = FLAGS.(14:1)#;                    <<01069>>10808000
   EQUATE                                                      <<01069>>10810000
      DEBUGTRAP            = 19,  << TYPE TRAP LABEL >>        <<01069>>10812000
      NUMPARM              = 9,   << NUM OF PARM WORDS >>      <<01069>>10814000
      INTRIN'NUM           = 97,                               <<01069>>10816000
      NUM'ACTUALPARM       = 8,   << NUM OF PARMS IN CALL >>   <<01069>>10818000
      << CHEK ADD. OF ERROR,COND >>                            <<01069>>10820000
      PARMCHEK             = [2/0,2/2,10/0,2/2],               <<01069>>10822000
      OPTVMASK             = %137;<< ERROR,PLOC REQUIRED >>    <<01069>>10824000
   INTEGER ARRAY                                               <<01549>>10826000
      COND(0:ENTRYSIZE'CNT);                                   <<01549>>10828000
   INTEGER                                                     <<01069>>10830000
      DB'STATE,     << ORIG LOC OF DB ON ENTRY >>              <<01069>>10832000
      XDS,          << ORIG EXTRA DS NUM       >>              <<01069>>10834000
      PROC,                                                    <<01069>>10836000
      I,                                                       <<01069>>10838000
      CRITICAL,                                                <<01069>>10840000
      INTRINFLAG := [10/INTRIN'NUM,6/NUMPARM];                 <<01069>>10842000
   DOUBLE                                                      <<01069>>10844000
      ORIG'DB;      << ORIG DB REGISTER        >>              <<01069>>10846000
   LOGICAL                                                     <<01069>>10848000
      FLAGS := 0;   << USED FOR VALIDATION     >>              <<01069>>10850000
                                                               <<01069>>10852000
   SUBROUTINE PROC'EXIT( EXITSTATE );                          <<01069>>10854000
      VALUE EXITSTATE;                                         <<01069>>10856000
      INTEGER EXITSTATE;                                       <<01069>>10858000
   BEGIN                                                       <<01069>>10860000
      COMMENT: THIS SUBROUTINE DOES ANY NECESSARY              <<01069>>10862000
         CLEANUP AND EXITS PROCEDURE;                          <<01069>>10864000
      ERROR := EXITSTATE;                                      <<01069>>10866000
      IF ERROR = EVERYTHINGOK THEN STATUS.CCFLD := CCE         <<01069>>10868000
      ELSE STATUS.CCFLD := CCL;                                <<01069>>10870000
      ERROREXIT( INTRINFLAG,0,0 );                             <<01069>>10872000
      ASSEMBLE ( EXIT NUMPARM );                               <<01069>>10874000
   END;                                                        <<01069>>10876000
                                                               <<01069>>10878000
   LOGICAL SUBROUTINE SYSTEM( CSTNUM );                        <<01069>>10880000
      VALUE CSTNUM;                                            <<01069>>10882000
      INTEGER CSTNUM;                                          <<01069>>10884000
   BEGIN                                                       <<01069>>10886000
      COMMENT: THIS SUBROUTINE CHECKS WHETHER THE              <<01069>>10888000
         SPECIFIED SEGMENT IS A SYSTEM SEGMENT;                <<01069>>10890000
      IF CSTNUM < %300 AND                                     <<01069>>10892000
         LOGICAL(CSTI'(CSTNUM&LSL(2)+2)).SYSTEMFLAG            <<01549>>10894000
      THEN SYSTEM := TRUE                                      <<01069>>10896000
      ELSE SYSTEM := FALSE;                                    <<01069>>10898000
   END;                                                        <<01069>>10900000
                                                               <<01069>>10902000
                                                               <<01069>>10904000
   ERRORON;                                                    <<01069>>10906000
   CHEK( INTRINFLAG,NUM'ACTUALPARM,DOUBLE(PARMCHEK),           <<01069>>10908000
         <<CAP>>,OPTVMASK );                                   <<01069>>10910000
                                                               <<01069>>10912000
   COMMENT:                                                    <<01069>>10914000
      IF WE WERE CALLED BY A SYSTEM PROCESS OR                 <<01069>>10916000
      A PRIVILEGED USER THAN ANY BREAKPOINTS WHICH ARE         <<01069>>10918000
      SET ARE PRIVILEGED BREAK POINTS.;                        <<01069>>10920000
   PRIV := PRIVBREAKPNT;                                       <<01069>>10922000
                                                               <<01069>>10924000
   << *** VALIDATE PARAMETERS *** >>                           <<01069>>10926000
                                                               <<01069>>10928000
   << SET UP DEFAULT VALUES >>                                 <<01069>>10930000
                                                               <<01069>>10932000
   IF NOT SEG'PASSED THEN                                      <<01069>>10934000
      BEGIN                                                    <<01069>>10936000
      SEG := STATUS.(8:8);                                     <<01069>>10938000
      TYPESEG := ABS'SEG; << IGNORE PASSED TYPESEG >>          <<01069>>10940000
      ABS'SEG'OK := TRUE;                                      <<01069>>10942000
      END                                                      <<01069>>10944000
   ELSE IF NOT TYPESEG'PASSED THEN TYPESEG := PROG'SEG;        <<01069>>10946000
                                                               <<01069>>10948000
   IF NOT BREAKPNT'TYPE'PASSED THEN BREAKPNT'TYPE := 0;        <<01069>>10950000
   IF NOT CNT'PASSED THEN CNT := 1;                            <<01069>>10952000
                                                               <<01069>>10954000
   VALIDATE'BREAKPNT( ERROR,SEG,PLOC,TYPESEG,                  <<01069>>10956000
                      BREAKPNT'TYPE,CNT,FLAGS );               <<01069>>10958000
   IF ERROR <> 0 THEN PROC'EXIT( ERROR );<< ERROR RETURN >>    <<01069>>10960000
   COMMENT:                                                    <<01549>>10962000
      VALIDATE'BREAKPNT HAS ALREADY DONE CHECKING -->          <<01069>>10964000
      NO ERROR CHECK NEEDED AFTER CALL TO ABSOLUTESEG;         <<01069>>10966000
   SEG := ABSOLUTESEG ( TYPESEG,SEG,ERROR );                   <<01069>>10968000
                                                               <<01069>>10970000
                                                               <<01069>>10972000
   IF PLABEL'PASSED AND PLABEL<>@DEBUG THEN                    <<01069>>10974000
      BEGIN                                                    <<01069>>10976000
      IF TRAPLABEL( DEBUGTRAP,I,PLABEL,I,PLABEL ) <> CCE       <<01069>>10978000
         THEN PROC'EXIT( INVALID'PLABEL );                     <<01069>>10980000
      << CANNOT TRAP IN SYSTEM SEG UNLESS TRAP IS SYS SEG >>   <<01069>>10982000
      IF SYSTEM(SEG) AND NOT SYSTEM(PLABEL.(8:8)) THEN         <<01069>>10984000
         PROC'EXIT( INVALID'PLABEL );                          <<01069>>10986000
      END;                                                     <<01069>>10988000
                                                               <<01069>>10990000
   << SET UP CALL TO ENTERSTOP >>                              <<01069>>10992000
                                                               <<01069>>10994000
   PROC := IF BREAKPNT'TYPE.SYSBRKPNT=1 THEN 0 ELSE PIN;       <<01069>>10996000
   PROC.LOCBIT := IF BREAKPNT'TYPE.SYSBRKPNT=1 THEN 0          <<01549>>10998000
                  ELSE 1;                                      <<01549>>11000000
   PROC.PRIVBIT := PRIV;                                       <<01069>>11002000
   PROC.DBLTRAP := IF CNT > 1 OR                               <<01069>>11004000
                      BREAKPNT'TYPE.PERMBRKPNT THEN 1          <<01069>>11006000
                    ELSE 0;                                    <<01069>>11008000
   PROC.PERMBIT := BREAKPNT'TYPE.PERMBRKPNT;                   <<01069>>11010000
   PROC.LABELBIT := IF PLABEL'PASSED AND PLABEL<>@DEBUG THEN 1 <<01069>>11012000
                    ELSE 0;                                    <<01069>>11014000
   << SET UP COND FOR ENTER STOP >>                            <<01549>>11016000
   IF CNT = 1 THEN COND(0) := 0  << NO CONDITION >>            <<01549>>11018000
   ELSE                                                        <<01549>>11020000
      BEGIN                                                    <<01549>>11022000
      COND(0) := ENTRYSIZE'CNT;                                <<01549>>11024000
      COND(1) := CNT;                                          <<01549>>11026000
      COND(2) := 0;   << NUMBER OF HITS >>                     <<01549>>11028000
      COND(3) := T'NUMBER;                                     <<01549>>11030000
      END;                                                     <<01549>>11032000
   CRITICAL := SETCRITICAL;                                    <<01069>>11034000
   ERROR := ENTERSTOP( PROC,SEG,PLOC,COND,PLABEL );            <<01549>>11036000
   RESETCRITICAL( CRITICAL );                                  <<01069>>11038000
                                                               <<01069>>11040000
   << CLEANUP AND RETURN >>                                    <<01069>>11042000
   PROC'EXIT( ERROR );                                         <<01069>>11044000
END; << SET'BREAKPOINT >>                                      <<01069>>11046000
                                                               <<01069>>11048000
PROCEDURE CLEAR'BREAKPNT( ERROR,SEG,PLOC,TYPESEG,              <<01069>>11050000
                          BREAKPNT'TYPE,PLABEL );              <<01069>>11052000
   VALUE SEG,PLOC,TYPESEG,BREAKPNT'TYPE,PLABEL;                <<01069>>11054000
   INTEGER ERROR,SEG,PLOC,TYPESEG,PLABEL;                      <<01069>>11056000
   LOGICAL BREAKPNT'TYPE;                                      <<01069>>11058000
   OPTION VARIABLE, PRIVILEGED;                                <<01069>>11060000
                                                               <<01069>>11062000
BEGIN                                                          <<01069>>11064000
   COMMENT:                                                    <<01069>>11066000
      This procedure permits the programmatic clearing         <<01069>>11068000
      of break points within the calling process. The          <<01069>>11070000
      procedure is defined as follows:                         <<01069>>11072000
                                                               <<01069>>11074000
      seg           Integer by value - optional                <<01069>>11076000
                    =-1  --> clear all break points            <<01069>>11078000
                             in specified domain (proc/sys)    <<01069>>11080000
                    >0   --> segment number                    <<01069>>11082000
                             default: currently executing seg. <<01069>>11084000
                                                               <<01069>>11086000
      ploc          Integer by value - required if seg <> -1.  <<01069>>11088000
                    =-1  --> clear all break points            <<01069>>11090000
                             in the specified segment.         <<01069>>11092000
                    >=0  --> PB relative location of break     <<01069>>11094000
                             point                             <<01069>>11096000
                                                               <<01069>>11098000
//                                                                     11100000
      segtype       Integer by value - optional                <<01069>>11102000
                    The segment type of the segment number.    <<01069>>11104000
                                                               <<01069>>11106000
                    0 --> absolute segment number (*)          <<01069>>11108000
                    1 --> SSL segment number (*)               <<01069>>11110000
                    2 --> PSL segment number                   <<01069>>11112000
                    3 --> GSL segment number                   <<01069>>11114000
                    4 --> Program segment (default)            <<01069>>11116000
                                                               <<01069>>11118000
      breakpnt'type Logical by value - optional.               <<01069>>11120000
                    This word describes the type of break point<<01069>>11122000
                                                               <<01069>>11124000
                    (13:3) = 0   process local break point     <<01069>>11126000
                                 (default)                     <<01069>>11128000
                           = 1   system break point (*)        <<01069>>11130000
                           = 2/7 currently undefined           <<01069>>11132000
                    (0:12)   ignored                           <<01069>>11134000
                                                               <<01069>>11136000
      plabel        Integer by value - optional.               <<01069>>11138000
                    Specifies which traps are to be            <<01069>>11140000
                    removed -- user/debug.                     <<01069>>11142000
                                                               <<01069>>11144000
                    0 -->   remove all traps in specified      <<01069>>11146000
                            range (default)                    <<01069>>11148000
                    1 -->   remove only user traps within the  <<01069>>11150000
                            specified range                    <<01069>>11152000
                    2 -->   remove only DEBUG break points     <<01069>>11154000
                            within the specified range         <<01069>>11156000
                    @label  within the specified range,        <<01069>>11158000
                            remove break points whose trap     <<01069>>11160000
                            routine is defined by this         <<01069>>11162000
                            external plabel.                   <<01069>>11164000
                                                               <<01069>>11166000
      error         Integer by reference - required            <<01069>>11168000
                    Errors defined as in SET'BREAKPOINT        <<01069>>11170000
                    (errors 2/4 not returned by this procedure)<<01069>>11172000
                                                               <<01069>>11174000
      (*)           privileged users or system processes only  <<01069>>11176000
                                                               <<01069>>11178000
                                                               <<01069>>11180000
      condition code returned:                                 <<01069>>11182000
                    cce:  successful completion of procedure   <<01069>>11184000
                    ccl:  unsuccessful ( error > 0 )           <<01069>>11186000
                    ccg:  currently not returned;              <<01069>>11188000
                                                               <<01069>>11190000
                                                               <<01069>>11192000
   DEFINE                                                      <<01069>>11194000
      PLABEL'PASSED        = PARMMASK.(15:1) #,                <<01069>>11196000
      BREAKPNT'TYPE'PASSED = PARMMASK.(14:1) #,                <<01069>>11198000
      TYPESEG'PASSED       = PARMMASK.(13:1) #,                <<01069>>11200000
      PLOC'PASSED          = PARMMASK.(12:1) #,                <<01069>>11202000
      SEG'PASSED           = PARMMASK.(11:1) #,                <<01069>>11204000
      PRIV                 = FLAGS.(15:1)#,                    <<01069>>11206000
      ABS'SEG'OK           = FLAGS.(14:1)#;                    <<01069>>11208000
   EQUATE                                                      <<01069>>11210000
      NUMPARM              = 6+1,  << NUM PARM WORDS >>        <<01069>>11212000
      NUM'ACTUALPARM       = 6,    << NUM PARM IN CALL >>      <<01069>>11214000
      ALLSEG               = -1,                               <<01069>>11216000
      ALLPLOC              = -1,                               <<01069>>11218000
      INTRIN'NUM           = 98,                               <<01069>>11220000
      << CHEK ADD OF ERROR >>                                  <<01069>>11222000
      PARMCHEK             = [14/0,2/2],                       <<01069>>11224000
      OPTVMASK             = %37;  << ERROR REQUIRED >>        <<01069>>11226000
   DOUBLE                                                      <<01069>>11228000
      ORIG'DB;      << ORIG DB REGISTER        >>              <<01069>>11230000
   INTEGER                                                     <<01069>>11232000
      DB'STATE,     << ORIG DB LOC ON ENTRY    >>              <<01069>>11234000
      XDS,          << ORIG EXTRA DS NUMBER    >>              <<01069>>11236000
      PROC,                                                    <<01069>>11238000
      INTRINFLAG := [10/INTRIN'NUM,6/NUMPARM],                 <<01069>>11240000
      CRITICAL;                                                <<01069>>11242000
   LOGICAL                                                     <<01069>>11244000
      FLAGS := 0;   << USED FOR VALIDATION     >>              <<01069>>11246000
                                                               <<01069>>11248000
   SUBROUTINE PROC'EXIT( EXITSTATE );                          <<01069>>11250000
      VALUE EXITSTATE;                                         <<01069>>11252000
      INTEGER EXITSTATE;                                       <<01069>>11254000
   BEGIN                                                       <<01069>>11256000
      COMMENT: THIS SUBROUTINE DOES ANY NECESSARY              <<01069>>11258000
         CLEANUP AND EXITS PROCEDURE;                          <<01069>>11260000
      ERROR := EXITSTATE;                                      <<01069>>11262000
      IF ERROR = EVERYTHINGOK THEN STATUS.CCFLD := CCE         <<01069>>11264000
      ELSE STATUS.CCFLD := CCL;                                <<01069>>11266000
      ERROREXIT( INTRINFLAG,0,0 );                             <<01069>>11268000
      ASSEMBLE ( EXIT NUMPARM );                               <<01069>>11270000
   END;                                                        <<01069>>11272000
                                                               <<01069>>11274000
   ERRORON;                                                    <<01069>>11276000
   CHEK( INTRINFLAG,NUM'ACTUALPARM,DOUBLE(PARMCHEK),           <<01069>>11278000
         <<CAP>>,OPTVMASK );                                   <<01069>>11280000
                                                               <<01069>>11282000
   COMMENT:                                                    <<01069>>11284000
      IF WE WERE CALLED BY A SYSTEM PROCESS OR                 <<01069>>11286000
      A PRIVILEGED USER THAN ANY BREAKPOINTS WHICH ARE         <<01069>>11288000
      SET ARE PRIVILEGED BREAK POINTS.;                        <<01069>>11290000
   PRIV := PRIVBREAKPNT;                                       <<01069>>11292000
                                                               <<01069>>11294000
                                                               <<01069>>11296000
   << SET UP DEFAULT VALUES >>                                 <<01069>>11298000
                                                               <<01069>>11300000
   IF NOT SEG'PASSED THEN                                      <<01069>>11302000
      BEGIN                                                    <<01069>>11304000
      SEG := STATUS.(8:8);                                     <<01069>>11306000
      TYPESEG := ABS'SEG; << IGNORE PASSED TYPESEG >>          <<01069>>11308000
      ABS'SEG'OK := TRUE;                                      <<01069>>11310000
      END                                                      <<01069>>11312000
   ELSE IF NOT TYPESEG'PASSED THEN TYPESEG := PROG'SEG;        <<01069>>11314000
                                                               <<01069>>11316000
   IF NOT PLOC'PASSED AND SEG <> ALLSEG THEN                   <<01069>>11318000
      PROC'EXIT( INVALID'PLOC );                               <<01069>>11320000
   IF NOT BREAKPNT'TYPE'PASSED THEN BREAKPNT'TYPE := 0;        <<01069>>11322000
   IF NOT PLABEL'PASSED THEN PLABEL := 0; <<ALL TRAPS>>        <<01069>>11324000
                                                               <<01069>>11326000
   << TRANSLATE/VALIDATE PARAMETERS >>                         <<01069>>11328000
                                                               <<01069>>11330000
   IF SEG = ALLSEG THEN VALIDATE'BREAKPNT( ERROR,<<SEG>>,      <<01069>>11332000
      <<PLOC>>,<<TYPESEG>>,BREAKPNT'TYPE,<<CNT>>,FLAGS )       <<01069>>11334000
   ELSE IF PLOC = ALLPLOC THEN VALIDATE'BREAKPNT( ERROR,       <<01069>>11336000
      SEG,<<PLOC>>,TYPESEG,BREAKPNT'TYPE,<<CNT>>,FLAGS )       <<01069>>11338000
   ELSE VALIDATE'BREAKPNT( ERROR,SEG,PLOC,TYPESEG,             <<01069>>11340000
      BREAKPNT'TYPE,<<CNT>>,FLAGS );                           <<01069>>11342000
   IF ERROR <> 0 THEN PROC'EXIT( ERROR );                      <<01069>>11344000
                                                               <<01069>>11346000
   << SET UP CALL TO REMOVESTOP >>                             <<01069>>11348000
   PROC := IF BREAKPNT'TYPE.SYSBRKPNT=1 THEN 0 ELSE PIN;       <<01069>>11350000
   PROC.LOCBIT := IF BREAKPNT'TYPE.SYSBRKPNT=1 THEN 0          <<01549>>11352000
                  ELSE 1;                                      <<01549>>11354000
   COMMENT:                                                    <<01549>>11356000
      VALIDATE'BREAKPNT HAS ALREADY DONE CHECKING -->          <<01069>>11358000
      NO ERROR CHECK NEEDED AFTER CALL TO ABSOLUTESEG;         <<01069>>11360000
   SEG := IF SEG=ALLSEG THEN 0 ELSE                            <<01069>>11362000
             ABSOLUTESEG( TYPESEG,SEG,ERROR );                 <<01069>>11364000
   CRITICAL := SETCRITICAL;                                    <<01069>>11366000
   REMOVESTOP( PROC,SEG,PLOC,,PLABEL );                        <<01549>>11368000
   RESETCRITICAL( CRITICAL );                                  <<01069>>11370000
                                                               <<01069>>11372000
   << CLEANUP AND RETURN >>                                    <<01069>>11374000
   PROC'EXIT( ERROR );                                         <<01069>>11376000
END;  << CLEAR'BREAKPNT >>                                     <<01069>>11378000
                                                               <<01069>>11380000
                                                               <<01069>>11382000
$CONTROL SEGMENT=MAIN                                          <<01069>>11384000
$TITLE "          SYSTEM GLOBAL EQUATES AND DEFINES"           <<01069>>11386000
END.                                                                    11388000
