*DECK AREQ                         27MAY81
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQNET 
    PROC AREQ;
      BEGIN    # AREQ # 
# 
**    AREQ       PROCESS ASYNCHRONOUS COMMANDS. 
* 
*     AREQ EXTRACTS THE COMMAND FROM THE NETWORK TEXT AREA AND CALLS
*     THE APPROPRIATE ROUTINE FOR PROCESSING COMMANDS 0-5, OR PROCESSES 
*     COMMANDS 60-62 ITSELF.
* 
*     PROC AREQ 
* 
*     ENTRY      ACN = CONNECTION NUMBER (AFT ORDINAL). 
*                FILECHR = TEXT LENGTH IN CHARACTERS. 
*                NTAH = MESSAGE HEADER (PRECEDING TEXT AREA). 
* 
*     EXIT       AFT ENTRY UPDATED. 
*                FILEBNO = ETPR/FINI (IF ENDING CONNECTION).
*                FILETIM = 0. 
*                NEXT COMMAND SENT. 
* 
*     MESSAGES   1. UNRECOGNIZED COMMAND RECEIVED, PID/LID. 
*                2. ATTRIBUTES WITH COMMAND XX IGNORED, PID/LID.
* 
*     PROCESS    FETCH COMMAND FROM NTA.
*                IF ATTRIBUTE SUPPLIED WITH COMMAND:  
*                  SEND INFORMATIVE MESSAGE 2.
*                IF COMMAND = RFT,   RPOS,  RNEG,  GO,    STOP,  STOPR: 
*                  CALL       RCM00/ RCM01/ RCM02/ RCM03/ RCM04/ RCM05. 
*                ELSE:  
*                  IF COMMAND = ETP / ETPR / (FINI):  
*                    IF COMMAND IN SEQUENCE:  
*                      SEND ETPR / FINI / (NOTHING) 
*                      UPDATE FLAGS IN AFT ENTRY. 
*                    ELSE:  
*                      CALL ILLSEQ. 
*                  ELSE:  
*                    SEND MESSAGE 1 
*                    CALL ILLSEQ. 
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        FUNC ACFETCH; 
        PROC ACSTORE; 
        PROC CMDPUT;
        PROC CONERR;
        PROC FREENTA; 
        PROC ILLSEQ;
        PROC MESSAGE; 
        PROC NAME;
        PROC RCM00; 
        PROC RCM01; 
        PROC RCM02; 
        PROC RCM03; 
        PROC RCM04; 
        PROC RCM05; 
        FUNC XCOD C(10);           # CONVERT OCTAL TO DISPLAY # 
        FUNC YCDZ C(10);
        END 
