*DECK,ACKED 
USETEXT CYBRDEF 
USETEXT IP$COM
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT ACN$COM 
USETEXT DCB$COM 
USETEXT GLOBALI 
USETEXT TCB$COM 
USETEXT UCB$COM 
      PROC ACKED; 
      BEGIN # ACKED # 
*IF DEF,IMS 
 #
*1DC  ACKED 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        ACKED               SEYUNG OH           NOV 15,1979
* 
*     2. FUNCTIONAL DESCRIPTION.
*        ACKED IS AN EVENT PROCESSING MODULE USED BY UCM AND DCM TO 
*        DETERMINE IF THE IS SOMETHING TO DO. IF SO, ACKED WILL 
*        LINE TO THE MODULE IN ACN$CHAIN OF THE ACN BEING PROCESSED 
*        ONCE REMOVED FROM THE EVENT CHAIN. IF THERE IS NOTHING TO DO 
*        THEN THE ACN WILL REMAIN ON THE EVENT CHAIN AND CHECKED BY 
*        ACKED THE NEXT TIME THROUGH THE MAIN LOOP. 
* 
*     3. METHOD USED. 
*        IF THE ACN BEING PROCESSED IS A CARD READER CONNECTION 
*        THEN IF THERE IS ANY INPUT TO PROCESS, OR IF THE ACN IS ANY
*        OUTPUT DEVICE WHICH HAS GONE NOT READY, OR IF ANY BATCH DEVICE 
*        HAS BEEN ENDED, RESET, HAD A DATA BLOCK ACKED, BECOME BUSY 
*        AND IN ONE OF THE GO STATES OR IDLE SHUTDOWN ISSUED THEN 
*        THE ACN IS REMOVED FROM THE EVENT CHAIN AND LINKED TO THE
*        MODULE SPECIFIED IN THE ACN$MOD ENTRY FOR THE ACN. IF NONE 
*        OF THE ABOVE CONDITIONS EXIT THEN ACKED SIMPLY DOES NOTHING
*        BEFORE RETURNING.
* 
*     4. ENTRY PARAMETERS.
*        ACN
*        TCB$DEVICE ENTRY OF ACN
*        ACN$TABLE ENTRY OF ACN 
*        IDLESHUTDOWN FLAG
*        UCB IF A CARD READER ACN 
* 
*     5. EXIT PARAMETERS. NONE. 
* 
*     6. COMDECKS CALLED. 
*        RBF$COM
*        DCB$COM
*        TCB$COM
*        UCB$COM
* 
*     7. ROUTINES USED. 
*        REMOVE, LINK 
*        DIFFER 
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
*ENDIF
  
      XREF PROC LINK;        # LINK ACN TO MODULE                      #
      XREF PROC REMOVE;      # REMOCE ACN FORM A CHAIN                 #
      XDEF FUNC INPTYPE U;   # FIND CONSOLE INPUT TYPE             #
      XDEF FUNC DINPTYPE U;  # FIND DCM INPUT TYPE                     #
      XREF FUNC DIFFER U; 
      XDEF FUNC UINPTYPE U;  # FIND UCM INPUT TYPE                     #
      XREF ITEM NEWTIM I; 
      XREF ITEM OLDTIM I; 
# 
      LOCAL VARIABLES 
# 
      ITEM ALLSTOPPED B;                         # BATCH DEV.NOT ACTIVE#
      ITEM INPUTDEV B;                           # INPUT DEVICE EXIST # 
      ITEM OUTPUTDEV B;                          # OUTPUT DEVICE EXIST #
      ITEM THINGSTODO B;                         #SOME THING TO DO FLAG#
      ITEM I I; 
      DEF SET #3#;                               # BINARY 011          #
  
      FUNC INPTYPE U; 
      BEGIN # INPUT TYPE #
*IF DEF,IMS 
 #
*1DC  INPTYPE 
* 
*     1. FUNC NAME           AUTHOR              DATE 
*        INPTYPE             SEYUNG OH           NOV 2,1979 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        RETURNS INPUT TYPE FOR THE CONSOLE STATE TABLE 
* 
* 
* 
*     3. METHOD USED
*        INPTYPE SCANS TERMINAL CONTROL BLOCK AND LOOKING FOR SOMETHING 
*        TO DO
* 
*     4. ENTRY PARAMETERS.
*        ACN                ACN OF CONSOLE CONNECTION BEING CHECKED 
*        TCB                BASED ARRAY ADDRESS HAS BEEN SET
*        TCB$DEVICE         BASED ARRAY ADDRESS HAS BEEN SET
* 
*     5. EXIT PARAMETERS. 
*        INPTYPE - INPUT TYPE FOR THE CONSOLE STATE TABLE 
* 
*     6. COMDECKS USED. 
*        RBF$COM
*        TCB$COM
* 
*     7. ROUTINES CALLED. 
*        DIFFER 
* 
*     8. DAYFILE MESSAGE. 
*        NON
* 
 #
