*DECK,CON$END 
USETEXT IP$COM
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT TSB$COM 
USETEXT ABH$COM 
USETEXT ACN$COM 
USETEXT DCB$COM 
USETEXT GLOBALI 
USETEXT SMDEF 
USETEXT SMAPPFC 
USETEXT SMPFC 
USETEXT SM$COM
USETEXT TCB$COM 
USETEXT UCB$COM 
      PROC CON$END; 
      BEGIN # CON$END # 
*IF DEF,IMS 
 #
*1DC  CON$END 
* 
*     1. PROC NAME           AUTHOR              DATE 
         CON$END             SEYUNG OH           FEB 8,1980 
* 
*     2. FUNCTIONAL DESCRIPTION.
* 
*        ENDS CONNECTIONS.
* 
*     3. METHOD USED. 
* 
* 
*        IF A CONSOLE CONNECTION A CON/END/SM IS ISSUED AND CONTROL 
*        IS TRANSFERRED TO FIN$CON WHEN THE CON/END/N SM IS RECEIVED. 
* 
*        IF A BATCH CONNECTION A CON/END/SM IS ISSUED IF THERE WAS
*        A TERMINAL ERROR ON THE DEVICE OR CONTROLLING CONSOLE
*        THEN CONTROL IS TRANSFERRED TO FIN$DEV WHEN THE CON/END/N SM IS
*        RECEIVED.
* 
* 
*     4. ENTRY PARAMETERS. NONE.
* 
*     5. EXIT PARAMETERS.  NONE.
* 
*     6. COMDECKS USED. 
* 
*        RBF$COM
*        TSBMDEFS 
*        TSBMBASE 
*        QCB$COM
*        QAB$COM
*        TCB$COM
*        CON$COM
*        DCB$COM
*        UCB$COM
*        ABH$COM
*        SM$COM 
*        LSTDEF 
*        LST
* 
*     7. ROUTINES CALLED. 
* 
*        NETPUT, LINK, RETTSB 
* 
*     8. DAYFILE MESSAGES. NONE 
* 
 #
*ENDIF
  
      XREF PROC ABORT;
      XREF PROC FREEBUFFER; 
      XREF PROC MESSAGE;
      XREF PROC RETTSB;      # FREE BUFFERS                            #
      XREF PROC NETPUT;      # SENDS DATA OUT TO NETWORK               #
      XREF PROC LINK;        # LINK MODULE TO ACN                      #
      XREF PROC SETACN; 
      XREF PROC CHGSIZE;     # CHANGE SIZE OF THE BUFFER.              #
      XREF PROC CIODONE;     # WAIT UNTIL CIO DONE.                    #
      XREF PROC CONSOLE;     # LINK MESSAGE ON CONSOLE DRIVER.         #
      XREF PROC NETGET;      # GET DATA.                               #
XREF FUNC BUFINFO U;                             # FREEZE BUFFER SPACE #
      XREF FUNC GETBSN U;    # GET BLOCK SEQUENCE NUMBER               #
      XREF FUNC GETBUF U;    # GET BUFFER SPACE.                       #
      XREF LABEL CALLRTN; 
      XREF PROC SYSCALL;     # MAKE CIO REQUESTS.                      #
      XREF PROC EVENT;       # WAIT UNTIL CIO REQUESTS ARE COMPLETE.   #
      DEF SYSDATE # O"1 00 000000" #; 
      DEF SYSHOUR # O"2 00 000000" #; 
      DEF FLENGTH #24#; 
# 
   DSP ABORT REASON CODE
# 
      STATUS  DSPABT  NULL, 
                      VEJERR,    # JOB/USER CARD ERROR #
                      CRERR,     # CARD READER ERROR   #
                      OPREQ,     # ABORTED BY OPERATOR #
                      DSKFUL,    # DISK FULL           #
                      DSKPAR,    # DISK PARITY ERROR   #
                      LAST; 
