*DECK UPDKDS
USETEXT IP$COM
USETEXT MISC$ 
USETEXT TCH$COM 
USETEXT TSB$COM 
USETEXT ACN$COM 
USETEXT DCB$COM 
USETEXT TCB$COM 
USETEXT UCB$COM 
USETEXT CON$PAR 
      PROC UPDKDS;
      BEGIN   # UPDKDS #
*IF DEF,IMS 
 #
*1DC  UPDKDS
* 
*     1. PROC NAME             AUTHOR               DATE
*        UPDKDS                G. A. VALENCIA       07 JANUARY 1980 
* 
*     2. FUNCTION DESCRIPTION.
*             UPDKDS UPDATES THE K-DISPLAY AREA WITH INFORMATION
*        ABOUT ALL OF THE NETWORK TERMINALS CURRENTLY CONNECTED TO
*        RBF.  FOR EACH RBF STATION, THE CONSOLE NAME, TERMINAL CLASS,
*        USER NUMBER, ETC. IS DISPLAYED FOLLOWED BY A LIST OF ALL 
*        PASSIVE DEVICES AND THEIR CONNECTION STATES.  THE TOTAL
*        NUMBER OF CONSOLES AND PASSIVE DEVICES IS ALSO DISPLAYED.
*             SINCE THE K-DISPLAY CAN ONLY SHOW 32 LINES AT A TIME, 
*        THE K-DISPLAY INPUT "K.+" IS USED TO PAGE THROUGH THE LIST OF
*        ACTIVE STATIONS MAINTAINED BY UPDKDS.  UPDKDS IS CALLED EVERY
*        TIME THE MAIN LOOP IN SCH EXECUTES.  SINCE RBF ROLLS OUT WHEN
*        THERE IS NOTHING TO DO, THERE IS A SLIGHT DELAY IN BETWEEN 
*        UPDATES OF THE K-DISPLAY.
* 
*     3. METHOD USED. 
*             THE ACN$TABLE IS SCANNED FOR ACTIVE CONSOLES AND A
*        QUEUE OF STATIONS TO DISPLAY IS BUILT (DISQUEUE).  THE QUEUE 
*        IS SORTED BY TERMINAL NAME (DISPLAY CODE, LEFT JUSTIFIED)
*        FOR LACK OF A MORE ORDERLY METHOD.  FIRSTCN, THE TERMINAL
*        NAME AT THE TOP OF THE LAST K-DISPLAY IS CHANGED WHEN A "K.+"
*        IS INPUT TO DSD.  IF THE END OF THE QUEUE IS ON THE K-DISPLAY, 
*        THE NEXT TERMIAL NAME TO DISPLAY (NEXTCON) WILL BE THE ONE 
*        AT THE BEGINNING OF THE QUEUE. 
* 
*     4. ENTRY PARAMETERS.
* 
*        RBFKINP - K-DISPLAY OPERATOR INPUT AREA, UPDATED BY DSD. 
* 
*        KDISP   - DSD COMPLETE BIT, SET AFTER DSD SCANS DISPLAY AREA.
* 
*        FIRSTCN - TERMINAL NAME OF 1ST STATION TO DISPLAY.  IT MAY OR
*                  MAY NOT BE IN THE NEXT DISQUEUE TO BE BUILT AND IT 
*                  IS CHANGED TO NEXTCON IF K.+ IS INPUT TO DSD.
* 
*        FIRSTIQ - TERMINAL NAME OF 1ST STATION IN THE DISQUEUE THAT
*                  WAS BUILT LAST TIME UPDKDS EXECUTED.  THIS MUST BE 
*                  KNOWN IF FIRSTCN IS CHANGED TO NEXTCON, NEXTCON IS 
*                  NOT THE SAME AS FIRSTIQ, SO DISPLAY THE END OF THE 
*                  NEXT DISQUEUE BUILT (DONT WRAP AROUND TO THE START 
*                  OF DISQUEUE).
* 
*        FIRSTPG - TRUE ONLY WHEN FIRSTCN=FIRSTIQ AND K.+ IS INPUT TO 
*                  TO DSD (IE. ALLOW WRAP AROUND TO OCCUR). 
* 
*        NEXTCON - TERMINAL NAME OF NEXT CONSOLE TO DISPLAY IN DISQUEUE.
*                  NEXTCON=FIRSTIQ ONLY WHEN END OF DISPLAY MESSAGE 
*                  APPEARS AT THE BOTTOM OF THE K-DISPLAY.
* 
*     5. EXIT PARAMETERS. 
* 
*        KDISP   - DSD COMPLETE BIT, CLEAR BEFORE RETURNING.
* 
*     6. SYMPLTEXTS USED. 
* 
*        CYBRDEF
*        MISC$
*        DCB$COM
*        TCB$COM
*        TSB$COM
*        UCB$COM
* 
*     7. ROUTINES USED. 
* 
*        FIRSTC  - LOCAL FUNCTION TO SEARCH DISQUEUE FOR FIRSTCN. 
*                  INDEX INTO DISQUEUE IS RETURNED. 
* 
*        CHECKEF - LOCAL PROCEDURE TO CHECK TCB$ERRORS IN THE BASED 
*                  ARRAY TCB$DEVICE AND DISPLAY A MESSAGE.
* 
*        KDISPLY - LOCAL PROC THAT IS PASSED AN ACN$TABLE INDEX OF
*                  A CONSOLE AND TRANDFERS ALL RELEVANT INFORMATION 
*                  FROM THE TCB, TCB$DEVICE, DCB AND UCB TO THE K-
*                  DISPLAY. 
* 
*        SORTDQ  - LOCAL PROC USED TO BUILD AND SORT DISQUEUE ENTRIES 
*                  AS ACTIVE ACN$TABLE ENTRIES ARE FOUND BY THE MAIN
*                  PROCEDURE. 
* 
*        XCDD    - MACREL INTERFACE TO NOS COMMON DECK COMCCDD
*                  (CONVERT AN INTEGER TO DECIMAL DISPLAY CODE).
* 
*        XCOD    - MACREL INTERFACE TO NOS COMMON DECK COMCCOD
*                  (CONVERT AN INTEGER TO OCTAL DISPLAY CODE).
* 
*        YSFN    - EXTERNAL FUNCTION WHICH INTERFACES TO NOS COMMON 
*                  DECK COMCSFN (SIMILAR TO MACREL ROUTINE XSFN, SPACE
*                  FILL A 7 CHARACTER NOS NAME).
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
*ENDIF
  
      DEF   KD545LTH   #32#;         # NBR OF LINES IN K-DISPLAY (545) #
      DEF   KD721LTH   #14#;         # NBR OF LINES IN K-DISPLAY (721) #
  
