*DECK MAJPTR
USETEXT NIPDEF
USETEXT ACB 
USETEXT ACKHEAD 
USETEXT ACNB
USETEXT ACNT
USETEXT AT
USETEXT DEQCOM
USETEXT DISTAIL 
USETEXT DUMPFLG 
USETEXT DRHDR 
USETEXT FLIST 
USETEXT FREETAB 
USETEXT KDIS
USETEXT KHDRX 
USETEXT KINITBF 
USETEXT KSTTAB
USETEXT LLCB
USETEXT NBT 
USETEXT NCNB
USETEXT NCNT
USETEXT PCNB
USETEXT PRUBUFF 
USETEXT PT
USETEXT TNT 
USETEXT MSGIDX
 PROC MAJPTR;                # ADJUST BUFFER POINTERS AFTER MEMORY MOVE#
  
 STARTIMS;
 #
*1DC  MAJPTR
*     1. PROC NAME           AUTHOR              DATE 
*        MAJPTR              P.C.TAM             80/01/17 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR ADJUSTING THE POINTERS 
*        POINT TO BUFFERS JUST MOVED BY GARBAGE COLLECTION ROUTINE
*        MGBGCLT. 
* 
*     3. METHOD USED. 
*          START FROM THE FIRST BUFFER IN THE BLOCK JUST MOVED. 
*          JUMP TO THE CORRESPONDING MODULES TO ADJUST POINTERS BASED ON
*            BUFFER ID. 
*          CALL PROCEDURE MCHKPTR TO CHECK WHETHER THE BUFFER WHICH 
*            CONTAINS THE POINTERS HAS ALSO BEEN MOVED. IF SO, MODIFY 
*            THE BUFFER ADDRESS BEFORE RESETTING THE POINTERS.
* 
*     4. ENTRY PARAMETERS.   NONE 
* 
*     5. EXIT PARAMETERS.    NONE 
* 
*     6. SYMPL TEXTS USED.
*        ACB       ACNB      ACNT      AT       ACKHEAD 
*        NCNB      NCNT      PBT       PCNB     PIT      TNT
*        FLIST     FREETAB     LLCB     NBT 
*        PT        NIPDEF     DISTAIL 
*        DUMPFLG     KDIS     KHDRX     KINITBF 
*        KSTTAB     MSGIDX     OSIZE     DRHDR
* 
*     7. ROUTINES CALLED. 
*          ABORT             ABORT NIP WITH MESSAGE LOGGED
*          MCHKPTR           CHECK MCHG IN MOVED RANGE OR NOT 
*          OMSG              ISSUE DAYFILE MESSAGE
*          MDRPTR            UPDATE DATA RING POINTERS
*          XTRACE            RECORD CALL
* 
*     8. DAYFILE MESSAGES.
*          MAJPTR FOUND BAD BLK ID
*          HIT GARBAGE IN KDIS BUF
* 
*        W A R N I N G - THE TOTAL SIZE OF 4 GARBAGE COLLECTION 
*                        ROUTINES (MAJPTR, MCHKPTR, AND MGBGCLT)
*                        WITH THE DELAY OPTION TURNED ON
*                        CAN NOT EXCEED THE PRIMARY AND SECONDARY 
*CALL OSIZE 
* 
*        THIS PROCEDURE IS CALLED BY MGBGCLT. 
* 
 #
 STOPIMS; 
# 
 PARAMETERS 
# 
#                  INPUT PARAMETERS                                    #
                             # NONE                                    #
#                  OUTPUT PARAMETERS                                   #
                             # NONE                                    #
# 
 EXTERNAL VARIABLES 
# 
 XREF BEGIN 
      PROC ABORT;            # ABORT NIP WITH LOG MESSAGES             #
      PROC MCHKPTR;          # CHECK POINTER IN MOVED RANGE OR NOT     #
      PROC MDRPTR;           # UPDATE DATA RING                        #
      PROC OMSG;             # DAYFILE MESSAGE                         #
      PROC RDUMP;            # DUMP NIP FL                             #
      PROC XTRACE;           # RECORD CALL                             #
      END 