# 
****  XREF END
# 
  
  
  
      ITEM CMD        U;             # CURRENT COMMAND #
  
      DEF LEMSGUCR   #34#;
      ARRAY EMSGUCR    S(4);
        BEGIN 
        ITEM $DEMSGUCR  C(00,00,34) = 
                 ["UNRECOGNIZED COMMAND RECEIVED, XX."];
        ITEM EMSGUCRCNO C(03,06,02);
        ITEM EMSGUCRZBY U(03,24,36) = [0];       # ZERO BYTE #
        END 
  
      SWITCH RC0X   RC00,            # PROCESS COMMAND 00 (RFT) # 
                    RC01,            # PROCESS COMMAND 01 (RPOS) #
                    RC02,            # PROCESS COMMAND 02 (RNEG) #
                    RC03,            # PROCESS COMMAND 03 (GO) #
                    RC04,            # PROCESS COMMAND 04 (STOP) #
                    RC05;            # PROCESS COMMAND 05 (STOPR) # 
  
  
      SWITCH RC6X   RC60,            # PROCESS COMMAND 60 (ETP) # 
                    RC61,            # PROCESS COMMAND 61 (ETPR) #
                    RC62;            # PROCESS COMMAND 62 (FINI) #
                                               CONTROL EJECT; 
        $BEGIN
      ITEM TEMPC C(10); 
      ARRAY DEBUGM S(6);
        BEGIN 
        ITEM DEBUGM0 C(0,00,10) = ["ACFETCH CO"]; 
        ITEM DEBUGM1 C(1,00,10) = ["MMAND  =  "]; 
        ITEM DEBUGCM C(2,00,02);
        ITEM DEBUGM2 C(2,12,08) = [" "];
        ITEM DEBUGM3 C(3,00,10);
        ITEM DEBUGM4 U(4,00,60) = [0];
        END 
  
      ARRAY [0:63] S(1);           # COMMAND #
        BEGIN 
        ITEM DBCMD  C(00,00,10) = [ 
                    "RFT",        # 0 REQUEST FILE TRANSFER # 
                    "RPOS",       # 1 REPLY POSITIVE #
                    "RNEG",       # 2 REPLY NEGATIVE #
                    "GO",         # 3 ENTER DATA TRANSFER/LINK PHASE #
                    "STOP",       # 4 END DATA TRANSFER/LINK PHASE #
                    "STOPR",      # 5 STOP REPLY #
                    "RLNK",       # 6 REQUEST HOST TO HOST LINKAGE #
                    "RESERVED",   # 7 # 
                    "RESERVED",   # 8 # 
                    "RESERVED",   # 9 # 
                    "RESERVED",   # 10 #
                    "RESERVED",   # 11 #
                    "RESERVED",   # 12 #
                    "RESERVED",   # 13 #
                    "RESERVED",   # 14 #
                    "RESERVED",   # 15 #
                    "RESERVED",   # 16 #
                    "RESERVED",   # 17 #
                    "RESERVED",   # 18 #
                    "RESERVED",   # 19 #
                    "RESERVED",   # 20 #
                    "RESERVED",   # 21 #
                    "RESERVED",   # 22 #
                    "RESERVED",   # 23 #
                    "RESERVED",   # 24 #
                    "RESERVED",   # 25 #
                    "RESERVED",   # 26 #
                    "RESERVED",   # 27 #
                    "RESERVED",   # 28 #
                    "RESERVED",   # 29 #
                    "SS",         # 30 #
                    "MS",         # 31 CHECK MARK DATA #
                    "ES",         # 32 END OF DATA #
                    "RR",         # 33 RESTART REQUEST #
                    "MR",         # 34 CHECKMARK ACKNOWLEDGE #
                    "QR",         # 35 QUIT # 
                    "ER",         # 36 END ACKNOWLEDGE #
                    "SR",         # 37 START OF DATA REPLY #
                    "RESERVED",   # 38 #
                    "RESERVED",   # 39 #
                    "STC",        # 40 START TERMINAL CONNECTION #
                    "ATC",        # 41 ACCEPT TERMINAL CONNECTION # 
                    "RTC",        # 42 REJECT TERMINAL CONNECTION # 
                    "ETC",        # 43 END TERMINAL CONNECTION #
                    "ETCR",       # 44 END TERMINAL CONNECTION REPLY #
                    "RESERVED",   # 45 #
                    "RESERVED",   # 46 #
                    "RESERVED",   # 47 #
                    "RESERVED",   # 48 #
                    "RESERVED",   # 49 #
                    "SDE",        # 50 START DATA EXCHANGE #
                    "SDER",       # 51 START DATA EXCHANGE REPLY #
                    "TDB",        # 52 TERMINAL DATA BLOCK #
                    "TDA",        # 53 TERMINAL DATA BLOCK ACK #
                    "TDN",        # 54 TERMINAL DATA BLOCK NAK #
                    "EDE",        # 55 END DATA EXCHANGE #
                    "EDER",       # 56 END DATA EXCHANGE REPLY #
                    "RDE",        # 57 RESET DATA EXCHANGE #
                    "RDER",       # 58 RESUME DATA EXCHANGE # 
                    "RESERVED",   # 59 #
                    "ETP",        # 60 ENTER TERMINATION PHASE #
                    "ETPR",       # 61 ENTER TERMINATION PHASE REPLY #
                    "FINI",       # 62 COMPLETE TERMINATION PHASE # 
                    "    "];
        END 
        NAME("AREQ");                # DEBUG CODE # 
        $END
  
      CMD = ACFETCH(NTAH,FILECHR);   # GET COMMAND FROM BLOCK # 
        $BEGIN
        DEBUGCM[0] = YCDZ(CMD,2);  # COMMAND #
        DEBUGM3[0] = DBCMD[CMD];   # COMMAND #
        MESSAGE(DEBUGM,3);         # ISSUE DEBUG TRACE #
        $END
  
      FILETIM=0;                   # CLEAR TIME # 
      IF (CMD GQ CM$RFT) AND (CMD LQ CM$STPR)  # COMMANDS 0 - 5 # 
      THEN
        BEGIN 
        GOTO RC0X[CMD];              # PROCESS COMMANDS 00-05 # 
        END  # COMMANDS 0 - 5 # 
  
      ELSE
        BEGIN 
        IF  (CMD GQ CM$ETP) AND (CMD LQ CM$FINI)  # COMMANDS 60 - 62 #
        THEN
          BEGIN 
          GOTO RC6X [CMD-CM$ETP]; 
          END  # COMMANDS 60 - 62 # 
        END  # VALID COMMANDS # 
  
      EMSGUCRCNO=YCDZ(CMD,2);      # INSERT COMMAND NUMBER #
      CONERR(LOC(EMSGUCR),LEMSGUCR);
      RETURN;                        # EXIT # 
  
