*COMDECK GETIL
          TITLE  GTILN - GET FROM INTERMEDIATE LANGUAGE FILE
**        GTILN - GET FROM INTERMEDIATE LANGUAGE FILE (ILN) 
* 
*         THIS IS THE INTERFACE ROUTINE THROUGH WHICH A SYMPL PROGRAM 
*         READS FROM ILN INTO A WORKING STORAGE BUFFER.  THE SYMPL
*         CALLING SEQUENCE TO THIS ROUTINE IS 
*                XREF GTILN;
*                GTILN (BUF,NWDS,EOF);
*                WHERE- 
*                BUF = WORKING STORAGE BUFFER 
*                NWDS = NUMBER OF WORDS THIS ROUTINE READS INTO BUF 
*                EOF = END OF DATA EXIT 
*         HENCE THE REGISTER SETUP ON ENTRY IS- 
*                A1 = POINTER TO APLIST 
*                X1 = FWA OF BUF
* 
  
 GTILN    ENTRY. ** 
          SB1    1
          SX7    A1 
          SA7    SAVEA1 
          SA2    =XILN-1     NUMBER OF WORDS LEFT IN RECORD 
          ZR     X2,NXTHCK   IF AT END OF RECORD
 AFTNXCK  BSS    0
  
*         WE WILL READ IN ILNBMAX WORDS IF THERE ARE AT LEAST THAT MANY 
*         LEFT IN RECORD.  OTHERWISE, WE READ IN AS MANY WORDS AS ARE 
*         LEFT
  
          SX4    X2-ILNBMAX 
          NG     X4,SHORT 
          ZR     X4,SHORT 
  
*         MORE THAN ILNBMAX WORDS LEFT
  
          BX7    X4          NUMBER OF WORDS LEFT IN RECORD AFTER READ
          SX6    ILNBMAX     NUMBER OF WORDS TO READ
          EQ     LONGOK 
  
*         LESS THAN ILNBMAX WORDS LEFT
  
 SHORT    SX7    0           NO WORDS LEFT IN RECORD AFTER READ 
          SX6    X2          NUMBER OF WORDS TO READ
 LONGOK   SA7    A2          UPDATE ILN-1 TO REFLECT THIS READ
          SA4    A1+B1       ADDRESS OF NWDS
          SA6    X4          RETURN NUMBER OF WORDS READ TO CALLER
          READW  =XF.ILN,X1,X6
          EQ     GTILN
          TITLE  NXTHCK - POSITION ILN TO NEXT RECORD 
**        NXTHCK - POSITION ILN TO NEXT RECORD
* 
*         THIS ROUTINE IS CALLED TO POSITION THE ILN TO THE NEXT RECORD 
*         WE USE THE ILNFAT TO DETERMINE THE NEXT RECORD TO BE READ 
*         WE ALWAYS POSITION THE ILN TO A NON-ZERO LENGTH RECORD
  
 NXTHCK   BSS    0
          SA3    =XILN-2     POINTER TO FAT ENTRY FOR CURRENT RECORD
 AGAIN    BSS    0
          SB4    X3          FWA OF FAT 
          MX0    18 
          BX7    X0*X3       INDEX INTO FAT FOR CURRENT RECORD
          LX7    18 
          SA5    B4+X7       FAT ENTRY FOR CURRENT RECORD 
          BX7    X0*X5       GET LINK TO NEXT FAT ENTRY 
          ZR     X7,EOFHC 
          BX4    -X0*X3      FWA OF FAT 
          BX6    X7+X4       NEXT LINK PLUS FAT FWA 
          LX7    18 
          SA6    A3          UPDATE FAT POINTERS
          SA4    X7+B4       FAT ENTRY FOR NEXT (LINKED) RECORD TO READ 
          SX7    X4          LIFT OUT FILE POSITION 
  
*         CALCULATE LENGTH OF RECORD
  
          SA3    A4+B1       FAT ENTRY FOR NEXT (PHYSICAL) RECORD 
          PL     X3,SKIPITR 
  
*         FOR LAST ENTRY IN ILNFAT WE USE THE FP OF THE LAST WORD ON
*         ILN 
  
          SA3    =XILN-4
 SKIPITR  BSS    0
          SX3    X3 
          IX6    X3-X7
          ZR     X6,AGAIN    IF ZERO LENGTH RECORD
          SA6    =XILN-1
 #RM      IFEQ   CP#RM,0
  
*         HERE IS WHERE WE FAKE WORD ADDRESSING.  SINCE WE WROTE ILN
*         SEQUENTIALLY AND ALWAYS IN EVEN MULTIPLES OF 100B WORDS, WE 
*         CAN CALCULATE THE RSA OF THE PRU WE WANT AND ALSO THE OFFSET
*         WITHIN THAT PRU.  WE DO A READ OF THE CORRECT RSA AND BUMP
*         OUT TO POINT TO THE CORRECT WORD WITHIN THE BUFFER
  
          SX4    X7+63       FILE POSITION + 63 
          BX7    X4 
          AX7    6           (FP+63)/64 = RSA 
  
*         SET    ILN FET+6 TO CORRECT FILE POSITION 
  
          RECALL =XF.ILN
          SA7    =XF.ILN+I.RAN1 
  
          LX7    6           RSA*64 
          IX0    X4-X7       (FP+63)-(RSA*64) = OFFSET WITHIN PRU 
  
*         CLEAR END OF RECORD BIT IN FET IN CASE IT WAS SET BY PREVIOUS 
*         READ
  
          SX6    20B
          SA3    =XF.ILN
          BX6    -X6*X3 
          SA6    A3 
  
*         SET    IN = OUT = FIRST 
  
          SA3    A3+B1       FIRST
          SX6    X3 
          SA6    A3+B1       IN 
          SA6    A6+B1       OUT
          READ   =XF.ILN,R
  
*         SET OUT = FIRST + (FP+63) - [(FP+63)/64]*64 
  
 SKIPRD   BSS    0
          SA4    =XF.ILN+I.FIRST
          SX4    X4 
          IX6    X4+X0
          SA6    =XF.ILN+I.OUT
 #RM      ELSE
          STORE  =XFI.ILN,WA=X7 
  
*         SET HOLDING BUFFER POINTERS TO REFLECT AN EMPTY BUFFER SO THAT
*         NEXT CALL WILL FORCE READW TO GO TO CRM 
  
          SA1    =XF.ILN+I.IN 
          BX6    X1 
          SA6    A1+1        OUT=IN 
 #RM      ENDIF 
          SA1    SAVEA1      PICK UP APLIST POINTER 
          SA2    =XILN-1
          SA1    X1          FWA OF BUFFER
          EQ     AFTNXCK
          SPACE  4
*         END OF DATA ON ILN - TAKE CALLER SPECIFIED EXIT 
  
 EOFHC    BSS    0
          SA2    SAVEA1 
          SA1    X2+2 
          SB7    X1 
          JP     B7 
          SPACE  4
 SAVEA1   DATA   0
 ILNBMAX  EQU    128D 