# 
 LOCAL VARIABLES
# 
      ITEM MEND,             # LWA+1 OF BLOCK BEEN MOVED TO            #
           MCUROLD,          # NEXT BUFFER POINTER OF OLD BLOCK        #
           I,                # TEMP VARIABLE                           #
           MPTR,             # TEMP VARIABLE                           #
           MPTR2,            # TEMP VARIABLE                           #
           MPTR3,            # TEMP VARIABLE                           #
           MPTR4;            # TEMP VARIABLE                           #
      ITEM STYPE;            # TYPE OF STATUS BUFFER                   #
      BASED ARRAY ADDRWORD S(1) ; 
        BEGIN 
        ITEM ADDRESSB       U(0,12,24) ;
        ITEM ADDRESSF       U(0,42,18) ;
        END 
  
      CONTROL IFEQ DEBUG,1; 
#     DAYFILE MSG TO ISSUE IF BLK ID UNKNOWN                           #
  
      ARRAY BADID P(3); 
        BEGIN 
        ITEM BADMSG C(0,0,23)=["MAJPTR FOUND BAD BLK ID"];
        ITEM BADZRO I(2,18,42)=[0]; 
        END 
      CONTROL FI; 
      BASED ARRAY STPTRX [1:1] P(1);
        ITEM STPTR     U(00,00,18); 
  
  
  
#           LIST FOR SWITCHING TO DIFFERENT LABELS
              ACCORDING TO THE BUFFER ID                               #
      LABEL MPRU ;
  
        SWITCH BUFID
              MERR,          # ID = 0, INVALID BUFFER TYPE             #
              MAT,           # ID = 1, APPLICATION TABLE               #
              MACNT,         # ID = 2, APPLICATION CONNECTION TABLE    #
              MACK,          # ID = 3, ACKNOWLEDGE QUEUE ENTRY         #
              MFLIST,        # ID = 4, FUNCTION LIST                   #
              MACB,          # ID = 5, APPLICATION CONTROL TABLE       #
              MACNB,         # ID = 6, APPLICATION CONNECTION BLOCK    #
              MMSG,          # ID = 7, MESSAGE BUFFER                  #
              MTNT,          # ID = 8, LOGICAL LINK TABLE              #
              MLLCB,         # ID = 9, LOGICAL LINK CONTROL BLOCK      #
              MNCNT,         # ID = 10, NETWORK CONNECTION NUMBER TBL  #
              MNCNB,         # ID = 11, NETWK CONN CONTROL BLOCK       #
              MPCNB,         # ID = 12, PRU CONN CONTROL BLOCK         #
              MERR,          # ID = 13, PIP INTERFACE TABLE            #
              MERR,          # ID = 14, PRU BUFFER TABLE               #
              MERR,          # ID = 15, NETWK BUFFER TABLE             #
              MKDIS,         # ID = 16, K-DISPLAY BUFFER               #
              MPRU;          # ID = 17, PRU BUFFER                     #
  
#**********************************************************************#
      BEGIN 
      CONTROL IFEQ DEBUG,1; 
         XTRACE("MAJPT") ;
      CONTROL FI; 
  
      P<AT> = 0;
      P<ACB> = 0; 
      P<ACNT> = 0;
      P<ACNB> = 0;
      P<DRHDRWD> = 0; 
      P<TNT> = 0; 
      P<LLCB> = 0;
      P<NCNT> = 0;
      P<NCNB> = 0;
      P<PCNB> = 0;
      P<PRUBUFF> = 0 ;
      P<ACKHEAD> = 0; 
      P<FLHEAD> = 0;
      P<KINITBF> = 0; 
  
      MEND = MNEW + MSIZE;              # LWA+1 OF BLOCK MOVED         #
      MSIZE = MOLD + MSIZE;             # LWA+1 OF OLD BLOCK MOVED     #
      MCUROLD = MOLD;        # PRESET NEXT BUFFER LOCATION             #
  