# 
      THE FOLLOWING ITEMS ARE ALL DEFINED IN RBFKDS, THE REASON BEING 
      EITHER THEIR DEFINITION IN COMPASS IS EASIER OR THEY NEED TO BE 
      REMEMBERED BETWEEN OVERLAY LOADS. 
# 
      XREF ITEM BLANKLN C(50);  # A BLANK LINE (ZERO BYTE TERMINATOR)  #
      XREF ITEM ENDMSG  C(30);  # END  OF DISPLAY. (ZERO BYTE TERM.)   #
      XREF ITEM FIRSTCN C(07);  # NAME OF FIRST CONSOLE TO DISPLAY     #
      XREF ITEM FIRSTIQ C(07);  # NAME OF 1ST CONSOLE IN LAST DISQUEUE #
      XREF ITEM FIRSTPG B    ;  # DISPLAY 1ST IN DISQUEUE ONLY FLAG    #
      XREF ITEM MORMSG  C(30);  # MORE LINES FOLLOW. (ZERO BYTE TERM.) #
      XREF ITEM NEXTCON C(07);  # NAME OF NEXT CONSOLE NOT ON DISPLAY  #
  
      XREF FUNC XCDD C(10);         # INTEGER TO DECIMAL DISPLAY CODE  #
      XREF FUNC XCOD C(10);         # INTEGER TO OCTAL DISPLAY CODE    #
      XREF FUNC YSFN C(10);         # SPACE FILL ZERO BYTES IN A NAME  #
  
      XREF ARRAY RBFKDCC[0:0] S(2); # K-DISPLAY HEADER AREA            #
        BEGIN 
        ITEM KWORDCC   C(00,00,10); 
        ITEM KSTATIONS C(00,00,03); # NO. OF STATIONS IN DISPLAY CODE  #
        ITEM KWORDDD   C(01,00,10); 
        ITEM KDEVICES  C(01,30,03); # NO. OF DEVICES IN DISPLAY CODE   #
        END 
  
  
      XREF ARRAY RBFKD1[1:KD545LTH] S(6); 
        BEGIN                  # K-DISPLAY AREA IN RBF RESIDENT        #
        ITEM KDEND   C(00,00,30);   # DISPLAY END MESSAGE FIELD        #
        ITEM TERNAME C(00,00,07);   # TERMINAL (CONSOL) NAME           #
        ITEM DTYPE   C(00,42,03);   # DEVICE TYPE                      #
        ITEM KDBLANK C(01,00,50);   # USED TO BLANK OPTIONAL FIELDS    #
        ITEM DEVORD  C(01,00,01);   # PASSIVE DEVICE ORDINAL           #
        ITEM DSTATE  C(01,24,05);   # PASSIVE DEVICE CONNECT STATE     #
        ITEM TCLASS  C(01,00,10);   # TERMINAL CLASS OF CONSOLE        #
        ITEM KFIELD2 C(02,12,07);   # USER OF FILE NAME FIELD          #
        ITEM KFIELD2J C(02,12,04);         # JOB SEQUENCE NUMBER       #
        ITEM KFIELD2B C(02,36,03);         # 3 TRAILING BLANKS         #
        ITEM KFIELD3 C(03,12,07);   # FAMILY OR FILESIZE FIELD         #
        ITEM KERRORS C(04,00,10);   # ERROR MESSAGE FIELD              #
        ITEM KFCCODE U(05,30,12);   # FORMS CODE FIELD                 #
        END 
  
      XREF ARRAY RBFKDS [0:0] S(1); # K-DISPLAY CONTROL WORD           #
        BEGIN 
        ITEM KSIZE B(00,10,01);# K-DISPLAY CHARACTER SIZE              #
        ITEM KFORM B(00,11,01);# K-DISPLAY LINE FORMAT                 #
        ITEM KDISP B(00,59,01);# DISPLAY COMPLETE FLAG (SET BY DSD)    #
        END 
  
      XREF ITEM RBFKINP C(1);  # FIRST CHARACTER OF K-DISPLAY INPUT    #
  
      ARRAY DISQUEUE [1:STATIONS] S(1);# QUEUE OF STATIONS TO DISPLAY  #
        BEGIN 
        ITEM QWORD   C(00,00,10); # USED TO MOVE QUEUE ENTRIES         #
        ITEM QWORDI  I(00,00,60); # USED TO CLEAR QUEUE ENTRIES        #
        ITEM QTERNAM C(00,00,07); # TERMINAL NAME OF CONSOLE           #
        ITEM QACNINX I(00,42,12); # ACN$TABLE INDEX FOR CONSOLE        #
        ITEM QNUMDEV I(00,54,06); # NO. OF PASSIVE DEVICES AT STATION  #
        END 
  
      ARRAY DISTYPE [0:DEVICETYPE"PLOTTER"] S(1); 
        BEGIN                  # TERMINAL TYPES IN DISPLAY CODE        #
        ITEM DEVTYPE C(00,00,03) = [
                                    " CO",   # CONSOLE                 #
                                    " CR",   # CARD READER             #
                                    " LP",   # LINE PRINTER            #
                                    " CP",   # CARD PUNCH              #
                                    " PL"    # PLOTTER                 #
                                   ]; 
        END 
  
      ARRAY DISSTATE [0:CONNECTSTATE"END$CONNECT"] S(1);
        BEGIN                  # CONNECTION STATES IN DISPLAY CODE     #
        ITEM CONSTATE C(00,00,05) = [ 
                                    " NXST",  # NON-EXISTENT           #
                                    " PREC",  # DEVICE PRE-CONNECTED   #
                                    " CONN",  # DEVICE CONNECTED       #
                                    "     ",  # ACTIVE, SEE ACTV$STATE #
                                    " IDLE",  # IDLE DOWN IN PROGRESS  #
                                    " ENDC",  # END CONNECTION         #
                                    ];
        END 
  
      ARRAY ACTV$STATE [0:17] S(1); 
        BEGIN                  # UPLINE AND DOWNLINE ACTIVE STATES     #
        ITEM STATE$DCM C(00,00,05) = [
                                    "     ", " GO  ", " GO  ", " GO  ", 
                                    " GO  ", " STOP", " STOP", " STOP", 
                                    " STOP", " STOP", " SKIP", " SKIP", 
                                    " ABRT", " ABRT", " ABRT", " RETN", 
                                    " RETN", " RETN", 
                                     ]; 
        ITEM STATE$UCM C(00,30,05) = [
                                    "     ", " GO  ", " GO  ", " GO  ", 
                                    " STOP", " STOP", " STOP", " ABRT", 
                                    " ABRT",
                                     ]; 
        END 
  
      ARRAY DISTERM [0:TERMINALCLAS"$3270"] S(1); 
        BEGIN                  # ARCHETYPE TERM CLASES IN DISPLAY CODE #
        ITEM TERCLASS C(00,00,10) = [ 
                                  " . TC=0  .", # NONE FOR TC=0        #
                                  " . M33   .", # TELETYPE M-33/5/7/8  #
                                  " .713/75X.", # CDC 713/751/752/756  #
                                  " . 721   .", # CDC 721              #
                                  " . 2741  .", # IBM 2741             #
                                  " . M40   .", # TELETYPE MODEL 40    #
                                  " . H2000 .", # HAZELTINE 2000       #
                                  " . X364  .", # ANSI X3.64 TC        #
                                  " . T40XX .", # TEKTRONIX 40XX       #
                                  " .HASPOST.", # HASP POST-PRINT      #
                                  " . 200UT .", # CDC 200 USER TERM    #
                                  " . 714-30.", # CDC 714-30           #
                                  " . 711   .", # CDC 711-10           #
                                  " . 714-10.", # CDC 714-10/20        #
                                  " .HASPPRE.", # HASP PRE-PRINT       #
                                  " . 73X   .", # CDC 731/732/734      #
                                  " . 2780  .", # IBM 2780             #
                                  " . 3780  .", # IBM 3780             #
                                  " . 3270  .", # IBM 3270             #
                                    ];
        END 
  
      ARRAY ERRORTXT [1:10] S(1); 
        BEGIN                  # ERROR MESSAGES FOR K-DISPLAY          #
                               # TRIVIAL ERRORS HAVE NO MESSAGE        #
        ITEM ERRMSG C(00,00,10) = [ 
                                   "          ",   # DOWNLN DATA LIMIT #
                                   "          ",   # BAD DOWNLINE DATA #
                                   "          ",   #                   #
                                   "          ",   # ACCOUNT CARD ERROR#
                                   "          ",   # JOB CARD ERROR    #
                                   " DISK FULL",   # TRACK LIMIT       #
                                   "DISK ERROR",   # CIO (DISK) ERROR  #
                                   "QUEUE FULL",   # INPUT QUEUE FULL  #
                                   "          ",   # CARD SLIP ERROR   #
                                   " NOT READY",   # DEVICE NOT READY  #
                                   "FLAG ERROR"    # ERROR IN TCB$ERROR#
                                  ];
        END 
  
      ITEM I;                  # INDUCTION VARIABLE                    #
      ITEM ACTVCONS;           # TOTAL NUMBER OF ACTIVE CONSOLES       #
      ITEM DEVICES;            # TOTAL NUMBER OF PASSIVE DEVICES       #
      ITEM KLINE;              # POINTS TO NEXT LINE IN K-DISPLAY      #
      ITEM XCONVERT C(10);     # USED TO EXTRACT STRINGS RETURNED BY   #
                               # MACREL ROUTINES XCDD, XCOD.           #
      ITEM KDLENGTH U;         # RESOLVED NUMBER OF LINES IN K-DISPLAY #
      CONTROL EJECT;
      PROC SORTDQ(ACNIND,(QEND)); # NOTE - QEND IS PASSED BY VALUE     #
      BEGIN  # SORTDQ # 
      ITEM ACNIND I;           # INDEX OF ACTIVE CONCOLE IN ACN$TABLE  #
      ITEM QEND   I;           # POINTS TO LAST DISQUEUE ENTRY         #
      ITEM I,J;                # LOCAL INDUCTION VARIABLES             #
