*DECK PRASM 
USETEXT COMCBEG 
USETEXT COMADEF 
USETEXT COMACBF 
USETEXT COMACBX 
USETEXT COMADFM 
USETEXT COMAFET 
PROC PRASM (HDRAREA, TEXTAREA); 
# TITLE PRASM - PROCESS ASYNCHRONOUS SUPERVISORY MESSAGES.  # 
  
      BEGIN  # PRASM #
  
# 
*     PRASM - PROCESS ASYNCHRONOUS SUPERVISORY MESSAGES.
* 
*     PRASM PROCESSES INTERCEPTED ASYNCHRONOUS SUPERVISORY MESSAGES.
* 
*     PROC PRASM(HDRAREA,TEXTAREA)
* 
*     ENTRY    - HDRAREA - THE MESSAGE-S HEADER WORD. 
*                TEXTAREA   - THE MESSAGE-S TEST AREA.
* 
*     EXIT     - NONE.
* 
*     PROCESS  - IF NOT A NULL MESSAGE, 
*                THEN:  
*                  SET CURFTTIND = FTTINDEX.
*                  SET <FTTENT> = FWA OF CORRESPONDING FTT ENTRY. 
*                  CALL DFTTIND TO DETERMINE NEW FTTINDEX.
*                  CALL DAMSGIN TO DETERMINE WHICH CASE THIS MESSAGE IS.
*                  DEPENDING ON WHICH CASE APPLIES: 
*         CASE (CON/CB/R) OR (FC/BRK/R) 
*           SET FTTERRORD = CONN BROKEN MESSAGE RECEIVED. 
*                      CALL DAYFMSG TO WRITE ERROR MESSAGE. 
*                      CALL XFRCOMP TO COMPLETE FILE TRANSFER.
*                    CASE (CTRL/INFO/R) 
*                      CALL PROTERR TO PROCESS AS PROTOCOL ERROR. 
*                    CASE (ERR/LGL/R) 
*                      CALL PERRLGL TO PROCESS THE ERR/LGL/R MESSAGE. 
*                    CASE (FC/ACK/R)
*                      CALL PRACKM TO PROCESS FC/ACK/R MESSAGE. 
*                    CASE (FC/NAK/R)
*                      CALL PRNAKM TO PROCESS FC/NAK/R MESSAGE. 
*                    CASE (SHUT/INSD/R) 
*                      IF NOT A DISABLE TYPE SHUTDOWN 
*                      THEN:  
*                        SET IDLEDOWN TO TRUE.
*                      ELSE:  
*                        SET APPLICATION STAUS WORD TO IDICATE
*                          THAT SHUTDOWN DISABLE IS IMMINENT. 
*                    CASE (CM/EXIT/N) 
*                      IF NOT WAITING FOR EXIT CONVERT REPLY
*                      THEN 
*                        CALL PROTERR.
*                      ELSE 
*                        CALL ENDXFR TO WRAP UP FILE TRANSFER.
*                    CASE (CM/SEL/A OR CM/SEL/N)
*                      IF NOT WAITING FOR SELECT CONVERT REPLY
*                      THEN 
*                        CALL PROTERR.
*                      ELSE 
*                        CALL PSCMREP TO PROCESS RESPONSE.
*                    CASE (ALL OTHER MESSAGES)
*                      CALL PROTERR TO PROCESS PROTOCOL ERROR.
*                  RESET FTTINDEX = CURFTTIND AND RESET <FTTENT>. 
*                  CALL SETFTTA TO RESTORE FTT POINTERS.
* 
# 
  
*CALL HDRAREA 
*CALL TEXTAREA
  
# 
****  PROC PRASM - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC DAYFMSG;                #  WRITE DAYFILE MESSAGE # 
        FUNC DECCHF     C(10);       # DECIMAL DISPLAY CODE # 
        PROC DFTTIND;                #  DETERMINE FTTINDEX #
        FUNC DAMSGIN I;              # DETERMINE GOTO SWITCH IND #
        PROC ENDXFR;                 # TERMINATE TRANSFER # 
        PROC PSCMREP;                # PROCESS CM SELECT REPLY #
        PROC PERRLGL;                #  PROCESS ERR/LGL/R MESSAGE # 
        PROC PRACKM;                 #  PROCESS FC/ACK/R  MESSAGE # 
        PROC PRNAKM;                 #  PROCESS FC/NAK/R MESSAGE #
        PROC PROTERR;                #  PROCESS PROTOCOL ERROR #
        PROC SETFTTA;                # SET FTT ADDRESSES #
        PROC XFRCOMP;                #  COMPLETE FILE TRANSFER #
        END 
  
# 
****  PROC PRASM - XREF LIST END. 
# 
  
      ITEM AMSG$INDEX S:ASMGS;       # ACCEPTABLE MESSAGE INDEX # 
      ITEM CURFTTINDX I;             # CURRENT FTTINDEX # 
  
