*DECK EXRETSB 
      PROC RETTSB ( (TSBN) ); 
      BEGIN # RETTSB #
*IF DEF,IMS 
 #
**
* 
*     1. PROC NAME           AUTHOR              DATE 
*        RETTSB              M. D. PICKARD       76/12/2
* 
*     2. FUNCTIONAL DESCRIPTION 
*        RETTSB WILL RETURN AN ASSIGNED TSB TO THE FREE SPACE OF
*        THE TSB AREA.
* 
*     3. METHOD USED
*        IF THE TSBN IS VALID THE BLOCK IS RETURNED TO THE FREE 
*        SPACE BY CALLING GIVETSB AND THE TSBN IS RETURNED
*        BY CALLING GIVTSBN.
* 
*     4. ENTRY PARAMETERS 
*        TSBN (FORMAL)       TSB NUMBER OF TSB THAT IS TO BE RETURNED 
* 
*     5. EXIT PARAMETERS
*        NONE.
* 
*     6. COMDECKS CALLED
*        TSBBASE             TSB MANAGER BASED ARRAY DEFINITIONS
*        TSBDEFS             TSB MANAGER SYMPL DEFS 
*        TSBDATA             TSB MANAGER DATA AREA DEFINITIONS
* 
*     7. ROUTINES CALLED
*        GIVETSB             GIVE TSB BACK TO FREE SPACE
*        GIVTSBN             RETURNS A TSBN TO THE FREE TSBN CHAIN
* 
*     8. DAYFILE MESSAGES 
*        NONE.
* 
 #
*ENDIF
      CONTROL NOLIST;        # STOPS LIST TSBDEFS,TSBDATA,TSBBASE   # 
*CALL CYBERDEFS 
*CALL TSBDEFS 
*CALL TSBBASE 
*CALL TSBDATA 
      CONTROL LIST; 
      ITEM
           TSBN U;           # TSBN OF TSB TO BE RETURNED              #
      XREF
        BEGIN 
        PROC GIVETSB; 
        END 
      ITEM
           TEMP U,           # TEMPORARY UNSIGNED INTEGER              #
           TEMPB B;          # TEMPORARY BOOLEAN                       #
      CONTROL EJECT;
      PROC GIVTSBN ( (TSBN) );
      BEGIN # GIVTSBN # 
*IF DEF,IMS 
 #
**
* 
*     1. PROC NAME           AUTHOR              DATE 
*        GIVTSBN             M. D. PICKARD       76/12/13 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        GIVTSBN WILL RETURN AN ASSIGNED TSBN TO THE CHAIN OF 
*        UNASSIGNED TSBN"S IN THE TSB INFORMATION TABLE ( TSBIT ).
* 
*     3. METHOD USED
*        THE CHAIN OF UNASSIGNED (FREE) TSBN"S IS SEARCHED FINDING
*        THE APPROPRIATE SPOT, TSBN IS LINKED INTO THE CHAIN. 
* 
*     4. ENTRY PARAMETERS 
*        TSBN                TSBN ( TSB NUMBER ) THAT IS TO BE RETURNED 
* 
*     5. EXIT PARAMETERS
*        NONE.
* 
*     6. COMDECKS CALLED
*        NONE.
* 
*     7. ROUTINES CALLED
*        GETTSB 
*        GIVETSB
*        MOVEI               MOVES BLOCK OF CENTRAL MEMORY WORDS
* 
*     8. DAYFILE MESSAGES 
*        NONE.
* 
 #
*ENDIF
      ITEM
           TSBN U;           # TSB NUMBER TO BE RETURNED               #
  
      NUMFREE[0] = NUMFREE[0] + 1; # BUMP NUMBER OF FREE TSBN"S        #
      IF LOWFREE[0] EQ 0
      THEN                   # THIS IS THE ONLY FREE TSBN              #
        BEGIN 
        FWDPTR[TSBN] = 0;    # END OF FREE CHAIN POINTER               #
        LOWFREE[0] = TSBN;        #SET LOWFREE TO THIS TSBN         # 
        END 
      ELSE                   # FIND THE TSBN"S PLACE IN THE FREE CHAIN #
        BEGIN 
        IF TSBN LS LOWFREE[0] 
        THEN                 # TSBN WILL BE NEW LOWFREE                #
          BEGIN 
          FWDPTR[TSBN] = LOWFREE[0]; # POINT TO OLD LOWFREE            #
          LOWFREE[0] = TSBN; # SET NEW LOWFREE AT RETURNED TSBN        #
          END 
        ELSE
          BEGIN              # SEARCH FOR ITS SPOT IN FREE CHAIN       #
          TEMPB = FALSE;     # END OF LOOP INDICATOR                   #
          FOR TEMP = LOWFREE[0] WHILE NOT TEMPB DO
            BEGIN            # SEARCH TIL HIT                          #
            FWDPTR[TSBN] = FWDPTR[TEMP]; # SET FWDPTR TO NEXT ONE      #
            IF TSBN LS FWDPTR[TSBN] 
            THEN             # PLACE IS FOUND                          #
              BEGIN 
              TEMPB = TRUE;  # SET END OF LOOP                         #
              FWDPTR[TEMP] = TSBN; # SET NEW FWDPTR FOR PREVIOUS TSBN  #
              END 
            ELSE             # SEE IF END OF CHAIN                     #
              BEGIN 
              IF FWDPTR[TSBN] EQ 0
              THEN           # THIS IS THE END OF CHAIN                #
                BEGIN 
                TEMPB = TRUE; # SET END OF LOOP                        #
                FWDPTR[TEMP] = TSBN; # POINT OLD END OF CHAIN TO TSBN  #
                END 
              ELSE           # CONTINUE SEARCH                         #
                TEMP = FWDPTR[TEMP]; # BUMP TO NEXT IN CHAIN           #
              END 
            END 
          END 
        END 
      RETURN; 
      END # GIVTSBN # 
      CONTROL EJECT;         # RETTSB CODE STARTS HERE                 #
      IF ( TBUSY[TSBN] ) AND ( TSBN LS LENGTH[0] ) AND ( TSBN GR 0 )
      THEN                   # TSBN IS VALID                           #
        BEGIN 
        GIVETSB(TTSBFWA[TSBN]); # GIVE BACK THE TSB TO FREE SPACE      #
        TBUSY[TSBN] = FALSE; # CLEAR BUSY FLAG                         #
        TTSBFWA[TSBN] = 0;   # CLEAR TSB FWA                           #
        GIVTSBN(TSBN);       # RETURN THIS TSBN TO FREE CHAIN          #
        END 
      RETURN; 
      END TERM # RETTSB # 
