*DECK NP$INIT 
*IF DEF,XFR 
USETEXT AIPDEF
USETEXT NX$ACBF 
USETEXT NX$ACBX 
USETEXT NX$MSG
USETEXT NX$CHAR 
PROC NP$INIT (ACN, FILENAME, OPCODE, STATIS, DATADEC, TIMEOUT, ABL, 
                                           BSIZE,CWS,ICKVAL); 
# TITLE NP$INIT - INITIALIZE FILE TRANSFER.  #
  
      BEGIN  # NP$INIT #
  
# 
*** 
*     PROC NAME: AUTHOR      DATE 
*     NP$INIT    L.T.NGUYEN  03/20/83 
* 
*     NP$INIT PERFORMS THE INITIALIZATION REQUIRED PRIOR TO ACTUAL DATA 
*     TRANSFER. 
* 
*     PROC NP$INIT (ACN, FILENAME, OPCODE, STATIS, DATADEC, TIMEOUT, ABL
*                                                ,BSIZE)
* 
*     ENTRY      ACN        - APPLICATION CONNECTION NUMBER.
*                FILENAME   - FILE NAME TO BE TRANSFERRED, IN DISPLAY 
*                             CODE, 7 CHARACTERS MAXIMUM. 
*                OPCODE     = 0, FILE IS TO BE READ FROM THE NETWORK. 
*                           = 1, FILE IS TO BE WRITTEN TO THE NETWORK.
*                STATIS     - CALLING PROGRAM REPLY STATUS
*                             WORD. 
*                DATADEC    - FORMAT OF DATA BEING TRANSFERRED -
*                           - 0, UH 
*                           - 1, US 
*                           - 2, UU 
*                           - 3, C6 
*                           - 4, C8.
*                TIMEOUT    - TIME IN SECONDS TO WAIT FOR A FUNCTION
*                             RESPONSE BEFORE TIMING OUT. 
*                ABL        - APPLICATION BLOCK LIMIT.
*                BSIZE      - BLOCK SIZE TO TRANSMIT. 
*                CWS        - CHECK MARK WINDOW SIZE. 
*                ICKVAL     - INITIAL CHECK MARK VALUE. 
*                PRESNO     - PRU OFFSET AND BIT OFFSET.
* 
*     EXIT       FTTINDEX - INDEX INTO FTT TABLE.  ( GLOBAL ) 
* 
*     PROCESS    INITIALIZE VALUES IN COMMON BLOCKS COMACBX AND COMADFM.
*                IF ACN IS NOT WITHIN ALLOWABLE RANGE,
*                THEN:  
*                  CALL NP$ERR TO WRITE DAYFILE ERROR MESSAGE AND 
*                                           ABORT C.P.
*                  SET STATUS TO INDICATE ACN NOT WITHIN ALLOWABLE
*                    RANGE. 
*                ELSE:  
*                  IF COMACBX HAS NOT BEEN INTIALIZED,
*                  THEN 
*                    INITIALIZE VARIOUS DATA CELLS IN COMACBX.
*                  CALL GMEMCMM TO OBTAIN MEMORY FOR FETS, BUFFERS, 
*                                              AND RHF PARAMETER BLOCK. 
*                  SET FTTTIMEOUT[FTTINDEX] = TIMEOUT.
*                  SET FTTDIRECN[FTTINDEX] = OPCODE.
*                  SET FTTSTATADR[FTTINDEX] = STATUS ADDRESS. 
*                  SET FTTDXPA = OK (P$ES$OK).
*                  SET FTTERRORD = 0 (NO ERROR).
*                  CALL BUILDFT TO BUILD FETS, ALLOCATE BUFFER, AND 
*                    BUILD RHF NETXFR REQUEST/REPLY PARAMETER BLOCK.
*                  CALL CALLCIO TO OPEN LOCAL FILE WITHOUT RECALL.
*                  SET FTTSTATE[FTTINDEX] = 1 TO INDICATE WAITING FOR 
*                    COMPLETION OF OPEN FILE REQUEST. 
* 
# 
      ITEM ACN        I;             # APPLICATION CONNECTION NUMBER #
      ITEM FILENAME   C(7);          # FILE NAME #
      ITEM OPCODE     I;             # READ OR WRITE CODE # 
      ITEM STATIS     I;             # STATUS WORD #
      ITEM DATADEC    I;             # DATA FORMAT DECLARATION #
      ITEM TIMEOUT    I;             # SECONDS TO TIME OUT #
      ITEM ABL I ;
      ITEM BSIZE U ;
      ITEM CWS U ;
      ITEM ICKVAL U ; 
  
