*DECK KDSTIN
USETEXT NIPDEF
USETEXT DRHDR 
USETEXT AT
USETEXT PT
USETEXT ACB 
USETEXT LLCB
USETEXT NBT 
USETEXT KDIS
USETEXT KINITBF 
USETEXT DISTAIL 
USETEXT KHDRX 
USETEXT PARAMP
USETEXT TNT 
USETEXT KSTTAB
USETEXT FREETAB 
USETEXT INPARUT 
USETEXT SYSTIME 
PRGM KDSTIN;  # PROCESS DYNAMIC STATUS DISPLAY                         #
 STARTIMS;
 #
*1DC  KDSTIN
* 
*        1.PROC NAME     AUTHOR          DATE 
*          KDSTIN        A.BEN-ARTZI     82/01/06 
                         M.GIBIAN        83/12/20 
* 
*        2.FUNCTIONAL DESCRIPTION.
* 
*          INITIATE THE STATUS DISPLAY SCREEN. IF CREATION CALL,
*          ALLOCATE VIEW WINDOW BUFFER AND INITIALIZE VIEW TABLE. 
*          DISPLAY ALL LINES CURRENTLY IN VIEW WINDOW.
* 
*        3.METHOD USED. 
* 
*          IF THIS IS A CREATION CALL THEN
*             SET BLANK FLAG TO TRUE
*             SAVE ORIGINAL BUFFER
*             ALLOCATE VIEW WINDOW BUFFER AND CHAIN INTO PLACE
*             INITIALIZE THE VIEW TABLE BY
*                INITIALIZING THE APPLICATION START LINE
*                SCAN ACB-S, NBTE-S, AND LLCB-S TO COUNT THE NUMBER 
*                   OF LINES FOR EACH TYPE OF DISPLAY LINE.  ASSIGN 
*                   A RELATIVE LINE NUMBER TO EACH ENTRY, AND STORE 
*                   THE MAXIMUM OF EACH TYPE IN THE VIEW TABLE. 
* 
*          RESET THE SLOW UPDATE TIMER
*          IF THE BLANK FLAG IS SET, BLANK THE VIEW WINDOW, SET THE 
*             STATUS TO CREATE, AND CLEAR THE BLANK FLAG. 
*          CHECK ALL ACB-S, NBTE-S, AND LLCB-S AND DISPLAY ALL LINES
*             INDICATED AS BEING DISPLAYED BY THE VIEW TABLE. 
*          IF CREATE IS SET, UPDATE THE MAIN HEADER 
*          SET THE STATUS TO UPDATE 
* 
*          LATER,EVERY ROUTINE,UPDATING A DATA WITCH IS SHOWN ON THE
*          DISPLAY(WHILE ST-DISPLAY IS ON) SHALL BE RESPONSIBLE TO
*          USE IT-S INDEX AND UPDATE IN THE BLOCK TOO.
* 
*        4.ENTRY PARAMETERS.
* 
*          PARAMP1 = 1  -  DO ONLY STATUS-DISPLAY UPDATE
* 
*        5.OUTPUT PARAMETERS. 
* 
*        6.COMDECKS AND TEXTS USED. 
* 
*          NIPDEF   DRHDR    AT     PT   ACB   LLCB 
*          NBT      KDIS     KSTTAB   DISTAIL 
*          KHDRX     KINITBF     PARAMP     TNT 
*          FREETAB     INPARUT     SYSTIME     OSIZE
* 
*        7.ROUTINES CALLED. 
* 
*          MGETS             ALLOCATE BUFFER
*          XTRACE      RECORD PROCESSOR CALLS 
*          KPUT        PUTS VALUES IN BUFFER+CONVERT FROM B TO DISPLAY
*          KDISLN      DISPLAY A SINGLE LINE IN THE VIEW WINDOW 
*          KUPVTAB     UPDATE THE VIEW TABLE
* 
*        8.DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
*          THIS IS AN OVERSIZED PRIMARY OVERLAY CALLED
*          BY XEXEC.
*          W A R N I N G-THIS OVERSIZED PRIMARY OVERLAY CANNOT EXCEED 
*CALL OSIZE 
* 
 #
 STOPIMS; 
