*COMDECK PBBREAKPO
_$J+  PAGE EJECT? 
_*****************************
*                            *
*       PBBREAKPOINT         *
*  BREAKPOINT INT HANDLER    *
*                            *
*****************************?
_$R+,G+,I-     RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBBREAKPOINT DECIDES WHERE TO TRANSFER CONTROL             *
*           AFTER A SOFTWARE BREAKPOINT INTERRUPT.  IF THE             *
*           INTERRUPTED SOFTWARE PRIORITY LEVEL HAS BEEN               *
*           ENABLED (VIA A BL/ TUP COMMAND), THE BREAKPOINT            *
*           TABLE (JEBPTABLE) IS SEARCHED FOR THE INTERRUPT            *
*           ADDRESS.  IF FOUND, CONTROL IS TRANSFERRED TO              *
*           THE DESIRED DEBUG PROGRAM(S) USING THE BP CODE IN          *
*           THE BP TABLE.                                              *
*                                                                      *
**INPUT- BREAKPOINT TABLE, INTERRUPT ADDRESS.                          *
*                                                                      *
**OUTPUT- PROPER BREAKPOINT ROUTINE(S) EXECUTED.                       *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBTUPBREAKPT     TUP BREAKPOINT                      *
*              2) PB1SNAP          SNAPSHOT CORE                       *
*              3) PB2SNAP          SNAPSHOT REGISTERS                  *
*              4) PBQUICKIO        QUICK I/O                           *
*              5) PBWRAPSNAP       WRAP AROUND SNAPSHOT                *
*              6) PBHALT           SYSTEM HALT                         *
*                                                                      *
***********************************************************************?
PROCEDURE PBBREAKPOINT; 
CONST NOP = $B00; 
VAR HIT  : BOOLEAN; 
    MATCH : BOOLEAN;
    ANYHIT : BOOLEAN; 
    I    : INTEGER; 
    TEMP : B0OVERLAY; 
    ADDR : B018BITS;
    SNAP : JFSNAPTABLE; 
    WRAP : JFWRAP;
_?
FUNCTION CNTOK(VAR COUNT : INTEGER) : BOOLEAN;
BEGIN 
  CNTOK := (DELIM " COUNT); 
  IF (0 " COUNT) & (DELIM " COUNT) THEN     _ZERO MEANS BP FOREVER     ?
  IF 1 = COUNT
  THEN COUNT := DELIM                       _DONT ALLOW ANY MORE BP#S  ?
  ELSE COUNT := COUNT - 1;                  _DECREMENT BP COUNT        ?
END;
_?
BEGIN 
  WITH JEBPTABLE,TEMP DO
  BEGIN 
    MATCH := JRLEVELFLG[JEREGSAVE'[B0EXTRA]]; 
    I := 0; 
    ANYHIT := FALSE;
    REPEAT                                  _LOOP THRU BP TABLE        ?
      BAINT := JEREGSAVE'[B0OFLOW];         _GET BP RETURN ADDRESS     ?
      PB18BITS(ADDR,TEMP.BAINT,J0XFORM);    _GET 18-BIT ADDRESS        ?
      I := I+1; 
      HIT := FALSE; 
      WITH JEBPENTRY[I] DO
      BEGIN 
        CASE JGTESTABLE                     _-PERFORM ADDRESS COMPARE  ?
             [PB18COMP(ZERO,J0LTE,JEBEGINADDR), 
              PB18COMP(ZERO,J0LTE,JEENDADDR), 
              PB18COMP(ZERO,J0LTE,ADDR)] OF 
        J0PPP,J0NNN:  
        HIT := PB18COMP(ADDR,J0GRE,JEBEGINADDR) & 
                PB18COMP(ADDR,J0LTE,JEENDADDER);
_?
        J0PNN:  
        HIT := PB18COMP(ADDR,J0GRE,JEENDADDR);
_?
        J0PNP:  
        HIT := PB18COMP(ADDR,J0GRE,JEBEGINADDR);
        END; _CASE? 
        ANYHIT := HIT ! ANYHIT; 
        BAINT := JEBPCODE;                  _GET BP CODE               ?
        IF HIT THEN                         _CHECK IF ENTRY FOUND      ?
        IF MATCH THEN                       _CHECK IF BP LEVEL         ?
        CASE BALIO OF 
_?
        J2TUPOUTPUT:                        _TUP BREAKPOINT            ?
        PBTUPBREAKPT; 
_?
        J2SNP1:                             _SNAPSHOT CORE             ?
        IF CNTOK(JEPARAM[3].B0WORD.BAINT) THEN
        BEGIN 
          SNAP[1].JFBEGINADDR := JEPARAM[1];
          SNAP[1].JFENDADDR   := JEPARAM[2];
          SNAP[2].JFBEGINADDR.B0DELIM := DELIM; 
          PB1SNAP(SNAP);                    _PERFORM SNAPSHOT          ?
        END;
_?
        J2SNP2:                             _SNAPSHOT REGISTERS        ?
        IF CNTOK(JEPARAM[1].B0WORD.BAINT)   _CHECK COUNT               ?
        THEN PB2SNAP;                       _PERFORM REGISTER SNAP     ?
_?
        J2SNP3:                             _SNAPSHOT RETURN ADDR      ?
        IF CNTOK(JEPARAM[1].B0WORD.BAINT)   _CHECK COUNT               ?
        THEN PB1SNAP(JF3SNPTABLE);          _PERFORM SNAPSHOT          ?
_?
        J2QUICK:                            _OUTPUT ASCII BUFFER       ?
        IF CNTOK(JEPARAM[2].B0WORD.BAINT) THEN
        BEGIN 
          BAINT := JEPARAM[1].B0WORD.BAINT; 
          PBQUICKIO(JBASSIGNTABLE[J2QUICK], 
                    BABUFPTR);
        END;
_?
        J2WS1:                              _WRAP AROUND SNAPSHOT      ?
        IF CNTOK(JEPARAM[5].B0WORD.BAINT) THEN
        WITH WRAP DO
        BEGIN 
          SNAP[1].JFBEGINADDR := JEPARAM[1];_SNAP AREA START           ?
          SNAP[1].JFENDADDR   := JEPARAM[2];_SNAP AREA STOP            ?
          SNAP[2].JFBEGINADDR.B0DELIM := DELIM; 
          JFWAREA := JEPARAM[3];            _WRAP ADDRESS              ?
          JFWBASE := JEPARAM[3];            _WRAP AREA START           ?
          JFWEND  := JEPARAM[4];            _WRAP AREA STOP            ?
          PBWRAPSNAP(SNAP,WRAP);            _PERFORM WRAP AROUND SNAP  ?
          JEPARAM[3] := JFWAREA;            _STORE UPDATED WRAP ADDRESS?
        END;
_?
        J2SPARE:                            _SPARE BREAKPOINT FOR USER ?
        IF CNTOK(JEPARAM[1].B0WORD.BAINT) THEN
        INST(NOP,NOP,NOP,NOP,NOP, 
             NOP,NOP,NOP,NOP,NOP, 
             NOP,NOP,NOP,NOP,NOP, 
             NOP,NOP,NOP,NOP,NOP);
_?
        END; _CASE? 
      END; _WITH? 
    UNTIL J1BREAKMAX = I; 
    IF NOT ANYHIT                           _NO HIT FOUND IN BP TABLE  ?
    THEN PBHALT(J0PROGPROT);                _LEGITIMATE PROTECT FAULT  ?
  END; _WITH? 
END; _PBBREAKPOINT? 
  