# 
      UPDATE ACTIVE CONSOLE AND DEVICE COUNTERS 
# 
      P<TCB> = ADDRESS[ACN$CB[ACNIND]]; 
      ACTVCONS = ACTVCONS + 1; # POINTS TO LAST DISQUEUE ENTRY + 1     #
      DEVICES = DEVICES + TCB$NDEVICE;
# 
      DETERMINE WHERE CONSOLE SHOULD GO IN DISPLAY QUEUE
# 
      FOR I=1 STEP 1 UNTIL QEND DO
        BEGIN                  # MOVE QUEUE ENTRIES TO INSERT CONSOLE  #
        IF TCB$TERMNAME LS QWORD[I] 
        THEN                   # NEW ENTRY IS INSERTED INTO THE QUEUE  #
          BEGIN 
          FOR J=QEND STEP -1 UNTIL I DO 
            BEGIN              # MOVE ALL GREATER ENTRIES UP 1 WORD    #
            QWORD[J+1] = QWORD[J];
            END 
          QACNINX[I] = ACNIND; # INSERT NEW CONSOLE ENTRIES HERE       #
          QTERNAM[I] = TCB$TERMNAME;
          QNUMDEV[I] = TCB$NDEVICE; 
          RETURN; 
          END                  # NEW ENTRY IS INSERTED INTO THE QUEUE  #
        END 
