* 12/08/75 -- 16:00
* MODULE NAME: LNFORM
* NUMBER: 30
* PURPOSE: FORMAT OUTPUT LINES
*
*
         DEF      S30ADDLN          ADD LINE NUMBER TO OUTPUT LINE
         DEF      S30CTRLN          CENTER OUTPUT LINE
         DEF      S30RJSTY          RIGHT-JUSTIFY OUTPUT LINE
*
         REF      S35LINE           CONVERT BINARY KEY TO EBCDIC
         REF      S12WRD            FIND NEXT WORD IN LINE
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVLNSTA
            INVPRSTA
            INVWSSTA
*
*
         DEF      30P,30D
*
30P      EQU      %
         DATA     X'30'             MODULE NUMBER
         DATA     X'120875'         DATE
         DATA     X'1400'           TIME
*
*
         TITLE    '** LNFORM(30) **'
*
* S30ADDLN -- ADD LINE NUMBER TO OUTPUT LINE
*
* ENTRY PARAMETERS:
*        BUF3 = BYTE ADDR OF OUTPUT LINE
*        AC1  = NUMBER OF CHARS IN OUTPUT LINE
*        AC2  = KEY TO ADD TO OUTPUT LINE
*
S30ADDLN EQU      %
         SAVRTN
         LCI      2
         STM,AC1  LNSZ              SAVE LINE SIZE AND KEY
*
         LW,X3    BUF3              GET ADDR OF BUFFER
         AW,X3    AC1               CALC END OF LINE ADDR
         AI,X3    -1                DECREMENT TO LAST CHAR (CR)
         GET,D2   LN:CPSTN          GET CURRENT CARRIER POSITION
         JEZ,X1   WS:NTABS,ADDBLNKS GET NUMBER OF TAB SETTINGS
         GET,D1   WS:TABS,X1        GET LAST TAB SETTING
         AI,D1    -1
*
         CW,D1    D2                COMPARE LAST TAB TO POSITION
         BLE      ADDBLNKS             LESS, INSERT BLANKS
         JGZ,AC3  PR:LPFLG,LPTABS   TEST LP FLAG
*
*
         PAGE
*
*
         LI,AC3   #TAB              GET TAB CHAR
INSTABLP EQU      %
         STB,AC3  0,X3              STORE TAB IN OUTPUT LINE
         AI,X3    1                 INCREMENT OUTPUT POINTER
         MTW,1    LNSZ              INCREMENT OUTPUT SIZE
         AI,X1    -1                DECREMENT TAB COUNT
         BLEZ     INSLN                ZERO, INSERT LINE NUMBER
         GET,D1   WS:TABS,X1        GET NEXT TAB SETTING
         AI,D1    -1
         CW,D1    D2                COMPARE TO CURRENT POSITION
         BG       INSTABLP             YES, INSERT ANOTHER TAB
         B        INSLN             NOW INSERT LINE NUMBER
*
LPTABS   EQU      %
         SW,D1    D2                CALC NUMBER OF BLANKS
         INSCHAR  #BLANK,*X3,*D1    INSERT BLANKS TO TAB CHAR
         AWM,D1   LNSZ              INCREMENT LINE SIZE
         AW,X3    D1                INCREMENT POINTER
         B        INSLN             NOW INSERT LINE NUMBER
*
*
         PAGE
*
*
ADDBLNKS EQU      %
         CI,D2    #LSTCOL-12        TEST FOR ENOUGH ROOM
         BGE      RTNADDLN             NO, RETURN
         INSCHAR  #BLANK,*X3,3         YES, INSERT 3 BLANKS AT END
         MTW,3    LNSZ              INCREMENT LINE SIZE
         AI,X3    3                 INCREMENT LINE POINTER
*
INSLN    EQU      %
         STW,X3   LNPTR             SAVE LINE POINTER
         LW,AC2   LNKEY             GET KEY TO ADD
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 SAVE EBCDIC KEY
         STM,AC1  LNKEY
         MOVE,D1  BA(LNKEY),*LNPTR,8  MOVE KEY TO END OF LINE
         LW,X3    LNPTR             GET LINE POINTER
         AI,X3    8                 INCREMENT TO END OF LINE
         LI,AC3   #CR               GET CR CHARACTER
         STB,AC3  0,X3              STORE IN LINE
         LW,AC1   LNSZ              GET LINE SIZE
         AI,AC1   8                 INCREMENT FOR NUMBER
*
RTNADDLN EQU      %
         RETURN
*
         PAGE
*
* S30CTRLN -- CENTER OUTPUT LINE ON PAGE
*
* ENTRY PARAMETERS:
*        BUF3 = BYTE ADDR OF OUTPUT BUFFER
*        AC1  = NUMBER OF CHARS
*
S30CTRLN EQU      %
         SAVRTN
