*DECK SETACN
USETEXT IP$COM
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT TSB$COM 
USETEXT ACN$COM 
USETEXT GLOBALI 
USETEXT DCB$COM 
USETEXT TCB$COM 
USETEXT UCB$COM 
      PROC SETUPACN (ACN$VALUE);
      BEGIN # SETACN #
 #
*1DC  SETACN
* 
*     1. PROC NAME           AUTHOR              DATE 
*        SETACN              B. M. WEST          4 MARCH 1977 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        SETS UP CONTROL BLOCKS PERTINENT TO THE ACN GIVEN. 
* 
*     3. METHOD USED. 
*        SETACN FIRST DETERMINES THAT THE ACN IS LEGAL, WITHIN THE
*        RANGE OF ACN"S ACCEPTABLE TO RBF, IF NOT ACCEPTABLE SETACN 
*        WILL SEND A DAYFILE MESSAGE "ILLEGAL ACN - N" . IF ACCEPTABLES 
*        SETACN CHECK CONNECTION TYPE, IF A CONSOLE CONNECTION SETACN 
*        SET TCB TO POINT TO THE BUFFER POINTED TO IN ACN$CB FOR THIS 
*        CONNECTION. IF THIS IS A BATCH CONNECTION SETACN FINDS THE 
*        CONSOLE CONNECTION ENTRY IN ACN$TABLE AND SET UP THE TCB TO
*        POINT TO ITS CONTROL BLOCK. IF A DOWNLINE CONNECTION 
*        SET UCB TO POINT TO THE UPLINE CONNECTION"S CONTROL BLOCK. 
*        IF ACN$VALUE PASSED TO SETACN IS ZERO THEN SETACN RETURNS
*        WITHOUT SETTING UP CONTROL BLOCKS
* 
*     4. ENTRY PARAMETERS.
* 
*          ACN$VALUE - ACN OF CONNECTION TO BE SETUP
* 
*     5. EXIT PARAMETERS. 
*          ACN - IS SET TO ACN$VALUE IF ACN$VALUE WAS LEGAL AND NON 
*                ZERO (ACN IS A GLOBAL ITEM)
* 
*     6. COMDECKS CALLED. 
*          RBF$COM, TCB$COM, DCB$COM, UCB$COM 
*          TSBMDEFS, TSBMBASE 
* 
*     7. ROUTINES CALLED. 
*          MESSAGE
* 
*     8. DAYFILE MESSAGES.
* 
*          ILLEGAL ACN - NNNN" - ISSUED IF UNACCEPTABLE ACN PASSED TO 
*                                 SETACN
* 
 #
      CONTROL LIST; 
      XREF PROC MESSAGE;     # OUTPUT DAYFILE MESSAGE                  #
# 
      PARAMETER DEFINITIONS 
# 
      ITEM ACN$VALUE U;               # ACN PASSED TO SETACN           #
  
      ARRAY ILLEGALACN S (2); 
        ITEM ILLACN1  C (0,0,14)  = ["ILLEGAL ACN - "], 
             ILLACNNO U (1,24,24) = [O"00000000"],
             ILLACN2  U (1,48,12) = [O"0000"];
# 
      RETURN IMMEDIATELY IF ACN$VALUE IS ZERO 
# 
      IF ACN$VALUE EQ 0 
      THEN
        RETURN; 
# 
      IS ACN$VALUE AN ACCEPTABLE ACN
# 
      IF ACN$VALUE LS LOWER$ACN OR ACN$VALUE GR UPPER$ACN 
# 
      NO, SEND "ILLEGAL ACN - NNNN" MESSAGE 
# 
      THEN
        BEGIN 
# 
        CONVERT ACN TO DISPLAY CODE 
# 
# 
        ISSUE DAYFILE MESSAGE 
# 
        MESSAGE(ILLEGALACN,DFLOPT); 
        END 
# 
      YES, SET UP CONTROL BLOCK (S) 
# 
      ELSE
        BEGIN # SET UP #
        ACN = ACN$VALUE;
        IF ACN$STATE [ACN] EQ S"NON$EXISTENT" 
        THEN
          RETURN; 
        IF ACN$DEVTYPE [ACN] EQ S"CONSOLE"
        THEN
# 
          CONSOLE CONNECTION
# 
          BEGIN 
          P<TCB> = ADDRESS [ACN$CB[ACN]]; 
        P<TCB$DEVICE> = P<TCB> + TCB$SIZE;
          END # CONSOLE CONNECTION #
        ELSE
          BEGIN # BATCH CONNECTION #; 
          IF ACN$DEVTYPE [ACN] EQ S"CARD$READER"
# 
          UPLINE CONNECTION 
# 
          THEN
            BEGIN 
            P<UCB> = ADDRESS [ACN$CB [ACN]];
            END 
          ELSE
# 
          DOWNLINE CONNECTION 
# 
            BEGIN 
            P<DCB> = ADDRESS [ACN$CB[ACN]]; 
            END 
# 
          SET TCB TO POINT TO CONTROLLING CONSOLE"S CONTROL BLOCK 
# 
          P<TCB> = ADDRESS [ACN$CB [ACN$CTLR[ACN]]];
          P<TCB$DEVICE> = P<TCB> + ACN$DEVINDEX [ACN];
          END # BATCH CONNECTION #
        END # SET UP #
      RETURN; 
      END # SETACN #
      TERM; 