# 
           EXTERNAL CALLS 
# 
      XREF
        BEGIN 
        PROC MGETS; 
        PROC KDISLN;
        PROC KPUT;
        PROC KUPVTAB; 
        PROC XTRACE;
        LABEL RJMAIN ;
        END 
# 
        INTERNAL VARIABLES
# 
      ITEM BUF   U=0 ;    # ADDRESS OF VIEW BUFFER                     #
      ITEM KREM   I=0;    # NUMBER OF LINES REMAINING IN VIEW BUFFER   #
#                                                                      #
      ITEM KINDEX I=0;    # COUNTER                                    #
      ITEM KSIZE  I=0;    # TOTAL SIZE OF VIEW BUFFER                  #
      ITEM KN     I=0;    # INDEX INTO DATA BLOCK                      #
#**********************************************************************#
      BEGIN 
          CONTROL IFEQ DEBUG,1; 
          XTRACE("KDSTN");
          CONTROL FI; 
  
#        SET POINTERS AND INDICATE STATUS DISPLAY IS BEING SHOWN       #
  
      KDST[0] = TRUE; 
# 
      CHECK IF ONLY UPDATE IS REQUIRED
# 
      IF KDIS$STAT EQ STM"STM$UPDATE" 
      THEN
        BEGIN 
        BUF = KHDRNP[0] ; # GET VIEW POINTER FROM HEADER BLOCK       #
        GOTO KUPDAT       ; 
        END 
  
      KDBLNK=TRUE;
# 
    SAVE ORIGINAL BUFFER
# 
  
      P<DRHDRWD>=KDBP[0]; 
      BACKPTR[0]=LOC(KORIGBP[0]); 
      NEXTPTR[0]=BACKPTR[0];
      BLKID[0]=DRIDVALUE; 
      KORIGBP[0]=P<DRHDRWD>;
      KORIGFP[0]=P<DRHDRWD>;
      KDORIG[0]=FALSE;
  
#      ALLOCATE AND CHAIN INTO PLACE THE VIEW BUFFER                 #
  
      KSIZE = (KDVWLN[0]*KSTBLK) + BLKHSIZE + KHDRSIZE + 1; 
      MGETS(KSIZE,BUF,TRUE);
  
      P<KINITBF>=0; 
      KDTYPE[BUF+BLKHSIZE] = 0; 
      K7777[BUF+KSIZE-1] = O"7777"; 
      KDSTAIL[BUF+KSIZE-1] = LOC(KDTLNAM)+1;
  
      KDFP[0] = LOC(KHDRBP[0]); # SET KDIS FORWARD ==> KHDRX         #
      KHDRBP[0] = LOC(KDFP[0]); # SET KHDRX BACKWARD ==> KDIS FORWARD#
      KHDRNP[0] = BUF;   # SET HEADER FORWARD POINTER TO VIEW BUFFER #
      P<DRHDRWD> = 0; 
      NEXTPTR[BUF] = LOC(KDFP[0]);   # VIEW NEXT ==> KDIS FORWARD    #
      BACKPTR[BUF] = LOC(KHDRNP[0]); # VIEW BACK ==> KHDRX FORWARD   #
      BLKID  [BUF] = KDISIDVALUE; 
      KHXNEXT[0] = BUF + BLKHSIZE + KHDRSIZE; # KHDRX 7777 CHAIN PTR #
      KDLSTOP[0] = LOC(KHDRX1);  # CHAIN KDIS 7777 CHAIN PTR TO KHDRX#
  