*
         CI,AC1   3                 TEST FOR CR ONLY
         BLE      RTNCTRLN             YES, RETURN
         GET,D1   #WIDTH            GET MAX LINE WIDTH
         GET,D2   LN:CPSTN          GET CURRENT CARRIER PSTN.
         SW,D1    D2                CALC. DIFFERENCE
         SAS,D1   -1                DIVIDE BY 2
         CI,D1    0                 TEST DIFFERENCE
         BLE      RTNCTRLN             ZERO, RETURN
*
         STW,AC1  LNSZ              SAVE LINE SIZE
         MTW,-2   LNSZ              DECREMENT LINE SIZE
         AW,AC1   D1                ADD BLANKS TO SIZE
         AW,D2    D1                ADD TO CPSTN
         PUT,D2   LN:CPSTN          STORE NEW POSITION
*
         LH,AC3   STDPRBUF          GET CONTROL BYTES
         CI,AC3   X'FF'             TEST FOR STOP CODE
         BAZ      SETFSTHW             NO, GO SET CONTROL BYTES
         JEZ,D2   PR:HFSAV,SETFSTHW TEST FOR H/F
         AW,AC3   D1                   YES, ADD BLANKS
*
*
         PAGE
*
*
SETFSTHW EQU      %
         STH,AC3  STDINBUF          STORE CONTROL BYTES
         INSCHAR  #BLANK,BA(STDINBUF)+2,*D1 INSERT BLANKS
         AI,D1    BA(STDINBUF)+2    ADD ADDR OF BUFFER
         MOVE,X1  BA(STDPRBUF)+2,*D1,*LNSZ  MOVE LINE
         LI,BUF3  BA(STDINBUF)      GET NEW ADDR
*
RTNCTRLN EQU      %
         RETURN
*
*
         PAGE
*
* S30RJSTY -- RIGHT-JUSTIFY OUTPUT LINE
*
* ENTRY PARAMETERS:
*        BUF3 = BYTE ADDR OF OUTPUT BUFFER
*        AC1  = NUMBER OF OUTPUT CHARS
*
S30RJSTY EQU      %
         SAVRTN
*
         GET,D1   LN:CPSTN          GET LAST CARRIER POSITION
         GET,D2   #WIDTH            GET LINE WIDTH
         SW,D2    D1                CALC BLANKS TO ADD
         BLEZ     RTNRJSTY              ZERO, RETURN
         STW,D2   NUMBLNKS          STORE NUMBER OF BLANKS TO ADD
*
         AI,BUF3  2                 SET BUFFER TO FIRST CHAR
         STW,BUF3 LNPTR             SAVE STARTING ADDR
         AI,AC1   -3                DECR. SIZE FOR CONTROL BYTES AND CR
         STW,AC1  LNSZ              SAVE ACTUAL LINE SIZE
         BLEZ     SETPTRSZ              ZERO, RETURN
         LI,D1    0                 INITIALIZE WORD COUNT
         STW,D1   NUMWRDS
         LW,X1    LNPTR             GET ADDR OF FIRST CHAR
         STW,X1   LSTTAB            INITIALIZE LAST TAB LOCATION
*
COUNTLP  EQU      %                 COUNT NUMBER OF WORDS
         BAL,SRTN S12WRD            FIND NEXT WORD
         CI,AC2   0                 TEST WORD FOUND
         BE       TSTNWRDS              NOT FOUND, TEST NUMBER
         CI,AC3   #TAB              TEST FOR TAB CHAR
         BNE      NOTTAB               NO, SKIP
         LI,D1    0
         STW,D1   NUMWRDS           RESET WORD COUNT
         STW,X2   LSTTAB            SAVE LAST TAB LOCATION
         B        SETSTCH
NOTTAB   EQU      %
         MTW,1    NUMWRDS              NO, INCR. WORD COUNT
SETSTCH  EQU      %
         LW,X1    X2                GET STARTING ADDR FOR NEW SEARCH
         B        COUNTLP           FIND NEXT WORD
*
*
         PAGE
*
*
TSTNWRDS EQU      %
         MTW,-1   NUMWRDS           DECR WORD COUNT BY ONE
         BLEZ     SETPTRSZ              ZERO, RETURN
*
TSTLSTRJ EQU      %
         LI,D1    1                 INITIALIZE R-J FLAG FOR 'FROM RIGHT'
         MTW,0    LSTRJFLG          TEST LAST R-J FLAG
         BLEZ     SETLSTRJ              SET FOR 'FROM-LEFT', GO CHANGE
         LI,D1    -1                SET R-J FLAG FOR 'FROM-LEFT'
SETLSTRJ EQU      %
         STW,D1   LSTRJFLG          SET LAST R-J FLAG
*
GETBLKSZ EQU      %
         LI,AC1   0                 GET NUMBER OF BLANKS FOR DIVIDE
         LW,AC2   NUMBLNKS
         DW,AC1   NUMWRDS           DIVIDE BY NUMBER OF PLACES
         STW,AC1  XBLNKS            REMAINDER IS EXTRA BLANKS
         STW,AC2  REGBLNKS          QUOTIENT IS NUMBER BETWEEN