#           CHECK WHETHER MORE BUFFERS IN THE BLOCK MOVED              #
  
      FOR MCUR = 0 DO 
        BEGIN 
  
        IF MCUR EQ 0
        THEN
          MCUR = MNEW;                  # FIRST BUFFER LOCATION        #
        ELSE
          BEGIN 
          MCUROLD = MCUROLD + BLKBS[MCUR];# NEXT OLD BUFFER LOCATION   #
          MCUR = MCUR + BLKBS[MCUR];    # CURRENT BUFFER LOCATION      #
          END 
  
        IF MCUR EQ MEND 
        THEN
          RETURN; 
  
  
        IF BLKID[MCUR] LQ MOVEABLEIDS   # VALID BUFFER TYPE            #
        THEN
          GOTO BUFID[BLKID[MCUR]];      # ADJUST PTRS BASED ON ID      #
  
# 
            ERROR CONDITION -- BUFFER ID INVALID
# 
MERR: 
  
        CONTROL IFEQ DEBUG,1; 
          ABORT(BADID,0);      # ABORT NIP WITH ERROR MESSAGE          #
        CONTROL FI; 
  
        RETURN;                         # CONTINUE PROCESSING          #
  
# 
        APPLICATION TABLE 
# 
MAT:  
        PTAT[0] = MCUR;      # MODIFY POINTER IN POINTER TAB           #
        TEST; 
# 
        APPLICATION CONNECTION NUMBER TABLE 
# 
MACNT:  
        MPTR = ACNTAN[MCUR]; # GET APP NUMBER                          #
        MCHG = PTAT[0];      # APPLICATION TABLE ADDR                  #
        MCHKPTR;
        MCHG = ATACBA[MPTR+MCHG];# APPLICATION CONTROL BLOCK ADDR      #
        MCHKPTR;
        ACBACNT[MCHG] = MCUR;# MODIFY ACNT ADDRESS IN ACB              #
        TEST; 
# 
        ACKNOWLEDGE QUEUE ENTRY MOVED 
# 
MACK: 
        MCHG = ACKNCNB[MCUR];# GET NCNB ADDRESS                        #
        MCHKPTR;
        NCNBACKQ[MCHG] = MCUR;
        TEST; 
  
# 
        FUNCTION LIST BUFFER MOVED
# 
MFLIST: 
        FLCB[MCUR] = 0;      # CLEAR SCP COMPL BIT                     #
        IF FLFC[MCUR] EQ SFLIST 
        THEN                 # MODIFY SCPA FOR A SFLIST                #
          FLSCPA[MCUR] = LOC(FLWD0[MCUR]) + 
                          FLSCPA[MCUROLD]     - 
                          LOC(FLWD0[MCUROLD]);
        MCHG = PTAT[0];      # GET APP TABLE ADDR                      #
        MCHKPTR;
        MCHG = ATACBA[MCHG+FLAN[MCUR]];# GET CORR ACB ADDR             #
        MCHKPTR;
        ACBFLIST[MCHG] = MCUR;# MODIFY ACB FLIST ADDRESS               #
        TEST; 
# 
        APPLICATION CONTROL BLOCK 
# 
MACB: 
        MCHG = PTAT[0];      # GET APP TABLE ADDRESS                   #
        MCHKPTR;
        ATACBA[MCHG+ACBAN[MCUR]] = MCUR;# MODIFY ACB ADDR IN AT        #
        ACBIASCPA[MCUR] = LOC(ACBAAVAL[MCUR]);  # UPDATE SCP ADDR      #
        MDRPTR(ACBDRFP[MCUR],ACBDRBP[MCUR],LOC(ACBDRBP[MCUR])); 
        MDRPTR(ACBPWLFP[MCUR],ACBPWLBP[MCUR],LOC(ACBPWLFP[MCUR]));
        TEST; 
# 
        APPLICATION CONNECTION BLOCK