# 
**    PROCESS COMMANDS 0 - 5. 
# 
  
RC00: 
      RCM00;                         # PROCESS COMMAND 00 # 
      GOTO ERC0;
  
RC01: 
      RCM01;                         # PROCESS COMMAND 01 # 
      GOTO ERC0;
  
RC02: 
      RCM02;                         # PROCESS COMMAND 02 # 
      GOTO ERC0;
  
RC03: 
      RCM03;                         # PROCESS COMMAND 03 # 
      GOTO ERC0;
  
RC04: 
      RCM04;                         # PROCESS COMMAND 04 # 
      GOTO ERC0;
  
RC05: 
      RCM05;                         # PROCESS COMMAND 05 # 
      GOTO ERC0;
  
  
# 
**    PROCESS COMMANDS 60 - 62. 
# 
  
RC60:  # PROCESS COMMAND 60 (ETP) # 
        $BEGIN
        NAME("RCM60/BCM61");         # DEBUG CODE # 
        $END
  
      IF NOT ( (FILECMD EQ 0) 
               OR (FILER0          # RECEIVED RFT # 
                   AND FILES5      # SENT STOPR # 
                   AND (FILE60 EQ 0) ) )
      THEN
        BEGIN 
        ILLSEQ;                      # ILLEGAL COMMAND SEQUENCE # 
        RETURN; 
        END 
      ELSE  # RESPOND TO COMMAND 60 # 
        BEGIN 
        FREENTA;                   # GET NET BUFFER # 
        ACSTORE(NTA$B,CM$ETPR,NTLMAX);  # STORE COMMAND 61 (ETPR) # 
        CMDPUT;                      # SEND BLOCK (ETPR) #
        FILEBNO=CM$ETPR;           # BLOCK NUMBER # 
        FILER60=TRUE;              # 60 (ETP) RECEIVED #
        FILES61=TRUE;              # 61 (ETPR) SENT # 
        END 
      GOTO ERC0;  # END OF CASE # 
  
RC61:  # PROCESS COMMAND 61 (ETPR) #
        $BEGIN
        NAME("RCM61/BCM62");         # DEBUG CODE # 
        $END
  
      IF (FILE61 NE 0)             # IF ETPR SENT OR RECEIVED # 
        OR NOT FILES60             # OR ETP NOT SENT #
      THEN
        BEGIN 
        ILLSEQ;                      # ILLEGAL COMMAND SEQUENCE # 
        RETURN; 
        END 
      ELSE  # RESPOND TO 61 COMMAND # 
        BEGIN 
        FREENTA;                   # GET NET BUFFER # 
        ACSTORE(NTA$B,CM$FINI,NTLMAX);  # STORE COMMAND 62 #
        CMDPUT;                      # SEND BLOCK # 
        FILEBNO=CM$FINI;           # SET BLOCK NUMBER # 
        FILER61=TRUE;              # ETPR RECEIVED #
        FILES62=TRUE;              # FINI SENT #
        END 
      GOTO ERC0;  # END OF COMMAND 61 PROCESS # 
  
RC62:  # PROCESS COMMAND 62 (FINI) #
      IF (FILE62 NE 0)             # IF FINI SENT OR RECEIVED # 
        OR NOT FILES61             # OR ETPR NOT SENT # 
      THEN
        BEGIN 
        ILLSEQ;                      # ILLEGAL COMMAND SEQUENCE # 
        RETURN; 
        END 
  
      ELSE  # RESPOND TO COMMAND 62 # 
        BEGIN 
        FILER62=TRUE;              # FINI RECEIVED #
        END 
  
ERC0:  # END OF CASE #
  
      IF FILEFTS EQ FTS$WNMSG 
      THEN
        BEGIN 
        FILETIM = TIMT; 
        END 
  
      END      # AREQ # 
    TERM