# 
*     SWITCH SWASMSG - SWITCH DEPENDING ON AN ASYNC. SUPERVISORY MSG. 
# 
  
      SWITCH SWASMSG:ASMGS
                     PRASM7:CM$EXIT$N,
                     PRASM8:CM$SEL$A, 
                     PRASM8:CM$SEL$N, 
                     PRASM0:CON$CB$R, 
                     PRASM1:CTRL$INF$R, 
                     PRASM1:DC$CICT$R,
                     PRASM2:ERR$LGL$R,
                     PRASM3:FC$ACK$R, 
                     PRASM0:FC$BRK$R, 
                     PRASM5:FC$NAK$R, 
                     PRASM6:SHUT$INS$R, 
                     PRASM1:ALL$OTHERS; 
  
                                               CONTROL EJECT; 
      IF HDR$WORD[0]  NE  0 
      THEN
        BEGIN 
        CURFTTINDX  = FTTINDEX;      # SAVE FTTINDEX #
        AMSG$INDEX = DAMSGIN(TXT$ASMSG[0]);  # DTRMN ACCPTBL MSG INDX # 
        DFTTIND (AMSG$INDEX);        # DETERMINE FTTINDEX # 
        IF  FTTINDEX  GE  MAXFILEXFR
        THEN
          BEGIN 
          AMSG$INDEX = S"ALL$OTHERS"; 
          DFTTIND (AMSG$INDEX);      # RECALCULATE FTTINDEX # 
          END 
  
        SETFTTA;                   # SET FTT ADDRESSES #
  
        GOTO SWASMSG[AMSG$INDEX]; 
  
PRASM0: 
  
# 
*     PROCESS CON/CB/R OR FC/BRK/R MESSAGE. 
# 
  
        IDFM$ACN2B[CON$BROKE] = DECCHF (FTTACN, 4); 
        FTTERRORD = CON$BROKE;
        DAYFMSG(CON$BROKE); 
        IF  FTTACN NE 0 
        THEN
          BEGIN 
          XFRCOMP;                   # COMPLETE THE FILE TRANSFER # 
          END 
  
        GOTO PRASMCONT; 
  
PRASM1: 
  
# 
*     PROCESS  UNACCEPTABLE ASYNCHRONOUS MESSAGES.
# 
  
        PROTERR;                     # REPORT PROTOCOL ERROR #
        GOTO PRASMCONT; 
  
PRASM2: 
  
# 
*     PROCESS ERR/LGL/R MESSAGE.
# 
  
        PERRLGL;                     # PROCESS ERR/LGL/R MESSAGE #
        GOTO PRASMCONT; 
  
PRASM3: 
  
# 
*     PROCESS FC/ACK/R MESSAGE. 
# 
  
        PRACKM;                        # PROCESS FC/ACK/R MESSAGE # 
        GOTO PRASMCONT; 
  
PRASM5: 
  
# 
*       PROCESS  FC/NAK/R  MESSAGE. 
# 
  
        FTTPRESTAT = FTTSTATE;
        FTTSTATE = S"FCNAKRCVD";
        PRNAKM;                      # PROCESS FC/NAK/R  MESSAGE #
        GOTO PRASMCONT; 
  
PRASM6: 
  
# 
*       PROCESS SHUT/INSD/R MESSAGE.
# 
  
        IF  NOT  TXT$DIS$SD[0]
        THEN
          BEGIN 
          IDLEDOWN  = TRUE; 
          END 
  
        ELSE
          BEGIN 
          STATUSWD[0]  =  DISA$RCVED; 
          END 
        GOTO PRASMCONT; 
  
PRASM7: 
  
# 
*       PROCESS CM/EXIT/N MESSAGE.
# 
  
        IF FTTSTATE NE S"WFORECMR"
        THEN
          BEGIN 
          PROTERR;
          END 
  
        ELSE
          BEGIN 
          FTTCMA = FALSE; 
          FTTCMEA = FALSE;
          ENDXFR; 
          END 
  
        GOTO PRASMCONT; 
  
PRASM8: 
  
# 
*       PROCESS CM/SEL/A AND CM/SEL/N MESSAGES. 
# 
  
        IF FTTSTATE NE S"WFORSCMR"
        THEN
          BEGIN 
          PROTERR;
          END 
  
        ELSE
          BEGIN 
          PSCMREP(TEXTAREA);
          END 
  
  
#     GOTO PRASMCONT #
  
PRASMCONT:  
  
        FTTINDEX  =  CURFTTINDX;
        P<FTTENT> = LOC(FTT$WD0[FTTINDEX]);  # RESET FTT ENTRY ADDR # 
        SETFTTA;                   # RESET FTT ADDRESSES #
        END 
  
  
      END    # PRASM #
  
      TERM
