*DECK IDLE
USETEXT COMCBEG 
USETEXT COMRAPL 
USETEXT COMRRHH 
USETEXT COMRDSD 
USETEXT COMREVN 
USETEXT COMRLRA 
USETEXT COMRMEM 
USETEXT COMRNET 
USETEXT COMRNDR 
USETEXT COMRQUE 
PROC IDLE;
# TITLE  IDLE - RHF IDLE PROCESSING.  # 
  
      BEGIN  # IDLE # 
  
# 
**    IDLE - RHF IDLE PROCESSING. 
* 
*     WAIT FOR UCP REQUEST, OPERATOR REQUEST, OR REMOTE MAINFRAME 
*     CONNECTION REQUEST. 
* 
*     PROC IDLE.
* 
*     ENTRY   - RA.SSC - SYSTEM CONTROL POINT COMMUNICATION 
*               DSD$CMDW - DSD L-DISPLAY COMMUNICATION
* 
*     EXIT    - WORK FOR RHF IS AVAILABLE 
*               P<QUEUE> = QUEUE ENTRY TO BE FREED BY ACTIVE. 
* 
*     PROCESS - ISSUE MESSAGE TO B-DISPLAY. 
*               MOVE CONFIGURATION FILE.
*               REDUCE FIELD LENGTH.
*               SET UP TIMER. 
*               WHILE NO WORK FOUND 
*                 IF UCP REQUEST AVAILABLE
*                 THEN
*                   WORK FOUND. 
*                 IF OPERATOR REQUEST AVAILABLE 
*                 THEN
*                   WORK FOUND. 
*                 IF ONE SECOND TIMER UP AND NO WORK FOUND
*                 THEN
*                   INCREMENT COUNT OF SECONDS SPENT IN IDLE. 
*                   AGE APPLICATION NETWAITS DOWN TO ONE SECOND.
*                   IF ONE SECOND LEFT BEFORE A NETWAIT EXPIRES 
*                   THEN
*                     WORK FOUND. 
*                   START NDR.
*                   CALL RECALL.
*                   CHECK FOR WORK. 
*                   IF NO WORK FOUND
*                   THEN
*                     IF NAD EST ON AND PREVIOUSLY ON 
*                       CALL NDR FOR STATUS 
*                     ELSE
*                       IF NAD EST OFF AND PREVIOUSLY ON
*                           OR EST ON AND PREVIOUSLY OFF
*                         TOGGLE NAD EST ON/OFF 
*                         WORK FOUND. 
*                  IF NO NDR EVENT
*                  THEN 
*                    DROP NDR.
*                ELSE 
*                  IF NO WORK FOUND 
*                    PERFORM RECALL.
*              CALL GETFREE TO INCREASE FL AND INITIALIZE FREE QUEUE. 
*              MOVE CONFIGURATION FILE. 
*              IF NDR EVENT 
*              THEN 
*                MOVE NDR QUEUE ENTRY.
*              CLEAR B-DISPLAY MESSAGE. 
*              RETURN.
* 
* 
****  PROC IDLE - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC CALLSYS;                # MAKE RA + 1 CALL # 
        PROC GETFREE;                # GET FREE QUEUE ENTRY # 
        PROC MOVE;                   # MOVE WORDS # 
        PROC NDRRSTR;                # RESTART NDR #
        ITEM FAPLADR I;              # FIRST APPLICATION ADDRESS #
        ITEM LAPLADR I;              # LAST APPLICATION ADDRESS # 
        ITEM NADTBL  I;              # LOCAL NAD TABLE ADDRESS #
        ITEM NDRCOM  I;              # NDR COMMUNICATION ADDRESS #
        ITEM NDTADDR I;              # NETWORK DESCRIPTION TABLE #
        ITEM NUMNADS I;              # NUMBER OF NADS # 
        ITEM RCFLGTH I;              # LENGTH OF RCF FILE # 
        ITEM OVLPFWA I;              # FWA OF PRIMARY OVERLAY # 
        END 
  
        DEF MASKLOWR36  #X"FFFFFFFFF"#;  # MASK LOW ORDER 36 BITS # 
  
  
      ITEM NOWORK     B;             # RHF WORK FLAG #
      ITEM I$RCFFWA   I;             # FWA OF RCF FILE IN IDLE #
      ITEM I          I;             # LOOP VARIABLE #
      ITEM NDREVNT    B = FALSE;     # NDR EVENT FLAG # 
      ITEM OFFSET     I;             # ACTIVE RCF FWA - IDLE RCF FWA #
      ITEM OLDTIME    I;             # SECOND TIMER # 
  
      BASED ARRAY LDRTBL [0:0] S(4);
        BEGIN 
        ITEM LDR$MINFL  I(01,42,18); # LWA + 1 OF OVERLAY # 
        END 
  
      ARRAY I$QUE [0:0] S(QU$LENGTH); 
        BEGIN 
        ITEM I$QUETYP   U(00,36,06) = [QT$STATUS];
        END 
  
      ARRAY MEMCALL [0:0] S(1);      # MEM CALL REQUEST # 
        BEGIN 
        ITEM MEMNAME    C(00,00,03) = ["MEM"];
        ITEM MEMRCL     B(00,19,01) = [TRUE]; 
        ITEM MEMADDR    I(00,42,18);
        END 
  
      ARRAY MEMPARM [0:0] S(1);      # MEM PARAMETER WORD # 
        BEGIN 
        ITEM MEMWD      I(00,00,60) = [0];
        ITEM MEMWORDS   I(00,00,30); # WORDS REQUESTED #
        ITEM MEMCOMPL   B(00,59,01); # MEM COMPLETE # 
        END 
  
      ARRAY MSGCALL [0:0] S(1); 
        BEGIN 
        ITEM MSGNAME    C(00,00,03) = ["MSG"];
        ITEM MSGRCL     B(00,19,01) = [TRUE]; 
        ITEM MSGDEST    U(00,24,12) = [1];  # B-DISPLAY ONLY #
        ITEM MSGPARM    U(00,42,18);
        END 
  
      ARRAY MSGPRMWD [0:0] S(1);
        BEGIN 
        ITEM MSGADR     U(00,00,30);
        ITEM MSGCOMP    B(00,59,01);
        END 
  
      ARRAY MSG$WAIT [0:0] S(3);
        BEGIN 
        ITEM MSGWAIT    C(00,00,27) = [" RHF, WAITING FOR ACTIVITY."];
        ITEM MSGWAITZB  I(02,42,18) = [0];
        END 
  
      ARRAY MSG$BLK  [0:0] S(1);
        BEGIN 
        ITEM MSG$BLKMSG C(00,00,04) = ["    "]; 
        ITEM MSG$BLKZB  I(00,24,36) = [0];
        END 
  
      ARRAY RCLCALL [0:0] S(1); 
        BEGIN 
        ITEM RCLNAME    C(00,00,03) = ["RCL"];
        ITEM RCLTIME    U(00,48,12) = [0];
        END 
  
      ARRAY NDRCALL [0:0] S(1); 
        BEGIN 
        ITEM NDRNAME    C(00,00,03) = ["NDR"];
        ITEM NDRRCL     B(00,19,01) = [FALSE];
        ITEM NDRADDR    I(00,42,18);
        END 
  
      ARRAY [0:0] S(1); 
        BEGIN 
        ITEM TIMECALL   U(00,00,60) = [0];
        ITEM TIMNAME    C(00,00,03) = ["TIM"];
      CONTROL IFEQ OS$NOSBE;
        ITEM TIMCODE    U(00,24,12) = [4];
      CONTROL ENDIF;
      CONTROL IFEQ OS$NOS;
        ITEM TIMCODE    U(00,24,12) = [5];
      CONTROL ENDIF;
        ITEM TIMADDR    I(00,42,18);
        END 
  