# 
****  PROC NP$INIT - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC NP$BFET;                # BUILT FETS                      #
        PROC NP$CIO ;                # CALL CIO                        #
        FUNC NP$CMAR U;              # ASSIGN GROUP NAME               #
        FUNC NP$CMAF U; 
        PROC NP$CMSF;                # SHRINK FIXED MEMORY             #
        PROC NP$CMFF;              # FREE FIXED MEMORY                 #
        FUNC NP$CS63 B;              # DETERMINE IF 63 CHAR SET        #
        PROC NP$ERR ;                # WRITE DAYFILE MESSAGE           #
        FUNC GMEMCMM U;              # GET CENTRAL MEMORY VIA CMM      #
        PROC NP$RTIM ;               # INITIALIZE FTTTIME              #
        PROC NP$S63;                 # SET TRANSLATION FOR 63 SET      #
        PROC NP$ZWDS;                # CLEAR CM BLOCK                  #
        PROC NP$INFO ;             # GET FILE STATUS                   #
        PROC NP$ZRBK ;
        PROC NP$OSIF ;
        END 
  
# 
****  PROC NP$INIT - XREF LIST END. 
# 
  
      ITEM FOUND B ;         # FLAG FOR LOCATING EMPTY FTT ENTRY       #
      ITEM I ;
      ITEM BUFFERADR I ;               # ADDRESS OF TOTAL BUFFER       #
      ITEM BUFLENGTH I ;               # TOTAL LENGTH OF BUFFER NEEDED #
      ITEM CODE I ;                    # CODE FOR CIO OPEN             #
      ITEM CIO$WORD U ;                # LENGTH OF DISK BUFFER         #
      ITEM NET$WORD U ;                # LENGTH OF NETWORKING BUFFER   #
      ITEM FSTATUS I; 
                                               CONTROL EJECT; 
  
        IF NUMFILEXFR EQ 1
        THEN
          BEGIN 
          GROUPNAME = NP$CMAR(0);     # ASSIGN GROUP NAME              #
          END 
  
        FOUND = FALSE ; 
        FOR I = 0 STEP 1 WHILE I LS MAXFILEXFR
                                AND NOT FOUND 
        DO
          BEGIN   # LOOP THROUGH FTT ENTRIES TO FIND AN EMPTY ONE      #
          IF FTTACN[I] EQ ACN 
          THEN
  
  
            BEGIN                       # SECOND FILE ON SAME CONN.    #
            P<STATUSWORD> = LOC(STATIS) ; 
            STATUSWD = S$XFR$2 ;             # SET STATUS FLAG         #
            RETURN ;                         # THEN RETURN TO NETXFR   #
            END 
          ELSE
            IF FTTACN[I] EQ 0 
            THEN
              BEGIN 
                                        # REMEMBER THIS IS EMPTY ENTRY #
              FTTINDEX = I ;
              FOUND = TRUE ;
              END 
  
          END                           # LOOP TO FIND FTT ENTRY       #
        IF NOT FOUND
        THEN
          NP$ERR("48") ;          # NO EMPTY ENTRY IN FTT FOUND        #
                                  # SEND DAYFILE MSG THEN ABORT C.P.   #
  
# 
        READY TO BUILD FTT ENTRY. 