#     INITIALIZE VIEW TABLE                                          #
  
      KDAPPST[0] = 2;  #FIRST DISPLAY STARTS WITH FIRST APPLICATION  #
  
      KDIS$RT = KDST[0] AND KFAST[0]; 
  
      KN=3; 
      FOR KINDEX = 1 STEP 1 UNTIL ATHAN[0] DO 
         BEGIN
         IF ATACBA[KINDEX] NQ 0 
         THEN 
           BEGIN
           P<ACB> = ATACBA[KINDEX]; # WE WILL WRITE A LINE FRM THIS ACB#
           KN = KN+1 ;
           ACBKNDX[0] = KN; # THIS WILL BE ITS INDEX INTO DATA BLOCK   #
           END
         END
      KDAPPMX[0] = KN;
# 
        NOW SEARCH THE SAME WAY ALL NBT ENTRIES 
# 
      KN = 3 ;
      FOR KINDEX = 0 STEP NBTFETNO UNTIL NBTMAXID 
      DO
        BEGIN 
        IF NBTIUF[KINDEX] 
        THEN              # YES, THIS IS A LIVING ENTRY                #
          BEGIN 
          KN = KN + 1 ; 
          NBTKNDX[KINDEX] = KN ;
          END 
        END 
      KDESTMX[0]=KN;
# 
         LAST REPEAT PROCESS FOR LOGICAL LINKS
# 
      KN = 3 ;
      FOR KINDEX = 1 STEP 1 UNTIL TNTBS[0]-1 DO 
        BEGIN 
        IF TNTLLAD[KINDEX] NQ 0 
        THEN
          BEGIN 
          P<LLCB> = TNTLLAD[KINDEX];#THIS IS AN LL WE SHOULD USE LATER #
KL1:  KN = KN + 1 ; 
          IF LLCBHN[0] NQ 0 
          THEN
            LLCBKNDX[0] = KN ; # INDEX INTO K-DISPLAY ST BUFFER # 
          ELSE
            BEGIN              # THIS IS A FAKE INTRA HOST LLK  # 
            KN = KN - 1 ; 
            LLCBKNDX[0] = 0  ;
            END 
          IF LLCBFP[0] NQ 0 
          THEN              # OH, WE HAVE ONE MORE  LINK IN THIS ENTRY #
            BEGIN 
            P<LLCB>=LLCBFP[0]; # SO, GET THIS ONE TWO                  #
            GOTO KL1;          # AND DO TO IT THE SAME THING           #
            END 
          END 
        END 
      KDLGLMX[0]=KN;
# 
    END VIEW BUFFER/STATUS DISPLAY INITIALIZATION 
# 
  
KUPDAT: 
      KSLOWTM[0] = RTSECS[0] ;
  
      KUPVTAB;  # REVISE THE VIEW WINDOW                              # 
  
      IF KDBLNK THEN # IF BLANK IS SET, CLEAR VIEW WINDOW + REDISPLAY # 
         BEGIN
         P<KSTTAB>=BUF+BLKHSIZE+KHDRSIZE; 
         FOR KINDEX = 1 STEP 1 UNTIL KDVWLN[0] DO 
            BEGIN 
            KAPPDTA[KINDEX-1] = " ";
            KAPPEND[KINDEX-1] = 0;
            END 
         KDBLNK=FALSE;
         END
  
# 
                 START LOOKING FOR DATA IN THE AT 
# 
  
# 
    PROCESS APPLICATIONS IF ANY ARE DISPLAYED 
# 
  
      IF (KDAPPST[0] NQ 0) THEN 
         BEGIN
         IF KDAPPST LQ 2 THEN 
            KDISLN(2,0,KST"APP");    # DISPLAY HEADER LINE #
  
# 
  
    CHECK ALL ACB-S TO SEE IF THEY ARE BEING DISPLAYED
