*DECK C$LINAG 
          IDENT  C$LINAG
          SST 
          B1=1
          TITLE  C$LINAG - LINAGE PROCESSOR 
* 
**        CBLINAG - LINAGE PROCESSOR
          COMMENT  LINAGE PROCESSOR 
* 
*         DOES - PROCESSES LINAGE 
* 
*         INPUTS
*                A0 = FIT 
*                X1 = ADVANCING NBR 
*                X3 = REC LENGTH
*                B3 = 1 IF X1 MNEMONIC, 0 IF INTEGER
* 
*         RETURNS 
*                B3 = 0 IF NO END OF PAGE 
*                B3 = 1 IF EOP
* 
*         C.LINAA IS EP FOR AFTER ADVANCING 
*         C.LINBA IS EP FOR BEFORE
* 
*         CONVENTIONS 
*                B2 HAS ADDRESS OF LINAGE TABLE 
*                X4 HAS LINAGE COUNTER IN COMP-1
* 
*CALL IOMICROS
*CALL IODEFSC 
          TITLE  C.LINAA - AFTER ADVANCING
          ENTRY  C.LINAA
 C.LINAA  BSS    0           AFTER ADVANCING
          RJ     INIT        INITIALIZE 
          NZ     B3,AAPAGE   JUMP IF WRITE ... PAGE 
          NG     X5,AAPAGE   JUMP IF PAGE OVERFLOW
          RJ     WAA         WRITE THE LINE 
          RJ     SETPTRS     RESTORE LINAGE POINTERS
          FETCH  B2+#LIFT#,LIVA,X5 GET FOOTING VALUE
          IX5    X4-X5       LC - FOOT
          PL     X5,ALTRTN   JUMP IF IN FOOTING AREA - IS EOP COND
 NORMRTN  BSS    0           NORMAL RETURN (NO EOP) 
          RJ     STLINCT     STORE NEW VALUE OF LINAGE COUNTER
          EQ     =XC.NORRT   TAKE NORMAL RETURN 
 ALTRTN   BSS    0           ALTERNATE RETURN (EOP) 
          RJ     STLINCT     STORE NEW VALUE OF LINAGE COUNTER
          SB6    ALTRTN1
          RJ     =XC.SVRTN
          EQ     =XC.NORRT   FAKES OUT NORRT - TO SET FILE STATUS 
 ALTRTN1  BSS    0
          SB3    B1          SET EOP FLAG 
          RJ     =XC.GETRT
          JP     B6 
 AAPAGE   BSS    0
          SB3    B1          FLAG MNEMONIC
          SX1    34B         TOP-OF-PAGE MNEMONIC 
          SX6    B1          RESET LINAGE-COUNTER TO 1
          SA6    LINCTR      TO LINAGE-COUNTER
          FETCH  A0,LITB,X5  GET LINES AT TOP OR BOTTOM FLAG
          PL     X5,AANOTOP  JP IF NEITHER SPECIFIED
          RJ     CALCNP      CALCULATE NEW PAGE ADVANCING NUMBER
          EQ     AAPG1
 AANOTOP  BSS    0
          RJ     GETNVAL     RESET VALUES OF LINAGE, TOP, BOTTOM, ETC.
          SX1    34B         TOP OF PAGE
 AAPG1    BSS    0
          SA3    LINELEN     GET LINE LENGTH
          RJ     WAA         WRITE WITH PROPER SPACING
          SA2    SVMNEM      GET MNEMONIC INDICATOR 
          NZ     X2,NORMRTN  IF WRITEA AFT ADV PAGE TAKE NORMAL EXIT
          EQ     ALTRTN      EXIT TO EOP
          TITLE C.LINBA - BEFORE ADVANCING
          ENTRY  C.LINBA
 C.LINBA  BSS    0           BEFORE ADVANCING 
          RJ     INIT 
          SA2    WAALINE     LINE NUMBER
          BX6    X2 
          SA6    BARTN1-1    SAVE 
          PL     X5,BANOOF   JUMP IF NO OVERFLOW
          SB3    B1+B1       SET FORCED OVERFLOW
          SX1    34B         SET PAGE EJECT 
          SX6    B3 
          SA6    SVMNEM      SAVE MNEM IND
 BANOOF   BSS    0
          ZR     B3,BANOPG   JP IF NOT ADVANCING PAGE 
          MX6    1
          SA6    BARFLAG     SET RESET FLAG TO RESET ALL LINAGE ITEMS 
          FETCH  A0,LITB,X5  GET LINAGE TOP OR BOTTOM FLAG
          PL     X5,BANOPG   JUMP IF NEITHER SPECIFIED
          RJ     CALCNP      CALCULATE NEW PAGE ADVANCING NUMBER
          MX6    0
          SA6    BARFLAG     CLEAR TO NOT RESET LINAGE ITEMS
 BANOPG   BSS    0
          SA3    LINELEN     GET LINE LENGTH
          SB6    BARTN1 
          EQ     =XC.WBA     DO WRITE + ADVANCING NEEDED
          DATA   0           LINE NBR HERE
 BARTN1   BSS    0
          RJ     SETPTRS     SET POINTERS 
          SA2    SVMNEM      GET MNEM IND.
          NZ     X2,BANEWP   JUMP IF NEW PAGE 
          FETCH  B2+#LIFT#,LIVA,X5 GET FOOTING VALUE
          IX3    X4-X5       LC - FOOTING 
          NG     X3,NORMRTN  RETURN IF NOT IN FOOTING AREA
          EQ     ALTRTN      INDICATE EOP 
 BANEWP   BSS    0
          SA1    BARFLAG     GET RESET FLAG 
          ZR     X1,BANORS   JP IF NOT TO RESET 
          MX6    0
          SA6    A1          CLEAR FLAG 
          RJ     GETNVAL     SET NEW VALUES FOR FIELDS
 BANORS   BSS    0
          SX6    B1          RESET LINAGE-COUNTER TO 1
          SA6    LINCTR 
          SA2    SVMNEM 
          SX2    X2-2 
          NZ     X2,NORMRTN  NO EOP IF WBA PAGE 
          EQ     ALTRTN      TAKE EOP EXIT
 BARFLAG  DATA   0           BEFORE ADVANCING RESET FLAG
          TITLE  C.LINOP - OPEN PROCESS 