# 
MACNB:  
        MCHG = PTAT[0];      # GET APP TABLE ADDRESS                   #
        MCHKPTR;
        MCHG = ATACBA[MCHG+ACNBAN[MCUR]];# GET ACB ADDRESS             #
        MCHKPTR;
        IF ACBCDRP[MCHG] EQ MCUROLD 
        THEN                 # ACNB PROCESSED IN LAST NETGET           #
          BEGIN 
          ACBCDRP[MCHG] = MCUR;  # UPDATE LAST ACNB                    #
          END 
        MCHG = ACBACNT[MCHG];# GET APP CONN TABLE ADDRESS              #
        MCHKPTR;
        MPTR = ACNBACN[MCUR] - ACNTMINACN[MCHG] + ACNTHSIZE;
        ACNTACNB[MCHG+MPTR] = MCUR;# MODIFY APP CONN BK ADDR IN ACNT   #
        MCHG = ACNBNCNB[MCUR];# CHANGE ACNB/NCNB POINTERS              #
        IF MCHG NQ 0
        THEN
          BEGIN 
          MCHKPTR;
          NCNBACNB[MCHG] = MCUR;
          END 
        MCHG = ACNBCDRFP[MCUR];  # NEXT ACNB IN CONNECTION DATA RING   #
        IF MCHG NQ 0
        THEN
          BEGIN 
          MCHKPTR;  # UPDATE POINTER IF MOVED                          #
          ACNBCDRBP[MCHG] = MCUR;  # UPDATE BACK PTR OF NEXT ACNB      #
          MCHG = ACNBCDRBP[MCUR];  # PREVIOUS ACNB IN CON DATA RING    #
          MCHKPTR;  # UPDATE ACNB ADDR IF MOVED                        #
          ACNBCDRFP[MCHG] = MCUR;  # UPDATE FP OF PREV. ACNB           #
          END 
        MDRPTR(ACNBDRFP[MCUR],ACNBDRBP[MCUR],LOC(ACNBDRFP[MCUR]));
        TEST; 
  
# 
          MESSAGE HAS BEEN MOVED
# 
  
MMSG: 
        MDRPTR(NEXTPTR[MCUR],BACKPTR[MCUR],MCUR); 
        TEST; 
# 
        TERMINAL NODE TABLE 
# 
MTNT: 
        PTTNT[0] = MCUR;     # MODIFY TERMINAL NODE TABLE ADDR IN PT   #
        TEST; 
# 
        LOGICAL LINK CONTROL BLOCK
# 
MLLCB:  
        MCHG = LLCBBP[MCUR]; # UPDATE PREV BLOCK BKPTR                 #
        IF MCHG EQ 0
        THEN
          BEGIN              # FIRST LLCB IN CHAIN                     #
          MCHG = PTTNT[0];
          MCHKPTR;
          MPTR = LLCBTN[MCUR];
          TNTLLAD[MPTR+MCHG] = MCUR;# 1 ST LLCB IN CHAIN               #
          END 
        ELSE
          BEGIN              # NOT 1ST LLCB IN CHAIN                   #
          MCHKPTR;
          LLCBFP[MCHG] = MCUR;
          END 
        MCHG = LLCBFP[MCUR]; # UPDATE BKPTR OF NEXT LLCB               #
        IF MCHG NQ 0
        THEN
          BEGIN 
          MCHKPTR;
          LLCBBP[MCHG] = MCUR;
          END 
        TEST; 
# 
        NETWORK CONNECTION NUMBER TABLE 