# 
      MOVING ENTRIES NOT NECESARY, APPEND CONSOLE TO DISQUEUE 
# 
      QACNINX[ACTVCONS] = ACNIND; 
      QTERNAM[ACTVCONS] = TCB$TERMNAME; 
      QNUMDEV[ACTVCONS] = TCB$NDEVICE;
      RETURN; 
      END   # SORTDQ #
  
      CONTROL EJECT;
      PROC CHECKEF;            # FIND THE MOST SIGNIFICANT ERROR FLAG  #
      BEGIN                    # THAT IS SET AND DISPLAY THE MESSAGE.  #
  
      ITEM TEMP;               # TEMPORARY VARIABLE                    #
      ITEM KOUNT;              # BIT POSITION OF THE FLAG THAT IS SET  #
  
      IF TCB$ERRORS LQ O"10"
      THEN
        BEGIN 
        RETURN;                # NO MESSAGES ON TRIVIAL ERROR FLAGS    #
        END 
      ELSE
        BEGIN                  # ASSUME ONE BIT IN TCB$ERROR IS SET    #
        TEMP = TCB$ERRORS;
        FOR KOUNT=1 STEP 1 UNTIL 10 DO    # TCB$ERRORS IS 10 BITS LONG #
          BEGIN 
          TEMP = TEMP/2;       # ARITHMETIC RIGHT SHIFT                #
          IF TEMP EQ 0         # IF NO MORE FLAGS ARE SET THEN         #
          THEN                 # DISPLAY THE MESSAGE.                  #
            BEGIN 
            KERRORS[KLINE] = ERRMSG[KOUNT]; 
            RETURN; 
            END 
          END 
        END                    # ASSUME ONE BIT IN TCB$ERROR IS SET    #
  
      KERRORS[KLINE] = ERRMSG[10]; # TCB$ERROR IS BIGGER THAN 10 BITS  #
      END   # CHECKEF # 
      CONTROL EJECT;
      PROC KDISPLY(ACNTODIS);  # ADD A STATION TO THE K-DISPLAY        #
      BEGIN 
      ITEM ACNTODIS I;         # ACN ENTRY OF CONSOLE TO BE DISPLAYED  #
      ITEM I;                  # INDUCTION VARIABLE                    #
      P<TCB> = ADDRESS [ACN$CB[ACNTODIS]];
      TERNAME[KLINE] = TCB$TERMNAME;
      DTYPE  [KLINE] = DEVTYPE[TCB$DT]; 
      KDBLANK[KLINE] = BLANKLN;# BLANK OUT OPTIONAL FIELDS             #
      TCLASS [KLINE] = TERCLASS[TCB$TC];
      KFIELD2[KLINE] = YSFN(TCB$USERNUM); 
      KFIELD3[KLINE] = YSFN(TCB$FAMNAME); 
      KLINE = KLINE + 1;
      P<TCB$DEVICE> = P<TCB> + TCB$SIZE - TCB$DEVSIZE;
