*DECK,FIN$DEV 
USETEXT CYBRDEF 
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT ACN$COM 
USETEXT GLOBALI 
USETEXT TCB$COM 
      PROC FIN$DEV; 
      BEGIN # FIN$DEV # 
*IF DEF,IMS 
 #
*1DC  FIN$DEV 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        FIN$DEV             B. M. WEST          CINCO DE MAYO 1977 
* 
*     2. FUNCTIONAL DESCRIPTION.
* 
*        TO CLEAN UP A BATCH DEVICE"S CONNECTION AFTER IT IS ENDED. 
* 
*     3. METHOD USED. 
* 
*        FIN$DEV REMOVES THE TCB$DEVICE ENTRY FROM ITS CONSOLES TCB,
*        AND FREES THE ACN$TABLE ENTRY. 
* 
*     4. ENTRY PARAMETERS.
* 
*        ACN OF BATCH DEVICE AND TCB OF THE CONTROLLING CONSOLE 
* 
*     5. EXIT PARAMETERS. NONE. 
* 
*     6. COMDECKS CALLED. 
* 
*        RBF$COM
*        TCB$COM
* 
*     7. ROUTINES USED. 
* 
*        LINK 
*        RETTSB 
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
*ENDIF
  
      XREF PROC LINK;        # LINK ACN TO A MODULE                    #
      XREF PROC REMOVE;      # REMOVE ACN FROM EVENT OR NON EVENT CHAIN#
      XREF PROC RETTSB;                # RETURN UCB OR DCB             #
      XREF PROC SETUPACN;                      # SET UP CONTROL BLOCKS #
      XREF PROC WAIT;        # WAIT EVENT PROCESSOR                    #
      BASED ARRAY TEMP [1:1] S(2);
        ITEM WORD1 I (0,0,60),
             WORD2 I (1,0,60);
  
      ITEM SAVACN;
  
#                                                                      #
#     REPACK REMAINING TCB$DEVICE ENTRIES                              #
#                                                                      #
      TCB$NDEVICE = TCB$NDEVICE - 1;
      P<TCB$DEVICE> = P<TCB> + TCB$SIZE +TCB$NDEVICE * TCB$DEVSIZE; 
      P<TEMP> = P<TCB> + ACN$DEVINDEX [ACN];
      WORD1 = TCB$DEVWORD1; 
      WORD2 = TCB$DEVWORD2; 
      ACN$DEVINDEX [TCB$DEVACN] = ACN$DEVINDEX [ACN]; 
      TCB$DEVWORD1 = 0; 
      TCB$DEVWORD2 = 0; 
#                                                                      #
#     INITIALIZE THE ENDED ACN TABLE ENTRY                             #
#                                                                      #
      SAVACN = ACN; 
      ACN = ACN$CTLR[ACN];
      IF TCB$NDEVICE EQ 0 AND ACN$STATE[ACN] EQ S"PRE$CONNECT"
      THEN # IF PSEUDO CONSOLE, WE CAN GET RID OF IT NOW               #
        BEGIN 
        IF TCB$EVENT NQ 0 
        THEN
          BEGIN # PSEUDO CONNECTION ON THE EVENT CHAIN                 #
          REMOVE(CHAINS"EVENT");
          TCB$EVENT = 0;
          ACN$CHAIN[ACN] = 0; 
          END 
        ELSE # PSEUDO CONNECTION NOT ON EVENT CHAIN                    #
          BEGIN 
          IF ACN$CHAIN[ACN] NQ 0
          THEN
            BEGIN 
            REMOVE(ACN$CHAIN[ACN]); 
            ACN$CHAIN[ACN] = 0; 
            END 
          END 
        LINK(CHAINS"FIN$CON", NOEVENT); 
        SYSACT = TRUE;
        END 
      ACN = SAVACN; 
      IF ACN$CB[ACN] NQ 0 
      THEN
        BEGIN                          # IF UCB OR DCB EXISTS          #
        RETTSB (ACN$CB[ACN]);          # THEN RETURN IT                #
        SETUPACN (ACN); 
        END                            # IF UCB OR DCB EXISTS          #
      ACN$WORD [ACN] = 0; 
      ACN$STATE [ACN] = S"NON$EXISTENT";
      RETURN; 
      END   # FIN$DEV # 
      TERM; 