CONTROL EJECT;
  
      MSGCOMP = FALSE;
      MSGADR = LOC(MSG$WAIT); 
      MSGPARM = LOC(MSGPRMWD);
      CALLSYS(MSGCALL); 
  
      P<LDRTBL> = OVLPFWA;
      I$RCFFWA = ((LDR$MINFL + 7) / 8) * 8; 
      OFFSET = RCFFWA - I$RCFFWA; 
      RA$FRSTAPL = FAPLADR - OFFSET;
      RA$LASTAPL = LAPLADR - OFFSET;
      RA$NDT = NDTADDR - OFFSET;
      MOVE(RCFLGTH, RCFFWA, I$RCFFWA);
      MEMCOMPL = FALSE; 
      MEMWORDS = I$RCFFWA + RCFLGTH + O"10";
      MEMADDR = LOC(MEMPARM); 
      CALLSYS(MEMCALL); 
  
      TIMADDR = LOC(TIMER); 
      CALLSYS(TIMECALL);
      TIMER = TIMER LAN MASKLOWR36; 
    CONTROL IFEQ OS$NOS;
      TIMER = TIMER * 4;
    CONTROL ENDIF;
  
      OLDTIME = TIMER - 2**12;
      P<NDR$COMMUN> = NDRCOM; 
      P<EVNT$ENTRY> = P<NDR$COMMUN> + 3;
      NOWORK = TRUE;
  
      ASLONGAS NOWORK 
      DO
        BEGIN 
        IF RA$SSC$LK
          OR DSD$CMDW NE 0
          OR RA$IDLE
        THEN
          BEGIN 
          NOWORK = FALSE; 
          END 
  
        CALLSYS(TIMECALL);
        TIMER = TIMER LAN MASKLOWR36; 
      CONTROL IFEQ OS$NOS;
        TIMER = TIMER * 4;
      CONTROL ENDIF;
  
        IF (TIMER - OLDTIME) / 2**12  GE  1 
          AND NOWORK
        THEN
          BEGIN 
          OLDTIME = TIMER;
          IDLESEC = IDLESEC + 1;
          IF IDLESEC GE IDLEWAIT - 1
          THEN
            BEGIN 
            NOWORK = FALSE; 
            END 
  
          RHHRCL = TRUE;
          RHHFUNCTN = RH$INIT;
          RHHPARMAD = LOC(RHH$PARAM); 
          RHH$PARAM = 0;
          RHH$NUMNAD = NUMNADS; 
          RHH$NADADR = NADTBL - OFFSET; 
          RHH$COMPLT = FALSE; 
          CALLSYS(RHHCALL); 
          RHHRCL = FALSE; 
  
          NDR$ACTIVE = TRUE;
          NDR$RQCHG = FALSE;
          NDR$FUNC = NF$START;
          NDRADDR = P<NDR$COMMUN> / O"10";
          CALLSYS(NDRCALL); 
          ACTIVENDRS = ACTIVENDRS + 1;
  
          ASLONGAS NDR$FUNCOM EQ 0
          DO
            BEGIN 
            CALLSYS(RCLCALL); 
            END 
  
          IF RA$SSC$LK
            OR DSD$CMDW NE 0
            OR RA$IDLE
          THEN
            BEGIN 
            NOWORK = FALSE; 
            END 
  
          ELSE
            BEGIN 
            P<NAD$ENTRY> = NADTBL - OFFSET; 
            SLOWFOR I = 1 STEP 1 WHILE I LE NUMNADS AND NOWORK
            DO
              BEGIN                  # LOOP THRU LOCAL NAD TABLE #
              IF NOT (NAD$ESTOFF OR NAD$PREVOF) 
              THEN
                BEGIN 
                NDR$FUNC = NF$STATUS; 
                NDR$QADDR = LOC(I$QUE); 
                NDR$CHAN = NAD$CHAN;
                NDR$ESTORD = NAD$ESTORD;
                NDR$NADORD = NAD$ORD; 
                NDRRSTR;
                ASLONGAS NDR$FUNCOM EQ 0
                DO
                  BEGIN 
                  CALLSYS(RCLCALL); 
                  END 
  
                IF RA$SSC$LK
                  OR DSD$CMDW NE 0
                  OR RA$IDLE
                THEN
                  BEGIN 
                  NOWORK = FALSE; 
                  END 
  
                IF NDR$CTLMSG 
                  OR NDR$CONREQ 
                  OR NDR$ESTOFF 
                  OR (NDR$RTNCOD NE 0)
                  OR (EVNT$WD NE 0) 
                THEN
                  BEGIN 
                  NOWORK = FALSE; 
                  NDREVNT = TRUE; 
                  NAD$NDRASG = 1; 
                  ASLONGAS (P<EVNT$ENTRY> NE
                           (P<NDR$COMMUN>+(NDR$LENGTH-1)))
                    AND (EVNT$WD NE 0)
                  DO
                    BEGIN 
                    EVNT$APPL = EVNT$APPL + OFFSET;  # RESET APPL PTR # 
                    P<EVNT$ENTRY> = P<EVNT$ENTRY> + 1;
                    END 
  
                  END 
  
                END 
  
              ELSE
                BEGIN 
                IF (NOT NAD$ESTOFF AND NAD$PREVOF)
                  OR (NAD$ESTOFF AND NOT NAD$PREVOF)
                THEN
                  BEGIN 
                  NAD$ESTOFF = NOT NAD$ESTOFF;
                  NOWORK = FALSE; 
                  END 
  
                ELSE
                  BEGIN 
                  P<NST$ENTRY> = LOC(NAD$NSTWD0);  # NAD STATUS ENTRY # 
                  IF RA$SSC$LK
                    OR DSD$CMDW NE 0
                    OR RA$IDLE
                    OR ( NAD$CWSBL
                         AND NST$AUTOL
                         AND (   (NST$STATE EQ NS$AVAIL)
                              OR (NST$STATE EQ NS$DISAB) ) )
                  THEN
                    BEGIN 
                    NOWORK = FALSE; 
                    END 
                  END 
                END 
  
              P<NAD$ENTRY> = P<NAD$ENTRY> + NAD$LENGTH; 
              END 
  
            END 
  
          IF NOT NDREVNT
          THEN
            BEGIN 
            NDR$FUNC = NF$DROP; 
            NDRRSTR;
            ASLONGAS NDR$FUNCOM EQ 0
            DO
              BEGIN 
              CALLSYS(RCLCALL); 
              END 
  
            NDR$ACTIVE = FALSE; 
            NDRRSTR;
            ACTIVENDRS = ACTIVENDRS - 1;
            END 
  
          END 
  
        ELSE
          BEGIN 
          IF NOWORK 
          THEN
            BEGIN 
            CALLSYS(RCLCALL); 
            END 
  
          END 
  
        END 
  
      MSGCOMP = FALSE;
      MSGADR = LOC(MSG$BLK);
      MSGPARM = LOC(MSGPRMWD);
      CALLSYS(MSGCALL); 
  
      RA$FRSTAPL = FAPLADR; 
      RA$LASTAPL = LAPLADR; 
      RA$NDT = NDTADDR; 
      FIELDLEN = INITIALFL; 
      FREEQ = 0;
      GETFREE;                     # INCREASE FL, INITIALIZE FREE # 
      MOVE(RCFLGTH, I$RCFFWA, RCFFWA);
      IF NDREVNT
      THEN
        BEGIN 
        MOVE (QU$LENGTH , LOC(I$QUE), LOC(QU$ADDRESS) );
        NDR$QADDR = P<QU$ADDRESS>;
        P<QU$ADDRESS> = O"400000";
        END 
  
      END  # IDLE # 
  
      TERM