# 
      LOCAL VARIABLES 
# 
      ITEM BATCHWORK B;      # FLAG TO INDICATE IF BATCH WORK TO DO # 
      ITEM INDEX;            # FOR LOOP INDUCTION VARIABLE #
# 
************************************************************************
# 
*ENDIF
      INPTYPE = 0;
      IF TCB$INPTYPE EQ ZERO
      THEN                   # NO INPUT TO PROCESS #
        BEGIN 
        IF TCB$OUTPUT NQ 0   # OUTPUT TO SEND TO CONSOLE #
          AND NOT TCB$STPFLAG  # CONSOLE OUTPUT NOT STOPPED BY NPU #
          AND NOT TCB$WAITACK  # NOT AT DOWNLINE NETWORK BLOCK LIMIT #
        THEN
          BEGIN 
          INPTYPE = CONINPUT"OUTPUTX";  # SEND INTERACTIVE OUTPUT # 
          END 
        ELSE
          BEGIN 
          IF TCB$READY       # WANT TO SEND READY TO CONSOLE #
            AND ACN$MODE[ACN] EQ CONSOLESTATE"CON$IDLE"  # BATCH MODE # 
          THEN
            BEGIN 
            INPTYPE = CONINPUT"READYX";  # SEND READY # 
            END 
          ELSE
            BEGIN            # CHECK FOR UNFINISHED BATCH ACTIVITY #
            BATCHWORK = FALSE;
            INPUTDEV = FALSE; 
            OUTPUTDEV = FALSE;
            FOR INDEX=1 STEP 1 UNTIL TCB$NDEVICE
            DO               # SCAN ALL BATCH DEVICES # 
              BEGIN 
              IF ACN$DEVTYPE[TCB$DEVACN[INDEX]] EQ S"CARD$READER" 
              THEN           # INPUT DEVICE EXISTS #
                BEGIN 
                INPUTDEV = TRUE;
                END 
              ELSE           # OUTPUT DEVICE EXISTS # 
                BEGIN 
                OUTPUTDEV = TRUE; 
                END 
              IF TCB$CMDTY[INDEX] NQ 0  # BATCH ACTIVITY TO DO #
              THEN
                BEGIN 
                BATCHWORK = TRUE; 
                END 
              END 
            IF NOT INPUTDEV AND TCB$NDEVICE NQ 0
            THEN             # NO INPUT DEVICE EXIST #
              BEGIN          # DO NOT CHECK FOR INPUT DEVICE INTERRUPT #
              TCB$CRINTR = TRUE;
              END 
            IF NOT OUTPUTDEV AND TCB$NDEVICE NQ 0 
            THEN             # NO OUTPUT DEVICE EXIST # 
              BEGIN          # DO NOT CHECK FOR OUTPUT DEVICE INTERRUPT#
              TCB$LPINTR = TRUE;
              END 
            IF BATCHWORK
              AND ACN$MODE[ACN] EQ CONSOLESTATE"CON$ACTIVE" 
            THEN
              BEGIN          # CHANGE CONSOLE STATE TO BATCH MODE # 
              INPTYPE = CONINPUT"BATCHCMDX";
              END 
            ELSE
              BEGIN 
              IF NOT BATCHWORK  # NO BATCH ACTIVITY TO DO              #
                AND (TCB$CITBUF NQ ZERO  # CONSOLE INPUT TO PROCESS    #
                  OR (TCB$INPUT NQ ZERO  # CONSOLE INPUT TO CONVERT    #
                    AND ACN$MODE[ACN] GQ CONSOLESTATE"CON$ACTIVE")) 
              THEN           # CONSOLE COMMAND TO PROCESS # 
                BEGIN 
                INPTYPE = CONINPUT"INPUTX"; 
                END 
              ELSE
                BEGIN 
                IF ACN$MODE[ACN] LQ CONSOLESTATE"CON$ACTIVE"
                  AND TCB$INTERRPT EQ SET 
                THEN         # ALL BATCH ACTIVITY INTERRUPTED # 
                  BEGIN 
                  INPTYPE = CONINPUT"INTERRUPTX"; 
                  END 
                ELSE
                  BEGIN 
                  IF DIFFER(TCB$TIME,CLOCK) GQ RESUMETIME 
                    AND ACN$MODE[ACN] EQ CONSOLESTATE"CON$ACTIVE" 
                  THEN       # TIME TO RESUME BATCH ACTIVITY #
                    BEGIN 
                    INPTYPE = CONINPUT"RESUMEX";
                    END 
                  ELSE
                    BEGIN 
                    IF TCB$REFRESH  # DISPLAY TO BE REFRESHED # 
                      AND ACN$MODE[ACN] GQ CONSOLESTATE"CON$ACTIVE" 
                      AND DIFFER(TCB$REF,CLOCK) GQ REFRESHTIME
                      AND NOT TCB$WAITACK 
                    THEN     # TIME TO REFRESH DISPLAY #
                      BEGIN 
                      INPTYPE = CONINPUT"REFRESHX"; 
                      END 
                    END 
                  END 
                END 
              END 
            END 
          END 
        END 
      ELSE
        BEGIN 
        INPTYPE = TCB$INPTYPE;
        END 
      RETURN; 
      END # INPUT TYPE #