# 
        NP$ZWDS(LOC(FTT$WD0[FTTINDEX]),FTTENTRYSIZE); # ZERO OUT ENTRY #
        NP$RTIM(TIME$WORD) ;      # GET CURRENT TIME                   #
        FTTACN[FTTINDEX] = ACN ;        # EMPTY ENTRY IN FTT, SAVE ACN #
        FTTSTATE[FTTINDEX] = STATX  ;       # INITIALIZE CURRENT STATE #
*IF DEF,DEBUG,2 
        FTTPREST[FTTINDEX] =  STATX ;       # INITIALIZE PREV. STATE   #
        FTTPRETRIG[FTTINDEX] = NOCHG ;      # INITIALIZE PREV. TRIG    #
                             # ASSIGNING THE STATE TABLE ORDINAL       #
        FTTSTORD[FTTINDEX] = ASSIGNORD[DATADEC] - OPCODE ;
        FTTOPCODE[FTTINDEX] = OPCODE ;
        FTTTIME[FTTINDEX] = TIME$SEC[0] ;   # SAVE THE INITIAL TIME    #
        FTTTIMOUT[FTTINDEX] = TIMEOUT ;     # SET TIME OUT TIME        #
        FTTSTATUS[FTTINDEX] = LOC(STATIS) ; # SAVE STATUS ADDRESS      #
        FTTUDD[FTTINDEX] = DATADEC ;        # DATADECLARARION          #
        FTTABL[FTTINDEX] = ABL ;
        FTTCURBLK[FTTINDEX] = ABL;          # COPY ABL TO RUNNING ABL  #
                                            # WINDOW                   #
        FTTOUTCWS[FTTINDEX] = 0;            # ZERO OUT OUTSTANDING     #
                                            # CHECKMARKS               #
        FTTBLK$MS[FTTINDEX] = MSWINDOWSZ;   # SET CHECK MARK WINDOW    #
                                            # VALUE                    #
        FTTNOTRAN[FTTINDEX] = FALSE;        # DEFAULT IS TRANSLATION   #
                                            # NEEDED                   #
        IF MFAC[0] EQ 1                     # IF MFACIL USED           #
        THEN
          BEGIN 
          FTTMFACIL[FTTINDEX] = TRUE;       # SET MFACIL FLAG TO TRUE  #
          END 
        IF RFAC[0] EQ 1                     # IF RFACIL SPECIFIED      #
        THEN
          BEGIN 
          FTTRFACIL[FTTINDEX] = TRUE;       # RFACIL SPECIFIED         #
          FTTNRETRY[FTTINDEX] = MAXRETRY;   # MAXIMUM RETRY COUNT      #
          END 
        FACILWD[0] = 0;                     # CLEAR BIT MASK           #
        FTTTBN[FTTINDEX] = 0 ;              # INITIALIZE SERIAL BLOCK  #
        FTTCWS[FTTINDEX] = CWS ;
        FTTOPENB[FTTINDEX] = ABL ;
        FTTOPENC[FTTINDEX] = CWS ;
        FTTICKVAL[FTTINDEX] = ICKVAL ;
        FTTCURPRU[FTTINDEX] = 1 ;        # INITIALIZE TO ONE           #
        IF DATADEC GQ C6
        THEN
          BEGIN                     # IVT CONN.    NEED TO BUILD FET   #