# 
MNCNT:  
        MCHG = PTTNT[0];     # GET TERMINAL NODE TABLE ADDR            #
        MCHKPTR;
        MCHG = TNTLLAD[NCNTTN[MCUR]+MCHG];# GET CORR LLCB ADDR IN TNT  #
        FOR I = 0 STEP 1 WHILE MCHG NQ 0
        DO
          BEGIN              # LOOP TO SEARCH FOR RIGHT LLCB           #
          MCHKPTR;
          IF LLCBHN[MCHG] EQ NCNTHN[MCUR] 
          THEN
            BEGIN 
            MPTR3 = MCHG; 
            MCHG = 0; 
            END 
          ELSE
            MCHG = LLCBFP[MCHG];
          END 
        MPTR = NCNTCI[MCUR]+LLCBHSIZE;  # NCNT ADDR IN LLCB W CORR HN  #
        LLCBNCNT[MPTR+MPTR3] = MCUR;
        MPTR2 = NCNTSIZE - NCNTHSIZE; 
        FOR MPTR = NCNTHSIZE STEP 1 UNTIL MPTR2 
        DO
          BEGIN              # LOOP TO MODIFY NCNT ADDR IN NCNB/PCNB   #
          MCHG = NCNTNCNB[MCUR+MPTR]; 
          IF MCHG NQ 0
          THEN
            BEGIN 
            MCHKPTR;
            NCNBCTAD[MCHG] = MCUR;  # UPDATE NCNT ADDR                 #
            END 
          END 
        TEST; 
# 
        NETWORK CONNECTION CONTROL BLOCK
# 
MNCNB:  
MPCNB:  
        MCHG = NCNBCTAD[MCUR];# GET NCNT ADDR IN NCNB                  #
        MCHKPTR;
        MPTR = NCNBCN[MCUR];  # CONN NUMBER IN NCNB                    #
        MPTR2 = MPTR/16;
        MPTR2 = MPTR - MPTR2*16 + NCNTHSIZE;
        NCNTNCNB[MCHG+MPTR2] = MCUR;# MODIFY NCNB ADDR IN NCNT         #
        MCHG = NCNBACNB[MCUR];# GET ACNB ADDR FOR THIS NCNB            #
        IF MCHG NQ 0
        THEN
          BEGIN 
          MCHKPTR;
          ACNBNCNB[MCHG] = MCUR;  # MODIFY NCNB ADDRESS IN ACNB        #
          END 
        IF BLKID[MCUR] EQ NCNBIDVALUE 
        THEN
          BEGIN 
          MDRPTR(NCNBDRFP[MCUR],NCNBDRBP[MCUR],LOC(NCNBDRFP[MCUR]));
          MCHG = NCNBACKQ[MCUR];  # MODIFY ACKQ ADDR                   #
          IF MCHG NQ 0
          THEN
            BEGIN    #  ACKQ EXISTS    #
            MCHKPTR;
            ACKNCNB[MCHG] = MCUR; 
            END 
          END 
        ELSE
          BEGIN              # PRU CONNECTION CONTROL BLOCK            #
          MCHG = PCNBPCFP[MCUR];
          MPTR = PCNBNBTE[MCUR] * NBTFETNO; 
          MPTR2 = LOC(NBTFIRST[MPTR]);
          IF MCHG EQ MPTR2
          THEN  # LAST PCNB IN RING                                    #
            NBTPCRB[MPTR] = MCUR; 
          ELSE  # NOT LAST PCNB                                        #
            BEGIN 
            MCHKPTR;
            PCNBPCBP[MCHG] = MCUR;
            END 
          MCHG = PCNBPCBP[MCUR];
          IF MCHG EQ MPTR2
          THEN  # FIRST PCNB IN RING                                   #
            NBTPCRF[MPTR] = MCUR; 
          ELSE
            BEGIN 
            MCHKPTR;
            PCNBPCFP[MCHG] = MCUR;
            END 
          END 
        TEST; 
# 
      K-DISPLAY BUFFER
# 
  
MKDIS:  
        MCHG = BACKPTR[MCUR];  # ADDRESS OF PREVIOUS BUFFER            #
        MCHKPTR;             # CHECK IF IN RANGE OF MOVE               #
        NEXTPTR[MCHG] = MCUR;  # UPDATE FRONT POINTER                  #
        MPTR = MCHG + BLKBS[MCHG] - 1;  # LWA OF BUFFER                #
        CONTROL IFEQ DEBUG,1; 
          IF K7777[MPTR] NQ O"7777" 
          THEN
            BEGIN 
            ABORT(DFMSG18,0); # ABORT NIP, BAD BLOCK                   #
            END 
        CONTROL FI; 
  
        MCHG = KDSTAIL[MPTR];  # FWA OF DATA                           #
        MCHKPTR;             # RESET DATA POINTER                      #
        KDSTAIL[MPTR] = MCHG;  # UPDATE FWA OF DATA                    #
  
        MCHG = NEXTPTR[MCUR];  # ADDRESS OF NEXT BUFFER                #
        MCHKPTR;             # CHECK IF IN RANGE OF MOVE               #
        BACKPTR[MCHG] = MCUR;  # UPDATE BACK POINTER                   #
  
        TEST; 
 MPRU:  
  