# 
# 
      ARRAY RBFENDED S (4); 
        ITEM RBFENDEDMSG C (0,0,10) = ["0RBF ENDED"], 
             DATEMSG     C (1,0,10),
             TIMEMSG     C (2,0,10),
             RBFENDEOL   I (3,0,10) = [ZERO]; 
      ARRAY CONENDMSG S(3); 
        ITEM CONEND1 U (0,0,60) = [ZERO], 
             CONEND2 U (1,0,60) = [ZERO], 
             CONEND3 U (2,0,60) = [ZERO]; 
      ARRAY TERMFAILMSG S(3); 
        ITEM
            TFM$DEVDT        C (0,0,3) = ["1XX"], 
            TFM$ORD          C (0,18,1),
            TFM$TEXT         C (0,24,19) =[" - TERMINAL FAILURE"];
      ARRAY ENDPPERR S(4);
        BEGIN 
        ITEM ENDPPMSG   C (0,0,28) = ["CON$END ERROR,BAD PP CALL - "],
             ENDPPWHO   C (2,48,3), 
             ENDPPEOL   U (3,30,30) = [0];
        END 
      ARRAY ALOMSG S(4);
        ITEM ALOMESSAGE C (0,0,30)=[" DUE TO TERMINAL INACTIVITY   "],
             ALOMSGEOL  I (3,0,10)=[ZERO];
  
  
      ITEM I I;              # INDEX VARIABLE                          #
      ITEM NEXT I;           # POINTER VARIABLE                        #
      ITEM QUEUE I;          # CONTROL VARIABLE USED FOR QUEUE-SEARCH  #
#                                                                      #
#     IF RBF NOT NETTED ON TRANSFER CONTROL TO FIN$CON OR FIN$DEV      #
#                                                                      #
      IF NOT NETTEDON 
      THEN
        IF ACN$DEVTYPE [ACN] EQ S"CONSOLE"
        THEN
          LINK (CHAINS"FIN$CON",NOEVENT); 
        ELSE
          LINK (CHAINS"FIN$DEV",NOEVENT); 
      ELSE
        BEGIN # RBF STILL NETTED ON # 
        CONEND1 = 0;
        CONEND2 = 0;
        CONEND3 = 0;
        IF ACN$DEVTYPE [ACN] EQ S"CONSOLE"
        THEN
          BEGIN # END CONSOLE CONNECTION #
#                                                                      #
#         FREE CONSOLE"S CHAINED INPUT BUFFERS                         #
#                                                                      #
          FREEBUFFER (LOC (TCB$INPUT)); 
          FREEBUFFER (LOC (TCB$OUTPUT));
 CON$ACKWAIT: 
          IF TCB$ENDFLAG
          THEN
            BEGIN 
            I = ZERO; 
            P<ABH> = LOC (I); 
            ABH$ABN = GETBSN; 
            IF ABH$ABN EQ ZERO
            THEN
              BEGIN 
              EVENT(CHAINS"BACKGROUND"); # WAIT FOR A WHILE, THEN TRY  #
              GOTO CON$ACKWAIT;          # FOR ANOTHER BSN.            #
              END 
            SYSCALL("TIMP",SYSDATE+LOC(DATEMSG)); 
            SYSCALL("TIMP",SYSHOUR+LOC(TIMEMSG)); 
            ABH$ADR = ACN;
            ABH$ABT = BLOCKTYPE"MSG"; 
            ABH$ACT = ACT"DISPLAYCODE"; 
            ABH$TLC = 40; 
            P<TXT> = LOC ( RBFENDED );
            NETPUT (ABH,TXT); 
            IF TCB$ALOFLAG
            THEN                           # SEND TIMEOUT MESSAGE      #
              BEGIN 
CON$ACKWT2: 
              I = ZERO; 
              P<ABH> = LOC (I); 
              ABH$ABN = GETBSN; 
              IF ABH$ABN EQ ZERO
              THEN
                GOTO CON$ACKWT3;           # DONT WAIT FOR BSN         #
              ABH$ADR = ACN;
              ABH$ABT = BLOCKTYPE"MSG"; 
              ABH$ACT = ACT"DISPLAYCODE"; 
              ABH$TLC = 40; 
              P<TXT> = LOC (ALOMSG);
              NETPUT (ABH,TXT); 
              END 