# 
      CONSOLE IS DISPLAYED, NOW DO ALL PASSIVE DEVICES
# 
      FOR I=1 STEP 1 UNTIL TCB$NDEVICE DO 
        BEGIN                  # DISPLAY A SINGLE PASSIVE DEVICE.      #
        P<TCB$DEVICE> = P<TCB$DEVICE> + TCB$DEVSIZE;
        TERNAME[KLINE] = " "; 
        DTYPE  [KLINE] = DEVTYPE[TCB$DEVDT];
        KDBLANK[KLINE] = BLANKLN; # BLANK OUT OPTIONAL FIELDS          #
        XCONVERT = XCOD(TCB$ORD); 
        DEVORD [KLINE] = C<9,1>XCONVERT;
        IF ACN$STATE[TCB$DEVACN] NQ CONNECTSTATE"ACTIVE"
        THEN
          BEGIN                # NOT ACTIVE, GET STATE FROM ACN$STATE  #
          DSTATE[KLINE] = CONSTATE[ACN$STATE[TCB$DEVACN]];
          END 
        ELSE
          BEGIN                # DEVICE ACTIVE GET STATE FROM ACN$MODE #
          IF TCB$DEVDT EQ DEVICETYPE"CARD$READER" 
          THEN
            BEGIN              # UPLINE DEVICE TO K-DISPLAY            #
            DSTATE[KLINE] = STATE$UCM[ACN$MODE[TCB$DEVACN]];
            P<UCB> = ADDRESS [ACN$CB [ TCB$DEVACN]];
            IF  UCB$FILEACT 
            THEN               # JOB IS ACTIVE ON CARDREADER           #
              BEGIN 
              KFIELD2J[KLINE] = UCB$FETJSN ;
              KFIELD2B[KLINE] = "   ";
              END 
            END                # UPLINE DEVICE TO K-DISPLAY            #
          ELSE
            BEGIN              # DOWNLINE DEVICE TO K-DISPLAY          #
            DSTATE[KLINE] = STATE$DCM[ACN$MODE[TCB$DEVACN]];
            P<DCB> = ADDRESS [ACN$CB [ TCB$DEVACN]];
            IF DCB$FILEACT
            THEN
              BEGIN            # FILE ACTIVE ON DOWNLINE DEVICE        #
              KFIELD2J[KLINE] = DCB$FETJSN ;
              KFIELD2B[KLINE] = "   " ; 
              XCONVERT = XCDD(DCB$EOIPRU);
              KFIELD3[KLINE] = C<3,7>XCONVERT;
              END              # FILE ACTIVE ON DOWNLINE DEVICE        #
            IF TCB$FORMS NQ 0 
            THEN
              BEGIN 
              KFCCODE[KLINE] = TCB$FORMS; 
              END 
            END                # DOWNLINE DEVICE TO K-DISPLAY          #
          END                  # DEVICE ACTIVE GET STATE FROM ACN$MODE #
  
        CHECKEF;               # CHECK TCB$ERRORS AND DISPLAY MESSAGE  #
        KLINE = KLINE + 1;
        END                    # DISPLAY A SINGLE PASSIVE DEVICE.      #
      RETURN; 
      END 
      CONTROL EJECT;
      FUNC FIRSTC I;           # FIND 1ST ENTRY IN DISQUEUE TO DISPLAY #
      BEGIN   # FIRSTC #
      ITEM K;                  # INDUCTION VARIABLE                    #
  
      IF NOT FIRSTPG           # LAST PAGE OF K-DISPLAY WAS NOT THE    #
      THEN                     # BEGINNING OF THE DISQUEUE, SO FREEZE  #
        BEGIN                  # FIRSTCN AND LOOK FOR IT               #
        FOR K=1 STEP 1 UNTIL ACTVCONS DO
          BEGIN                # SEARCH FOR FIRSTCN                    #
          IF FIRSTCN LQ QTERNAM[K]
          THEN                 # FIRSTCN IS FOUND IN DISQUEUE          #
            BEGIN 
            FIRSTC = K;        # RETURN THE INDEX INTO DISQUEUE        #
            RETURN; 
            END 
          END                  # SEARCH FOR FIRSTCN                    #
        END                    # FIRSTCN FROZEN, NOT FIRST PAGE        #
  
      FIRSTCN = QTERNAM[1];    # FIRSTCN NOT FOUND, INITIALIZE AND     #
      FIRSTC = 1;              # RETURN INDEX TO START OF DISQUEUE     #
      RETURN; 
      END     # FIRSTC #
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#     MAIN PROCEDURE OF UPDKDS                                         #
#                                                                      #
#**********************************************************************#
  
      IF CONTYPE EQ 0                # GET SYSTEM CONSOLE TYPE,        #
         THEN KDLENGTH = KD545LTH;   # SET K-DISPLAY LENGTH TO 545...  #
         ELSE KDLENGTH = KD721LTH;   # ...OR 721.                      #
      IF RBFKINP EQ "+"        # CHECK K-DISPLAY INPUT                 #
      THEN
        BEGIN 
        RBFKINP = " ";         # CLEAR OLD INPUT                       #
        FIRSTCN = NEXTCON;     # GET NAME OF NEXT TO DISPLAY           #
        IF FIRSTCN EQ FIRSTIQ  # WAS NEXT STATION 1ST IN LAST DISQUEUE?#
        THEN
          BEGIN 
          FIRSTPG = TRUE;      # NEXT DISPLAY IS 1ST PAGE OF DISQUEUE  #
          END 
        ELSE
          BEGIN 
          FIRSTPG = FALSE;     # NEXT DISPLAY IS NOT 1ST PAGE          #
          END 
        END 
  
      ACTVCONS = 0;            # INITIALIZE NUMBER OF ACTIVE CONSOLES  #
      DEVICES = 0;             # INITIALIZE NUMBER OF PASSIVE DEVICES  #
  
      FOR I=1 STEP 1 UNTIL STATIONS DO
        BEGIN 
        QWORDI[I] = 0;         # CLEAR OUT DISPLAY QUEUE               #
        END 
  
      FOR I=1 STEP 1 UNTIL (2*STATIONS + TOTDEV) DO 
        BEGIN                  # GET ALL ACTIVE CONSOLES INTO DISQUEUE #
        IF (ACN$STATE[I] GR CONNECTSTATE"NON$EXISTENT") AND 
           (ACN$DEVTYPE[I] EQ DEVICETYPE"CONSOLE")
        THEN
          BEGIN 
          SORTDQ(I,ACTVCONS);  # PLACE ACTIVE CONSOLE ENTRY IN QUEUE   #
          END 
        END                    # GET ALL ACTIVE CONSOLES INTO DISQUEUE #
      FIRSTIQ = QTERNAM[1];    # SAVE NAME OF 1ST STATION IN DISQUEUE  #