* 
**        C.LINOP - CALLED AT OPEN OUTPUT TIME
* 
*         DOES - INITIALIZES LINAGE TABLE 
*         WILL EJECT TO TOP OF PAGE IF LINES AT TOP OR BOTTOM NOT SPEC
*         IF LINES AT TOP GIVEN, WILL SPACE THAT MANY LINES 
* 
          ENTRY  C.LINOP
 C.LINOP  BSS    0
          RJ     =XC.SVRTN
          SA4    B6-B1       GET LINE NUMBER
          SX6    X4 
          SA6    WAALINE     SAVE IT
          SX6    B1 
          SA6    LINCTR      SET LINAGE-COUNTER TO 1
          RJ     STLINCT     SET REAL LINAGE COUNTER TO 1 
          RJ     GETNVAL     SET UP VALUES FOR DATA-NAMES IN LIN CLAUSES
          SA2    =XC.BLANK
          FETCH  A0,RECA,X5  GET ADDR OF REC AREA 
          BX6    X2 
          SA6    X5          PUT BLANKS IN FIRST WORD OF REC AREA 
          SB3    B1          SIGNAL MNEMONIC
          SX1    1R1         EJECT CHAR 
          SX3    8           WRITE 8 CHARS
          RJ     WAA         WRITE PAGE EJECT TO POSITION AT TOP OF PAGE
          FETCH  A0,LITB,X5 
          PL     X5,=XC.NORRT      LINES AT TOP OR BOT NOT SPECIFIED
          SX1    1RQ
          SX3    8
          SB3    B1          MENMONIC 
          RJ     WAA         OUTPUT Q TO CLEAR AUTO PAGE EJECT
          FETCH  A0,LITP,X4  GET LINAGE TABLE POINTER 
          FETCH  X4+#LITO#,LIVA,X1 GET LINES AT TOP 
          ZR     X1,=XC.NORRT      RETURN IF NO LINES AT TOP
          SB3    B0          SIGNAL ADVANCING LINES 
          SX3    8           WRITE 8 CHARS
          RJ     WAA         POSITION FOR LINES AT TOP
          EQ     =XC.NORRT   RETURN 
          TITLE  COMMON ROUTINES
 CALCNP   EJECT 
 CALCNP   DATA   0           CALCULATE NEW PAGE - REQUIRED ADVANCING TO 
*                            GET THERE
          FETCH  B2+#LIBO#,LIVA,X1  GET LINES AT BOTTOM 
          SA4    OLINCTR     GET ORIGINAL LINE COUNT
          FETCH  B2+#LILN#,LIVA,X5  GET LINAGE
          IX5    X5-X4       LINAGE - ORIG LINAGE-COUNTER (LINES TO BOT)
          IX6    X5+X1       LINES LEFT PLUS LINES AT BOTTOM
          SX6    X6+B1       BUMP ONE MORE SINCE LINES LEFT IS OFF 1
          SA6    =SCALCNPS1  SAVE IT
          RJ     GETNVAL     RESET VALUES OF LINAGE, TOP, BOTTOM, ETC.
          SA1    CALCNPS1    GET PREVIOUS SAVED STUFF 
          FETCH  B2+#LITO#,LIVA,X5  GET LINES AT TOP
          IX1    X1+X5       TOTAL NBR OF LINES TO ADVANCE
          SB3    B0          FLAG INTEGER ADVANCING COUNT 
          EQ     CALCNP 
 CONVTB   SPACE  2
 CONVTB   DATA   0           CONVERT ITEM IN B5 TO BINARY 