CON$ACKWT3: 
            EVENT (CHAINS"BACKGROUND");          # WAIT FOR A WHILE    #
            END 
          P<ABH> = LOC(CONEND1);
          P<SM$> = LOC(CONEND2);
          ABH$ADR = 0;
          ABH$ABT = S"SM";
          ABH$ABN = 0;
          ABH$ACT = ACCON;
          ABH$TLC = LCONEN; 
          CONACN = ACN; 
          CONANM = TCB$JOBNAME; 
          P<SM$> = LOC(CONEND2);
          PFCSFC = CONEND;
          NETPUT (ABH,SM$); 
          END   # END CONSOLE CONNECTION #
        ELSE
          BEGIN # END BATCH CONNECTION #
          IF ACN$DEVTYPE [ACN] EQ DEVICETYPE"CARD$READER" 
          THEN
            BEGIN                                # INPUT DEVICES       #
            IF UCB$FILEACT
            THEN
              BEGIN 
              I = BUFINFO (ACN$CB [ACN]);        # FREEZE UCB SPACE    #
              I = UCB$FETFNT;                    # SAVE FNT ORDINAL    #
              UCB$DSP1 = ZERO;                   # CLEAR DSP FET       #
              UCB$DSP2 = ZERO;
              UCB$DSP3 = ZERO;
              UCB$DSP4 = ZERO;
              UCB$FETCB = FALSE;
              UCB$DSPFNT = I;                    # FNT ORDINAL FOR FILE#
              UCB$DSPMNE = "IN";                 # DISPOSE TO INPUT Q  #
              UCB$DSPACC = TRUE;                 # DO ACCOUNTING       #
              UCB$DSPNDM = TRUE;                 # NO DAYFILE MESSAGE  #
              UCB$DSPDC = TRUE;                  # CHANGE DISPOSITION  #
              UCB$DSPTNAME = UCB$TERMNAME;       # TERMINAL NAME       #
              UCB$DSPABT = TRUE;                 # ABORT FILE FLAG     #
              UCB$DSPINP = TRUE;             # QUEUE IF JOB CARD ERROR #
              UCB$DSPMSG = DSPABT"OPREQ"; 
              SYSCALL("DSP", LOC (UCB$DSP0));    # CALL DSP            #
              SYSACT = TRUE;                     # PP ACTIVE           #
              EVENT (LOC (CIODONE));             # WAIT FOR PP         #
              IF UCB$DSPERR NQ ZERO 
                 AND
                 UCB$DSPERR NQ 6                 # NO FILE FOUND       #
              THEN
                BEGIN                            # DSP CALL ERROR      #
                ENDPPWHO = "DSP"; 
                MESSAGE (ENDPPERR,DFLOPT);
                ABORT;
                END 
              TFM$DEVDT = "1CR";                 # SET UP FOR CONSOLE  #
              TFM$ORD = TCB$ORD + O"33";         # MESSAGE             #
              CONSOLE (TERMFAILMSG,NON$CRITICAL,FLENGTH); 
              END                                # INPUT FILE ACTIVE   #
            END                                  # INPUT DEVICES       #
          ELSE
            BEGIN                              # OUTPUT DEVICES      #
            IF ACN$DEVTYPE [ACN] EQ DEVICETYPE"LINE$PRINTER"
            THEN
              BEGIN                            # LINE PRINTER        #
              TFM$DEVDT = "1LP";
              END 
            ELSE
              BEGIN 
              IF ACN$DEVTYPE [ACN] EQ DEVICETYPE"PUNCH" 
              THEN
                BEGIN                          # CARD PUNCH          #
                TFM$DEVDT = "1CP";
                END 
              ELSE
                BEGIN                          # PLOTTER             #
                TFM$DEVDT = "1PL";
                END 
              END 
            TFM$ORD = TCB$ORD + O"33";
            CONSOLE (TERMFAILMSG,NON$CRITICAL,FLENGTH); 
            IF DCB$FILEACT AND DCB$FILER
            THEN
              BEGIN                            # FILE ACTIVE         #
              CHGSIZE (ACN$CB [ACN],DCBSIZE,0); 
              I = BUFINFO (ACN$CB [ACN]); 
              FOR I=2 STEP 1 UNTIL 6 DO 
                BEGIN                          # CLEAN DSP FET       #
                DCB$FET0[I] = ZERO; 
                END 
              DCB$DSPFNT = DCB$FNTORD;         # SET DSP FNT ORDINAL #
              DCB$FETSTAT = ZERO; 
              DCB$DSPNDM = TRUE;               # NO DAYFILE MESSAGE  #
              SYSCALL("DSP",LOC (DCB$FET0));   # CALL DSP            #
              SYSACT = TRUE;                   # PP ACTIVE           #
              EVENT (LOC (CIODONE));           # WAIT FOR PP         #
              IF DCB$DSPERR NQ ZERO 
                 AND
                 DCB$DSPERR NQ 6                 # NO FILE FOUND       #
              THEN
                BEGIN                            # DSP CALL ERROR      #
                ENDPPWHO = "DSP"; 
                MESSAGE (ENDPPERR,DFLOPT);
                ABORT;
                END 
              END                                # FILE ACTIVE         #
            END                                  # OUTPUT DEVICE       #
          P<ABH> = LOC (CONEND1); 
          P<SM$> = LOC (CONEND2); 
          ABH$ABT = S"SM";
          ABH$ACT = ACCON;
          ABH$TLC = LCONEN; 
          SUPACN = ACN; 
          PFCSFC = CONEND;
          NETPUT (ABH,SM$); 
          END                                    # END BATCH CONNECTION#
        END                                      # RBF NETTED ON       #
      GOTO CALLRTN; 
      END   # CON$END # 
      TERM; 
