*COMDECK PNTUPTCB 
_$J+? 
_*****************************
*                            *
*          PN2GTID           *
* GET 1ST ID IN TYPE 2 TABLE *
*                            *
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PN2GTID RETURNS THE FIRST ID IN A SPECIFIED TYPE 2 TABLE.  *
*                                                                      *
**INPUT- THE TYPE 2 TABLE ADDRESS.                                     *
*                                                                      *
**OUTPUT- THE ID OR $FFFF IF TABLE EMPTY.                              *
*                                                                      *
**EXTERNAL SUBROUTINES- NONE                                           *
*                                                                      *
***********************************************************************?
FUNCTION PN2GTID(PTR : B0BUFPTR) : INTEGER; 
VAR I,J,ID : INTEGER; 
    HIT : BOOLEAN;
BEGIN 
  ID := 0;                                  _ CLEAR ID BUILD AREA      ?
  PN2GTID := $FFFF;                         _ RETURN $FFFF IF EMPTY    ?
  IF NIL " PTR THEN                         _ CHECK IF NIL TYPE 2 TABLE?
  FOR J := 1 TO 2 DO                        _ FOR 1ST AND 2ND LEVELS   ?
  WITH PTR' DO
  BEGIN 
    I := 0;                                 _ CLEAR INDEX              ?
    REPEAT
      I := I+1; 
      HIT := NIL " BCCHAINS[I];             _ 1ST NON-NIL ENTRY        ?
    UNTIL HIT ! (I = J0T2SZE);
    IF HIT THEN                             _ IF A NON-NIL ENTRY FOUND ?
    BEGIN 
      PTR := PTR'.BCCHAINS[I];              _ GET NEXT LEVEL POINTER   ?
      ID := ID+I-1;                         _ BUILD ID                 ?
      IF 1 = J                              _ CHECK IF 1ST LEVEL       ?
      THEN ID := ID*J0T2SZE                 _ UPPER 4-BITS OF ID       ?
      ELSE PN2GTID := ID;                   _ RETURN BUILT ID          ?
    END 
    ELSE J := 2;                            _ EMPTY- GET OUT           ?
  END;
END; _PN2GTID?
_$J+? 
_*****************************
*                            *
*        PNGTCB              *
*     GET TCB ADDRESS        *
*                            *
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PNGTCB RETURNS EITHER A SPECIFIC TCB ADDRESS (BASED ON     *
*           CN IN MESSAGE) OR THE FIRST TCB ATTACHED TO A LOGICAL      *
*           LINK.                                                      *
*                                                                      *
**INPUT- AN LLCB ADDRESS AND A CN.  IF THE CONNECTION                  *
*        NUMBER IS ZERO, RETURN THE FIRST TCB ATTACHED TO THE          *
*        LOGICAL LINK.                                                 *
*                                                                      *
**OUTPUT- PNGTCB IS A FUNCTION RETURNING THE TCB ADDRESS.              *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*                1) PN2GTID        GET 1ST ID IN TYPE 2 TABLE          *
*                2) PN2SRCH        SEARCH TYPE 2 TABLE                 *
*                                                                      *
***********************************************************************?
FUNCTION PNGTCB_(LLCB : B0BUFPTR; CNUM : INTEGER) : B0BUFPTR?;
BEGIN 
  PNGTCB := NIL;                                 _RETURN NIL IF NO TCB ?
  IF NIL " LLCB THEN                             _CHECK FOR LLCB       ?
  WITH LLCB'.BLLLCB.BLSPART DO
  IF BLCDS THEN                                  _CHECK FOR CN DIRCTRY ?
  IF 0 = CNUM THEN                               _CHECK CN             ?
  BEGIN 
    CNUM := PN2GTID(BLCONDIR);                   _FIND 1ST CN          ?
    IF $FFFF " CNUM THEN                         _CHECK IF ANY CN      ?
    PNGTCB := PN2SRCH(CNUM,BLCONDIR);            _YES- GET TCB ADDR    ?
  END 
  ELSE
  PNGTCB := PN2SRCH(CNUM,BLCONDIR)               _FIND TCB GIVEN CN    ?
  ELSE PNGTCB := BLCONDIR;                       _RETURN COUPLER TCB   ?
END; _PNGTCB? 