#       PRU BUFFER IN FREE CHAIN                                       #
  
        MCHG = PRUBBACK[MCUR] ;        # PREVIOUS BUFF OF THIS NEW BUF #
        MCHKPTR ; 
        PRUBDLFP[MCHG] = MCUR;         # NEXT OF PREV IS CURRENT       #
        MCHG = PRUBDLFP[MCUR];         # NEXT OF CURRENT BUFFER        #
        MCHKPTR ; 
        PRUBBACK[MCHG] = MCUR ;        # BACK OF NEXT IS CURRENT       #
  
        # UPDATE FET POINTERS IN THE NEW BUFFER                        #
  
        MPTR2 = PRUBFIRST[MCUR] ;      # FIRST OF OLD BUFFER           #
        MPTR3 = PRUBIN[MCUR] - MPTR2 ; # IN - FIRST = DIFFERENCE       #
        PRUBFIRST[MCUR] = MCUR + PBHSIZE - 1 ;
        PRUBIN[MCUR] = MCUR + PBHSIZE + MPTR3 ;  # IN = NEW FIRST + DIF#
        MPTR3 = PRUBOUT[MCUR] - MPTR2 ; # OUT - FIRST = DIF            #
        PRUBOUT[MCUR] = MCUR + PBHSIZE + MPTR3 ; # OUT = NEW FIRST+DIF #
        MPTR3 = PRUBLIMIT[MCUR] - MPTR2 ; # DEFERRENCE OF LIMIT        #
        PRUBLIMIT[MCUR] = MCUR + PBHSIZE + MPTR3 - 1; 
  
# 
          PRU CHAIN HAS BEEN SET UP FROM A LIST STRUCTURE, THEREFORE THE
          FORWARD OF CHAIN IS SAME AS THE (PTR OF LIST+1), EXCEPT THE FST 
          BUFFER IN THE LIST, PTR OF LIST POINTING BACK TO THE OWNNING
          BUFFER ( SEE MSETPTR ). 
       I.E. - IF PRUBDLFP OF MOVED BUFFER IS ZERO, MEANS THAT IT IS THE 
              LAST BUFFER IN LIST. AND THIS BUFFER BELONGED TO PIT CHAIN
              THEN UPDATE THE LAST LIMBO POINTER IN PIT, THE PIT ENTRY
              SLOTH IS POINTED BACK BY THIS PRUBDLFP ( SEE MSETPTR ). 
            - IF PRUBDLFP OF MOVED BUFFER IS NON-ZERO, AND NOT EQUAL TO 
              FORWARD PTR OF DATA RING THEN IT IS THE FIRST BUFFER OF 
              THE LIST. UPDATE THE PCBPTR ENTRY OF INTERLOCK TABLE OR FST 
              LIMBO PTR OF PIT ENTRY. THIS ENTRY ALSO IS POINTED BY 
              THE CURRENT PRUBDLFP. 
# 
  
        IF PRUBFSTB[MCUR]          # FIRST BUFFER MARK IS TRUE         #
           AND PRUBDLFP[MCUR] NQ 0
        THEN
          BEGIN                          # THIS MOVED BUFFER IS THE FST#
          P<ADDRWORD> = PRUBDLFP[MCUR] ;   # UPDATE THE OWNNING BUFFER #
                                         # OWNNING NOW POINTS TO NEW BF#
          END 
        TEST ;
  
        END 
  
  
      END 
TERM
