*DECK S$GNGIR 
          IDENT  S$GNGIR
          TITLE  S$GNGIR - GENERATE GET INTERNAL RECORD CODE
          COMMENT  GENERATE GET INTERNAL RECORD CODE. 
  
*CALL LBLPTR
  
          B1=1
  
  
**        S$GNGIR - GENERATE GET INTERNAL RECORD CODE 
* 
*     CALLING SEQUENCE- 
*         S$GNGIR(REC$IRRL, REC$LR);
* 
*     GIVEN-
*         REC$IRRL = NUMBER OF WORDS OF RECORD IN RSA$
*         REC$LR = NUMBER OF BITS TO HOLD RECORD NUMBER 
* 
*     DOES- 
*         GENERATE GET INTERNAL RECORD CODE 
* 
*         GENERATED CODE EXPECTS- 
*         A0= ADDRESS OF FET OF INTERNAL FILE 
*         X2= INDEX TO TRN
*         X5= RECORD NUMBER (RN)
* 
*         GENERATED CODE DOES-
*         GET INTERNAL RECORD ACCORDING TO A0 
*         SET X6 WITH RN IN X5
*         SET X6=0 IF END-OF-DATA 
*         PRESERVES *X2 AND *B2 
* 
  
  
          ENTRY  S$GNGIR
 S$GNGIR  SUBR               ENTRY/EXIT WORD
          SB1    1           CONSTANT 1 
  
* GET AND SAVE PARAMETERS 
* 
          SA5    X1          X5 = VALUE OF *IRRL* 
          SA2    A1+B1       ADDRESS OF REC$LR
          SA2    X2          VALUE OF REC$LR
          SB5    X2          B5=REC$LR
* 
  
          GEN    (SB4 X2)              *PRESERVE INDEX TO TRN IN B4 
          GEN    (SB5 X5)              *PRESERVE RN IN B5 
          GEN    (SX2 B1+0),X5         *X2 = NUMBER OF WORDS TO MOVE
  
          GENLBL GRIMOVE1 
  
          GEN    (SA3 A0+2)            *IN PTR
          GEN    (SA4 A3+B1)           *OUT PTR 
          GEN    (IX5 X3-X4)           * (IN-OUT) 
          NEWLBL GRILBL2
          GEN    (NG X5,"GRILBL2")     *IF IN<OUT 
* 
* CASE IN PTR AHEAD OUT PTR 
* 
          GEN    (IX0 X5-X2)           * (IN-OUT) - N 
          NEWLBL GRIMOVE4 
          GEN    (PL X0,"GRIMOVE4")    *IF ENOUGH ROOM FOR N  (I-O)>=N
  
  
          GENLBL GRILBL1
          GEN    (SA1 A0)              *X1=WORD 0 OF FET OF FILE
          GEN    (MX0 -6)              *MASK FOR BIT 0-BIT 5
          GEN    (BX0 -X0*X1)          *   OF FET 
          GEN    (SX0 X1-21B)          *TEST FOR EOD
          NEWLBL READBUF
          GEN    (MI X0,"READBUF")     *IF FILE NOT EOD 
          GEN    (MX6 0)               * X6=0 
          NEWLBL LABEL5 
          GEN    (EQ "LABEL5")         *EXIT GIR CODE WITH X6=0 (EOD) 
  
  
          GENLBL READBUF
                                       *READ INTO BUFFER
          GEN    (BX5 X2)              *SAVE X2 IN X5 
          GENMAC (READ A0,RECALL) 
          GEN    (BX2 X5)              *RESTORE X2 FROM X5
  
          GEN    (EQ "GRIMOVE1")       *BACK TO CHECK FET POINTERS