# 
*         OBTAIN MEMORY FOR LOCAL FETS (CIO AND WORKING FET ) AND 
*         BUFFER FOR CIO AND WORKING AREAS. 
# 
  
          NET$WORD = (( BSIZE + TBH$HSIZE) * OCTETSIZE)/WORDLENGTH + 3; 
                                       # CALCULATE SIZE OF NETWORK     #
          IF OPCODE EQ RECEIVE         # IF RECEIVER                   #
          THEN
            BEGIN 
            NET$WORD = NET$WORD + TOTALHDRBLK;  # ADD HDR BLOCK SIZE   #
            FTTBSIZE[FTTINDEX] = NET$WORD;  # BUFFER SIZE OF NETWORK   #
            END 
          ELSE
            BEGIN 
            FTTBSIZE[FTTINDEX] = BSIZE + TBH$HSIZE; 
            END 
  
  
          CIO$WORD = LEN$CIOB ; 
          BUFLENGTH = LEN$FET          # LENGTH OF CIO FET             #
                      + LEN$FETW       # LENGTH OF WORKING FET         #
                       + LEN$CMB       # LENGTH OF CONVERSION PARAM BLK#
                         + LEN$CIOB    # LENGTH OF CIO DISK BUFFER     #
                           + NET$WORD  # LENGTH OF NETWORK BUFFER      #
                             + LEN$CHK;# LENGTH OF CHECKMARK BUFFER    #
  
          BUFFERADR = NP$CMAF(BUFLENGTH,0,GROUPNAME); 
          FTTFETADR[FTTINDEX] = BUFFERADR ;           # CIO BUFFER AREA#
          FTTCMV$BLK[FTTINDEX] = BUFFERADR + LEN$FET + LEN$CIOB ; 
          FTTFETW[FTTINDEX] = BUFFERADR + LEN$CMB + LEN$FET + LEN$CIOB ;
          FTTCKTBL[FTTINDEX] = FTTFETW[FTTINDEX] + NET$WORD + LEN$FETW; 
          FTTCURPRU[FTTINDEX] = 0; # START WITH 0 PRU NUMBER           #
          END                      # IVT CONN.    NEED TO BUILD FET    #
        ELSE
          BEGIN                    # PRU CONECTION                     #
          BUFLENGTH = LEN$FET ; 
          CIO$WORD = 64 + 1 ;            # MIM CIO BUFFER, FOR OPEN    #
          BUFFERADR = NP$CMAF(BUFLENGTH+CIO$WORD,0,GROUPNAME);# GET BUF#
                                           # FOR FET AND IO ONLY       #
          FTTFETADR[FTTINDEX] = BUFFERADR ; 
          FTTFETW[FTTINDEX] = 0 ; 
          FTTBSIZE[FTTINDEX] = BSIZE ;
          END                      # PRU CONNECTION                    #
  
        NP$ZWDS(BUFFERADR,BUFLENGTH) ;   # ZERO OUT ALLOCATED MEMORY   #
        FTTBUFSIZE[FTTINDEX] = BUFLENGTH ;
        NP$BFET(FILENAME,CIO$WORD,NET$WORD) ; 
        IF OPCODE EQ SEND 
        THEN                       # READ FILE                         #
          BEGIN 
          CODE = CIO$OPENR ;       # CALL CIO TO OPEN READ             #
          NP$CIO(CODE); 
          END 
        ELSE
          BEGIN 
          CODE = CIO$OPENW ;       # CALL CIO TO OPEN WRITE            #
          NP$CIO(CODE); 
          IF DATADEC LS C6         # IF PRU RECEIVER                   #
          THEN
            BEGIN 
            CODE = CIO$WRITEF;     # PREPARE EOF MARKER ON FILE        #
            NP$CIO(CODE);          # WRITEF                            #
            END 
          END 
  
        NP$ZRBK(LOC(FILENAME),1) ;        # ZERO TRAILLING BLANK       #
        NP$INFO(FILENAME,FSTATUS) ;       # GET STATUS OF FILE         #
        IF FSTATUS NQ 0 
        THEN
          BEGIN            # ILLEGAL FILE TYPE FOR TRANSFERRING        #
          STATUSWD = ILL$FTP ;
          FTTACN[FTTINDEX] = 0 ;   # AGAIN FREE THE ENTRY IN FTT       #
          NP$CMFF(BUFFERADR) ;     # RELEASE THE ALLOCATED BUFFER      #
          END              # ILLEGAL FILE TYPE FOR TRANSFERRING        #
  
        RETURN ;
  
      END    # NP$INIT #
  
      TERM
*ENDIF