*                                       EVERY WORD
         LI,X1    BA(STDINBUF)+2    SET NEXT OUTPUT POINTER
         STW,X1   NXTOUT
         LH,D1    STDPRBUF          MOVE CONTROL BYTES TO NEW BUFFER
         STH,D1   STDINBUF
*
*
         PAGE
*
*
MOVEWORD EQU      %
         LW,X1    LNPTR             GET LAST INPUT LINE POINTER
         LW,AC1   LNSZ              GET REMAINING INPUT LINE SIZE
         BAL,SRTN S12WRD            FIND NEXT WORD
         SW,X1    LNPTR             CALC NUMBER OF CHARS BEFORE WORD
         AW,X1    AC2               ADD WORD SIZE
         LCW,AC1  X1                GET NEGATIVE OF MOVE SIZE
         AWM,AC1  LNSZ              DECR. REMAINING LINE SIZE
*
         LW,X2    NXTOUT            GET ADDR OF NEXT OUTPUT CHAR
         STB,X1   X2                STORE COUNT FOR MBS
         LW,X1    LNPTR             GET FIRST CHAR TO MOVE
         MBS,X1   0                 MOVE WORD TO OUTPUT LINE
         STW,X1   LNPTR             SAVE NEXT INPUT LINE POINTER
         STW,X2   NXTOUT            SAVE NEXT OUTPUT CHAR
         CW,X1    LSTTAB            TEST FOR PAST LAST TAB
         BL       MOVEWORD             NO, MOVE NEXT WORD
*
         LW,AC1   REGBLNKS          INITIALIZE BLANKS TO ADD
         LW,AC2   XBLNKS            GET EXTRA BLANKS COUNT
         BLEZ     MVBLNKS               ZERO, GO ADD BLANKS
         MTW,0    LSTRJFLG          TEST R-J FLAG
         BLEZ     STXBLNK               'FROM-LEFT', USE EXTRA BLANK
         CW,AC2   NUMWRDS               'FROM-RIGHT', TEST #OF WORDS
         BL       MVBLNKS           DONT USE EXTRA BLANK YET
*
STXBLNK  EQU      %                 ADD EXTRA BLANK HERE
         AI,AC1   1
         MTW,-1   XBLNKS            DECR. EXTRA-BLANK COUNT
*
*
         PAGE
*
*
MVBLNKS  EQU      %
         LW,BUF1  X2                GET NEXT OUTPUT ADDR
         STB,AC1  BUF1              STORE BLANK COUNT FOR INSERT
         MBS,0    L(#BLANKS)        INSERT BLANKS IN OUTPUT LINE
         STW,BUF1 NXTOUT            SAVE NEXT OUTPUT ADDR
         MTW,-1   NUMWRDS           DECR WORD COUNT
         BGZ      MOVEWORD              >0, MOVE NEXT WORD
         BLZ      NWPSTN                <0, SET NEW CARRIER POSITION
         LI,D1    0                     =0, SET BLANK INSERT TO ZERO
         STW,D1   REGBLNKS
         B        MOVEWORD          MOVE LAST WORD
*
NWPSTN   EQU      %
         GET,D1   #WIDTH            GET LINE WIDTH
         PUT,D1   LN:CPSTN          SET NEW CARRIER POSITION
         LW,X1    NXTOUT            GET ADDR OF NEXT OUTPUT CHAR
         LI,AC2   #CR               STORE CR AT END
         STB,AC2  0,X1
         LI,BUF3  BA(STDINBUF)      GET ADDR OF NEW OUTPUT BUFFER
         LW,AC1   X1                GET LAST OUTPUT ADDR
         AI,AC1   -BA(STDINBUF)+1   CALC NEW SIZE
         B        RTNRJSTY          RETURN
*
SETPTRSZ EQU      %                 LINE UNCHANGED
         LI,BUF3  BA(STDPRBUF)      RESTORE OLD OUTPUT BUFFER
         LW,AC1   LNSZ              AND OLD LINE SIZE
         AI,AC1   3
*
RTNRJSTY EQU      %
         RETURN
*
         PAGE
*
* LOCAL VARIABLES
*
30D      CSECT    0                 START OF LOCALS
*
LNSZ     RES      1                 TEMP LINE SIZE
LNKEY    RES      2                 TEMP LINE KEY
LNPTR    RES      1                 OUTPUT LINE POINTER
*
NUMBLNKS RES      1                 NUMBER OF BLANKS FOR R-J
NUMWRDS  RES      1                 NUMBER OF WORDS IN LINE
LSTRJFLG RES      1                 LAST R-J DIRECTION
XBLNKS   RES      1                 EXTRA BLANK COUNT
REGBLNKS RES      1                 NUMBER OF BLANKS BETWEEN WORDS
NXTOUT   RES      1                 NEXT OUTPUT CHAR
LSTTAB   RES      1                 POINTER TO LAST TAB + 1
*
*
         USECT    #PLOC
         END