# 
  
         FOR KINDEX = 1 STEP 1 UNTIL ATHAN[0] DO
           BEGIN
           P<ACB> = ATACBA[KINDEX]; 
           IF ATACBA[KINDEX] NQ 0  # ACB EXISTS                       # 
             AND ACBKNDX[0] NQ 0 # STATUS DISPLAY LINE EXISTS         # 
             AND ACBKNDX[0] GQ KDAPPST[0]     #GREATER THAN FIRST LIN # 
             AND ACBKNDX[0] LQ KDAPPND[0]     #LESS THAN LAST LINE    # 
           THEN                  # UPDATE APPLICATION STATUS LINE     # 
             KDISLN(ACBKNDX[0],ATACBA[KINDEX],KST"APP");
           END
         END
# 
    PROCESS ANY EST THAT IS DISPLAYED 
# 
      IF KDESTST[0] NQ 0 THEN 
         BEGIN
  
         IF KDESTST[0] LQ 2 AND KDESTND[0] GQ 2 THEN
            KDISLN(2,0,KST"EST"); 
  
# 
                 START LOOKING FOR DATA IN THE EST HEADER 
# 
  
         FOR KINDEX = 0 STEP NBTFETNO UNTIL NBTMAXID
         DO 
           BEGIN
           IF NBTIUF[KINDEX]
             AND NBTKNDX[KINDEX] NQ 0 # STATUS DISPLAY LINE EXISTS  # 
             AND NBTKNDX[KINDEX] GQ KDESTST[0]  #GTR THAN 1ST EST LN# 
             AND NBTKNDX[KINDEX] LQ KDESTND[0]  #LE LAST EST Y LINE # 
           THEN 
             KDISLN(NBTKNDX[KINDEX],KINDEX,KST"EST"); # GO DISPLAY# 
           END
         END
  
# 
    DISPLAY ANY LOGICAL LINK LINES
# 
  
      IF KDLGLST[0] NQ 0 THEN 
         BEGIN
  
         IF KDLGLST[0] LQ 2 AND KDLGLND[0] GQ 2 THEN
            KDISLN(2,0,KST"LLK"); 
  
# 
                 START LOOKING FOR INFO ABOUT LOGICAL LINKS 
# 
  
         FOR KINDEX=1 STEP 1 UNTIL TNTBS[0]-1 DO
           BEGIN
           P<LLCB> = TNTLLAD[KINDEX]; 
KLMORE: 
           IF P<LLCB> NQ 0 THEN # LLCB EXISTS                          #
              BEGIN 
              IF LLCBKNDX[0] NQ 0 # STATUS DISPLAY LINE EXISTS         #
                 AND LLCBKNDX[0] GQ KDLGLST[0] # AFTER/IS FIRST LGL LN #
                 AND LLCBKNDX[0] LQ KDLGLND[0] # BEFORE/IS LAST LGL LN #
              THEN # UPDATE LOGICAL LINK STATUS LINE                  # 
                 KDISLN(LLCBKNDX[0],P<LLCB>,KST"LLK");
# 
             BEFORE WE QUIT,CHECK FOR ANY MORE LL SERVING THE TNT 
# 
              IF LLCBFP[0] NQ 0 
              THEN
                BEGIN 
                P<LLCB> = LLCBFP[0]; # GO GET DATA FROM THIS LLCB TOO # 
                GOTO KLMORE;
                END 
# 
             END LLCB SEARCH
# 
              END 
           END
         END
# 
           UPDATE FIELDS IN MAIN HEADER 
# 
     IF KDIS$STAT EQ STM"STM$CREATE"
     THEN 
       BEGIN
       KPUT(LOC(KHDRXNM),0,KPHXNAP,KDAPPMX[0]-3); 
       KPUT(LOC(KHDRXNM),0,KPHXNIN,INPNIN[1]);
       KPUT(LOC(KHDRXNM),0,KPHXRGL,HRL);
       KPUT(LOC(KHDRXNM),0,KPHXMFL,MAXFL);
# 
          AND UPDATE TIMER FOR STATISTICS 
# 
       KSTATIM[0] = RTSECS[0] ; 
       END
  
     KDIS$STAT=STM"STM$UPDATE"; 
     GOTO RJMAIN ;
  
   END
TERM