# 
      UPDATE DEVICE AND TERMINAL COUNTS IN K-DISPLAY
# 
      XCONVERT     = XCDD(ACTVCONS);
      KSTATIONS[0] = C<7,3>XCONVERT;
      XCONVERT     = XCDD(DEVICES) ;
      KDEVICES[0]  = C<7,3>XCONVERT;
# 
      DISPLAY REMOTE BATCH STATIONS UNTIL K-DISPLAY IS FULL 
# 
      KLINE = 1;               # K-DISPLAY EMPTY, START AT FIRST LINE  #
      FOR I=FIRSTC STEP 1 UNTIL ACTVCONS DO 
        BEGIN                  # DISPLAY AS MANY STATIONS AS POSSIBLE  #
        IF (KLINE + QNUMDEV[I]) LQ KDLENGTH 
        THEN                   # ROOM AVAILABLE FOR NEXT STATION       #
          BEGIN 
          KDISPLY(QACNINX[I]); # DISPLAY CONSOLE AND ALL BATCH DEVICES #
          END 
        ELSE                   # NO ROOM FOR NEXT STATION, END DISPLAY #
          BEGIN 
          NEXTCON        = QTERNAM[I];
          KDEND [KLINE] = MORMSG; 
          KDISP = FALSE;       # CLEAR DSD COMPLETE BIT                #
          RETURN; 
          END 
        END                    # DISPLAY AS MANY STATIONS AS POSSIBLE  #
  
      NEXTCON        = QTERNAM[1];
      KDEND [KLINE] = ENDMSG; 
      KDISP = FALSE;           # CLEAR DSD COMPLETE BIT                #
      RETURN; 
      END   # UPDKDS #
      TERM; 