# 
      DINPTYPE
# 
      FUNC DINPTYPE U;
      BEGIN                                      # DCM INPUT TYPE      #
*IF DEF,IMS 
 #
*1DC  DINPTYPE
* 
*     1. FUNC NAME           AUTHOR              DATE 
*        DINPTYPE            SEYUNG OH           DEC 14,1979
* 
*     2. FUNCTIONAL DESCRIPTION.
*        RETURNS INPUT TYPE FOR DCM 
* 
*     3. DINPTYPE SCANS DOWN LINE CONTROL BLOCK AND TERMINAL DEVICE 
*        CONTROL BLOCK FOR SOMETHING TO DO. 
*        ELEMENT CHECKED,DCB$INPTYPE
*                        TCB$ENDCON 
*                        TCB$CMDTY
*                        TCB$RESUME 
*                        DCB$TIME 
* 
*     4. EXIT PARAMETERS. 
*        DINPTYPE - INPUT TYPE FOR THE DCM STATE TABLE
* 
*     5. ENTRY PARAMETERS. NON. 
* 
*     6. COMDECKS USED. 
* 
*     7. ROUTINE CALLED.
*        DIFFER 
* 
*     8. DAYFILE MESSAGE. NON.
* 
 #
# 
      LOCAL VARIABLES 
# 
# 
      ARRAY TO GENERATE MASK FOR EXT DIVERT FLAGS IN TCB. 
  
      INDEX INTO ARRAY WITH DEVICETYPE VALUE TO FIND MASK FOR 
      APPROPRIATE DEVICE. 
# 
      ARRAY DIVMK [0:4] S(1); 
        BEGIN 
        ITEM DIVMASK U( 0, 0, 6) = [0,0,1,2,4]; 
        END 
# 
 ****************************************************************** 
# 
*ENDIF
       DINPTYPE = ZERO; 
      IF DCB$INPTYPE EQ ZERO
      THEN
        BEGIN                                    #                     #
        IF TCB$ENDCON 
        THEN
          BEGIN 
          DINPTYPE =     DCMINPUT"ENDCONDCM"; 
          END 
        ELSE
          IF TCB$CMDTY NQ ZERO
             AND
             ACN$MODE [ACN$CTLR [ACN]] NQ CONSOLESTATE"CON$ACTIVE"
             AND
             ACN$MODE [ACN] LQ DCMSTATE"DCM$STOP" 
             AND
             (NOT TCB$LPINTR OR TCB$BATCH)
          THEN
            BEGIN 
            DINPTYPE = TCB$CMDTY; 
            END 
          ELSE
            BEGIN 
            IF TCB$BATCH
               AND
               OLDTIM EQ NEWTIM 
               AND
               ACN$MODE [ACN] EQ DCMSTATE"DCM$IDLE" 
               AND
               TCB$DIVFLAGS LAN DIVMASK[TCB$DEVDT] EQ 0 
            THEN
              BEGIN 
              DINPTYPE = DCMINPUT"RESUMEDCM"; 
              END 
            END 
          END 
      ELSE
        BEGIN 
        DINPTYPE = DCB$INPTYPE; 
        END 
      IF IDLESHUTDOWN                            #IDLE DOWN IN PROGRESS#
         AND
         (ACN$MODE [ACN] EQ DCMSTATE"DCM$IDLE"
          OR
         ACN$MODE [ACN] EQ DCMSTATE"DCM$STOP")
      THEN
        BEGIN 
        ACN$STATE [ACN] = CONNECTSTATE"IDLE$DOWN";
        ACN$MODE [ACN] = DCMSTATE"DCM$STOP";
        END 
      RETURN; 
      END 
  
# 
      UINPTYPE
# 
      FUNC UINPTYPE U;
      BEGIN                                      # UCM INPUT TYPE      #
*IF DEF,IMS 
 #