* 
* CASE IN PTR BEHIND OF OUT PTR 
* 
  
          GENLBL GRILBL2
          GEN    (SA1 A4+B1)           *LIMIT PTR 
          GEN    (SX1 X1)              *KEEP LO 18 BITS 
          GEN    (IX0 X1-X4)           *LIMIT-OUT 
          GEN    (IX0 X2-X0)           * #-(LIMIT-OUT)
          GEN    (NG X0,"GRIMOVE4")       *IF ENOUGH ROOM FOR # 
  
          GEN    (SA1 A0+B1)           *X1=FIRST PTR
          GEN    (SX1 X1)              *KEEP LO 18 BITS 
          GEN    (IX1 X3-X1)           *(IN-FIRST)
          GEN    (IX1 X1-X0)           *N-(LIMIT-OUT)-(IN-FIRST)
          GEN    (NG X1,"GRILBL1")     *IF NOT ENOUGH DATA
  
          GEN    (IX0 X2-X0)           *N-(N-(LIMIT-OUT))=LIMIT-OUT 
          GEN    (SB3 X0)              *NO OF WORDS TO MOVE 
          GEN    (SA5 X4)              *MOVE WORD AT OUT PTR
          GEN    (BX6 X5)              *    INTO X6 
  
          NEWLBL GRIMOVE2 
          GEN    (EQ B3,B1,"GRIMOVE2") *IF ONLY 1 WORD IN BUFFER
  
          GEN    (SB2 B1) 
          GEN    (SA1 "SAVEAD")        *GET ADDR OF 1ST WORD IN RSA 
          GEN    (SA1 X1)              *        FROM SAVEAD 
  
          GENLBL GRILOOP2 
          GEN    (SB2 B2+B1)           *INCREMENT INDEX 
          GEN    (SA5 A5+B1)           *GET NEXT WORD 
          GEN    (BX7 X5)              *MOVE WORD 
          GEN    (SA7 A1) 
          GEN    (SA1 A1+B1)
          GEN    (LT B2,B3,"GRILOOP2") *IF MORE WORDS,LOOP
  
          GEN    (SX7 A1)              *SAVE ADDR OF RSA
          GEN    (SA7 "SAVEAD")        *  WORD NOW IN X6
  
          GENLBL GRIMOVE2 
  
          GEN    (SA5 A0+B1)           *FIRST PTR 
          GEN    (SX5 X5)         *KEEP LOW 18 BITS 
          GEN    (BX4 X5) 
          GEN    (BX7 X5) 
          GEN    (SA5 X5-1)            *SET A5 TO JUST BEFORE WORDS 
  
          GEN    (SA7 A4)              *OUT=FIRST 
  
          GEN    (IX2 X2-X0)           *N=N-(LIMIT-OUT) 
          NEWLBL GRILBL3
          GEN    (ZR X2,"GRILBL3")     *IF NO MORE WORDS TO MOVE
          GEN    (SB3 X2)              *N0 OF WORDS TO MOVE 
  
          GEN    (SA1 "SAVEAD")        *GET ADDR OF 1ST WORD
          GEN    (SA1 X1) 
          GEN    (SB2 B0) 
  
          GENLBL GRILOOP3 
          GEN    (SB2 B2+B1)           *INCREMENT INDEX 
          GEN    (SA5 A5+B1)           *GET NEXT BY ADVANCING OUT 
          GEN    (BX7 X5)              *MOVE WORD 
          GEN    (SA7 A1) 
          GEN    (SA1 A1+B1)           *GET NEXT WORD 
          GEN    (LT B2,B3,"GRILOOP3") *IF MORE WORDS,LOOP
  
          GEN    (SX7 X4+B3)           *OUT=OUT+N 
          GEN    (SA7 A4)              *UPDATE NEW OUT PTR IN FET 
          GEN    (EQ "GRILBL3") 
                                       *MOVE IRRL+1 WORDS 
  
          GENLBL GRIMOVE4 
          GEN    (SA5 X4)              *MOVE WORD AT OUT PTR
          GEN    (BX6 X5)              *    INTO X6 
  
          SB3    X5        IRRL 
          ZR     B3,MOVEDONE     IF IRRL=0
          SB2    B0 
          GEN    (SA1 "SAVEAD")        *ADDR OF 1ST WORD
          GEN    (SA1 X1-1)            *   IN RSA FROM SAVEAD 
  
* LOOP TO GEN STRAIGHT CODE TO MOVE 2ND THRU (IRRL+1)TH WORD
  
 MOVEWD   GEN    (SA5 A5+B1)           *GET NEXT WORD 
          GEN    (BX7 X5) 
          GEN    (SA7 A1+B1)           *MOVE NEXT WORD
          GEN    (SA1 A7) 
          SB2    B2+B1       INCR WORDS MOVED COUNT 
          LT     B2,B3,MOVEWD    IF MORE WORDS,LOOP TO GEN MORE CODE
  
 MOVEDONE GEN    (SX7 X4+1),B3         *UPDATE OUT PTR
          GEN    (SA7 A4)              *   IN FET 
  
  
          GENLBL GRILBL3
          GEN    (SA2 "WSA")
          GEN    (SB2 X2) 
  
          GEN    (MX0 1+1),B5          *MX0 1+1+LR
          GEN    (BX6 -X0*X6)          *  RECORDS OF INTERNAL FILE
          GEN    (SX2 B5)              *X2= RN
          SB7    -B5         -LR
          GEN    (LX2 60-1-1),B7       *LX2 -1-1-LR 
          GEN    (BX6 X2+X6)           *INSERT RN 
  
  
          GENLBL LABEL5 
          GEN    (SX2 B4)              *RESTORE X2 FROM B4
  
          EXIT
          END 