*                RETURNS X1 - SAVES NOTHING EXCEPT A0 
          SX6    A0 
          SA6    =SSVA0      SAVE A0
          FETCH  B5,LIBC,X1  GET BCP OF ITEM
          FETCH  B5,LISZ,X5  GET SIZE 
          MX0    1
          LX0    10 
          IX0    X0+X5       MAKE PARAM FOR CONV RTN
          LX0    8
          IX0    X0+X5       SIZE IN BOTH DEST AND SOURCE 
          FETCH  B5,LIAD,X5  ADDRESS
          SB3    X5 
          RJ     =XC.ND2RN   CONVERT TO REGISTER NUMERIC
*      LATER PUT A VALIDITY CHECK HERE
          MX0    60-48       CONVERT ONLY LOWER 8 CHARS 
          BX1    X2 
          RJ     =XC.U08R1   CONVERT TO BINARY IN X1
          SA2    SVA0 
          SA0    X2          RESTORE A0 
          EQ     CONVTB      EXIT 
 GETNVAL  SPACE  2
 GETNVAL  DATA   0           SET LINAGE VALUES TO NEW STUFF 
          SB5    B2          POINTER
 GETNVLP  BSS    0
          FETCH  B5,LIAD,X4  GET ADDR OF PARAM
          ZR     X4,GETNVLI        JUMP IF LITERAL
          FETCH  B5,LIC1,X5  GET COMP-1 FLAG
          SA1    X4          IF COMP-1 GET VALUE
          NG     X5,GETNVC1  JUMP IF COMP-1 
          SX6    B5 
          SA6    =SSVB5      SAVE B5
          RJ     CONVTB      CONVERT TO BINARY
          SA3    SVB5 
          SB5    X3          RESTORE B5 
 GETNVC1  BSS    0
          STORE  B5,LIVA=X1  PUT IN NEW VALUE 
 GETNVLI  BSS    0
          SB4    B2+#LIBO#+1  LAST ENTRY + 1
          SB5    B5+B1
          NE     B5,B4,GETNVLP
          RJ     SETPTRS     SET B2 AND X4 AGAIN
          EQ     GETNVAL
 INIT    SPACE   2
 INIT     DATA   0           INITIALIZE 
          RJ     =XC.SVRTN   SAVE RETURN
          SA4    B6-B1
          SX6    X4 
          SA6    WAALINE     SAVE LINE NBR
          BX6    X3 
          SA6    =SLINELEN   SAVE LINE LENGTH 
          BX7    X1 
          SA7    =SADVCT
          SX6    B3 
          SA6    =SSVMNEM    SAVE B3 (MNEMONIC INDICATOR) 
          RJ     SETPTRS     SET LINAGE POINTERS
          SB5    B2+#LILC#   POINT TO LINAGE-COUNTER PARAM
          RJ     CONVTB      CONVERT TO BINARY
          BX6    X1 
          SA6    =SLINCTR    SAVE LINAGE COUNTER
          SA6    =SOLINCTR   SAVE ORIGINAL LINAGE COUNTER 
          RJ     SETPTRS     RESET POINTERS 
          SA1    ADVCT       GET COUNT TO ADVANCE 
          FETCH  B2+#LILN#,LIVA,X5 GET LINAGE VALUE 
          IX6    X4+X1       LC + ADV QTY 
          SA6    LINCTR      PUT NEW LC BACK
          IX5    X5-X6       LIN - LC 
          SA2    SVMNEM 
          SB3    X2          RESET MNEMONIC FLAG
          SA3    LINELEN     GET LINE LENGTH
          EQ     INIT 
 SETPTRS  SPACE  2
 SETPTRS  DATA   0           SET B2 TO ADDR OF LIN TABLE, X4 TO LIN CTR 
*                            A5, A4, B2, X5 CHANGED - OTHERS SAVED
          FETCH  A0,LITP,X5 
          SB2    X5 
          SA4    LINCTR      GET LINAGE-COUNTER 
          EQ     SETPTRS
 STLINCT  SPACE  2
 STLINRT  BSS    0
          SA2    SVA0 
          SA0    X2          RESTORE A0 
 STLINCT  DATA   0           STORE LINAGE-COUNTER 
          SA1    LINCTR      GET COUNTER
          RJ     =XC.R1U06   CONVERT TO DISPLAY CODE
          RJ     SETPTRS     RESET B2 
          BX2    X1          SET UP 
          SA1    =XC.ZEROS
          MX0    1
          LX0    10 
          FETCH  B2+#LILC#,LIBC,X3 GET BCP
          SX5    4
          IX0    X0+X5       SIZE OF SENDER 
          LX0    8
          FETCH  B2+#LILC#,LISZ,X5 GET SIZE 
          IX0    X0+X5       SIZE OF DESTINATION
          FETCH  B2+#LILC#,LIAD,X5 ADDRESS
          SB3    X5 
          SX6    A0 
          SA6    =SSVA0      SAVE A0
          SB7    STLINRT
          EQ     =XC.RN1ND   MOVE TO PLACE
 WAA      SPACE  2
 WAALINE  DATA   0           LINE PUT HERE IN INIT
 WAA      DATA   0           CALL WRITE AFT ADV 
          SB6    WAA         RETURN 
          EQ     =XC.WAA
 BLLINE   DATA   0
          END 