*1DC  UINPTYPE
* 
*     1. FUNC NAME           AUTHOR              DATE 
*        UINPTYPE            SEYUNG OH           JAN 15,1980
* 
*     2. FUNCTIONAL DESCRIPTION.
*        RETURNS INPUT TYPE FOR UCM 
*     3. DINPTYPE SCANS DOWN LINE CONTROL BLOCK AND TERMINAL DEVICE 
*        CONTROL BLOCK FOR SOMETHING TO DO. 
*        ELEMENT CHECKED,UCB$INPTYPE
*                        TCB$ENDCON 
*                        TCB$CMDTY
* 
* 
* 
*     4. EXIT PARAMETERS. 
*        UINPTYPE - INPUT TYPE FOR THE UCM STATE TABLE
* 
*     5. ENTRY PARAMETERS. NONE.
* 
*     6. COMDECKS USED. NONE. 
* 
*     7. ROUTINE CALLED. NONE.
* 
* 
*     8. DAYFILE MESSAGE. NONE. 
* 
 #
*ENDIF
      UINPTYPE = ZERO;
      IF IDLESHUTDOWN 
         AND
        (ACN$MODE [ACN] EQ UCMSTATE"UCM$IDLE" 
         OR 
         ACN$MODE [ACN] EQ UCMSTATE"UCM$WTID")
      THEN
        BEGIN 
        UINPTYPE = UCMINPUT"IDLEDOWNUCM"; 
        RETURN; 
        END 
        IF IDLESHUTDOWN 
           AND
           ACN$MODE [ACN] EQ UCMSTATE"UCM$STOP" 
        THEN
          BEGIN 
          ACN$STATE [ACN] = CONNECTSTATE"IDLE$DOWN";
          END 
      IF UCB$INPTYPE EQ ZERO
      THEN
        BEGIN 
        IF TCB$ENDCON 
        THEN
          BEGIN                                  # END BATCH ACTIVITIES#
          UINPTYPE = UCMINPUT"ENDCONUCM"; 
          END                                    # IMMEDIATLY          #
        ELSE
          BEGIN 
          IF TCB$CMDTY NQ ZERO
             AND
             ACN$MODE [ACN$CTLR [ACN]] NQ CONSOLESTATE"CON$ACTIVE"
             AND
             (NOT TCB$CRINTR OR TCB$BATCH)
          THEN
            BEGIN                                # GET CONSOLE COMMAND #
            UINPTYPE = TCB$CMDTY; 
            END 
          END 
        END 
      ELSE
        BEGIN                                    # GET SUPERVISORY MSG #
        UINPTYPE = UCB$INPTYPE;                  # OR INTERNAL CMD     #
        END 
      RETURN; 
      END 
# 
************************************************************************
*     A C K E D 
************************************************************************
# 
  
      THINGSTODO = FALSE; 
      IF ACN$DEVTYPE [ACN] EQ DEVICETYPE"CONSOLE" 
      THEN
        BEGIN                                    # CONSOLE CONNECTION  #
        IF IDLESHUTDOWN 
        THEN
          BEGIN                                  # IDLE SHUT DOWN      #
          ALLSTOPPED = TRUE;
          IF TCB$NDEVICE NQ 0 
          THEN
            BEGIN 
            FOR I=1 STEP 1 UNTIL TCB$NDEVICE DO 
              BEGIN 
              ALLSTOPPED = ACN$STATE [TCB$DEVACN [I]] GQ S"IDLE$DOWN" 
                           AND ALLSTOPPED;
              END 
            END 
          IF ALLSTOPPED 
          THEN
            BEGIN 
            THINGSTODO = TRUE;
            ACN$CHAIN [ACN] = CHAINS"CON$END";   # END CONSOLE CONNETN #
            ACN$STATE [ACN] = CONNECTSTATE"END$CONNECT";
            END 
          END                                    # IDLE SHUT DOWN      #
        ELSE
          BEGIN                                  # NOT IDLE DOWN       #
          IF INPTYPE NQ ZERO                     # SOMETHING TO DO     #
          THEN
            BEGIN 
            THINGSTODO = TRUE;
            END 
          END                                    # NOT IDLE DOWN       #
        END 
      ELSE
        IF ACN$DEVTYPE [ACN] EQ DEVICETYPE"CARD$READER" 
        THEN
          BEGIN                                  # CARD READER CONNECT-#
                                                 #ION                  #
          IF UINPTYPE NQ ZERO                    # SOMETHING TO DO     #
          THEN
            BEGIN 
            THINGSTODO = TRUE;
            END 
          END 
        ELSE
          BEGIN                                  # OUTPUT DEVICE CONNEC#
                                                 #TION                 #
          IF DINPTYPE NQ ZERO                    # SOMETHING TO DO     #
          THEN
            BEGIN 
            THINGSTODO = TRUE;
            END 
          END 
      IF THINGSTODO 
      THEN
        BEGIN                                    # REMOVE ACN FROM THE #
        REMOVE (CHAINS"EVENT");                  # EVENT CHAIN AND LINK#
        LINK (ACN$CHAIN [ACN],NOEVENT);          # BACK TO CALLED MODUL#
        END                                      #E CHAIN              #
      RETURN; 
      END  # ACKED #
      TERM; 
