*DECK,GETBSN
USETEXT CYBRDEF 
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT ACN$COM 
USETEXT GLOBALI 
USETEXT TCB$COM 
      FUNC GETBSN U;
      BEGIN # GETBSN #
*IF DEF,IMS 
 #
*1DC  GETBSN
* 
*     1. FUNC NAME           AUTHOR              DATE 
*        GETBSN              B. M. WEST          29 APRIL 1977
* 
*     2. FUNCTIONAL DESCRIPTION.
* 
*        GENERATES A BLOCK SEQUENCE NUMBER (BSN) IF THE 
*        APPLICATION BLOCK LIMIT (ABL) IS NOT EXCEEDED
* 
*     3. METHOD USED
* 
*        1. GETBSN WILL DETERMINE IF A BSN IS TO BE GENERATED FOR 
*           A CONSOLE CONNECTION IN WHICH CASE ABL = TCB$ABL, 
*           BSN = TCB$NEXTBSN AND ACK = TCB$NXTACKSN ELSE IT WILL 
*           EXIT. 
* 
*        2. GETBSN ASSUMES WHEN ACK = BSN THERE ARE NO OUTSTANDING
*           BSN. ACK IS UPDATED BY THE SMP MODULES FC$ACK AND 
*           FC$STR. 
* 
*        3. BSN AND ACK ARE VALUES FROM 1 TO MAXBSN.
* 
*        4. INITIAL SETTINGS OF BSN AND ACK MUST BE THE SAME LEGITIMATE 
*           VALUES. 
* 
*        5. THE DIFFERENCE BETWEEN ACK AND BSN EXCEEDS ABL THEN A BSN 
*           OF ZERO IS RETURNED. IF BSN IS GREATER THAN ACK THEN
*           BSN - ACK IS THE DIFFERENCE. IF ACK IS GREATER THAN BSN 
*           THEN MAXBSN - ACK + BSN IS THE DIFFERENCE.
* 
*     4. ENTRY PARAMETERS 
* 
*        ACN - ACN OF CALLING CONNECTION (A GLOBAL ITEM)
* 
*        TCB - TCB OF CONTROLLING CONSOLE 
* 
*        IF ACN IS A CONSOLE CONNECTION THEN GETBSN USES TCB$NEXTBSN AS 
*        BSN, TCB$NXTACKSN AS ACK, AND TCB$ABL AS ABL.
* 
* 
*        THE VALUE CONTAINED IN TCB$NEXTBSN (IF A CONSOLE CONNECTION) OR
*        IN TCB$DEVBSN (IF A BATCH DEVICE CONNECTION) UPON ENTRY TO 
*        GETBSN IS RETURNED AS THE VALUE OF THE FUNCTION GETBSN IF THE
*        BLOCK LIMIT IS NOT EXCEEDED AND TCB$NEXTBSN OR TCB$DEVBSN IS 
*        UPDATED TO THE NEXT LEGITIMATE BSN. IF THE BLOCK LIMIT WOULD 
*        BE EXCEEDED THE ZERO IS RETURNED AS THE VALUE OF THE FUNCTION
*        AND TCB$NEXTBSN OR TCB$DEVBSN IS LEFT UNCHANGED. 
* 
*     6. COMDECKS USED
* 
*        RBF$COM
*        TCB$COM
* 
*     7. ROUTINES CALLED. NONE. 
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
*ENDIF
  
      ITEM BSN  U;           # BLOCK SEQUENCE NUMBER                   #
      ITEM ACKS U;           # ACK                                     #
      ITEM ABL  U;           # APPLICATION BLOCK LIMIT                 #
      ITEM DIFFERENCE U;     # DIFFERENCE VALUE                        #
      ITEM NEXTBSN U;        # NEXT BSN                                #
#                                                                      #
#     SET UP  BSN, ACK, AND ABL                                        #
#                                                                      #
      IF ACN$DEVTYPE [ACN] EQ S"CONSOLE"
      THEN
        BEGIN # CONSOLE CONNECTION BSN WAITED # 
        BSN = TCB$NEXTBSN;
        ACKS  =  TCB$NXTACKSN;
        ABL = TCB$ABL;
        END   # CONSOLE CONNECTION BSN WANTED # 
      ELSE
        BEGIN # BATCH CONNECTION BSN WANTED # 
        RETURN; 
        END   # BATCH CONNECTION BSN WANTED # 
#                                                                      #
#     DETERMINE DIFFERENCE BETWEEN ACK AND BSN                         #
#                                                                      #
      IF BSN LS ACKS
      THEN
        DIFFERENCE = MAXBSN - ACKS + BSN; 
      ELSE
        DIFFERENCE = BSN - ACKS;
#                                                                      #
#     DETERMINE IF ABL WILL EXCEEDED                                   #
#                                                                      #
      NEXTBSN = BSN;
      IF DIFFERENCE LS ABL
      THEN
        BEGIN # ABL WILL NOT BE EXCEEDED #
        IF BSN EQ MAXBSN
        THEN
        NEXTBSN = 1;
        ELSE
        NEXTBSN = BSN + 1;
        TCB$NEXTBSN = NEXTBSN;
        END   # ABL WILL NOT BE EXCEEDED #
      ELSE    # ABL WILL BE EXCEED #
        BSN = 0;
      GETBSN = BSN; 
      RETURN; 
      END   # GETBSN #
      TERM; 
