* 03/03/76 -- 18:00
* MODULE NAME: PRINT
* NUMBER: 8
* PURPOSE: FORMAT AND PRINT TEXT OUTPUT,
*            OR FIND PAGE NUMBERS FOR INDEX PROGRAM
* ENTRY POINTS:
*
         DEF      C08PRINT,C08XP    'P' OR 'XP' COMMANDS
         DEF      C08VP             PRINT TO XGP
         DEF      C08PR             'REPRINT' COMMAND
         DEF      S08FNDPG          FIND PAGE NUMBERS FOR INDEXING
*
         DEF      S08PRLN,S08PGEND  PRINT OUTPUT LINE, END-OF-PAGE
         DEF      S08FMTPR          PRINT FORMATTED LINE
         DEF      S08ULBS           INSERT UL-BS FOR NEW INPUT LINE
         DEF      E08TU,E08TF       'TU' AND 'TF' COMMANDS
         DEF      S08SCMD           PAGE FORMATTING COMMANDS
         DEF      S083010I          INITIALIZE 3010 TERMINAL
         DEF      PTABSLN           PARAGRAPH INDICATOR
         DEF      PRINTBRK          BREAK RETURN ADDR
         DEF      LSTPLN            PARAGRAPH LAST-LINE FLAG
*
*
         REF      S09RDKEY,S09RDNXT READ TEXT LINES
         REF      S09RDATN          READ ATTN-ATTN RESPONSE
         REF      S09RESLN,S09STABS RESET OUTPUT LINE, INSERT TABS
         REF      S09WRSTA,S09RDSTA SAVE/RESTORE PRINT STATUS
         REF      S09SAVHF          SAVE H/F LINE
         REF      S09PRHDG,S09PRFTG PRINT HEADING OR FOOTING
*
         PAGE
*
         REF      S30RJSTY,S30CTRLN R-J, CENTER OUTPUT LINES
         REF      S30ADDLN          ADD LINE NUMBER
*
         REF      S37TOP,S37PGEND   TOP-OF-PAGE, END-OF-PAGE
         REF      S37SKLNS          SKIP LINES
         REF      S37SAVKT,S39SAVBL SAVE K-T/BLOCK LINES
         REF      E39EBLK           END BLOCK DEFINITION
         REF      S37PRNT           PRINT OUTPUT PAGE
         REF      S38PSCAN          SCAN INPUT LINES
         REF      S12INIT           INITIALIZE TABLE PAGES
*
         REF      S03OPNPR          OPEN PRINT FILE
         REF      S03SETPR,S03CLSPR  OPEN,CLOSE PRINT FILE
*
         REF      S05RANGE,S05GETLN FIND ACTUAL KEYS
         REF      S05LOC            LOCATE PHRASE IN LINE
*
         REF      S27RCPY,S27WCPY   READ/WRITE COPY FILE
         REF      S27EJLP,S27RHDR   EJECT LP PAGE, READ HEADER FILE
         REF      S27SETLP          LINE PRINTER SET-UP
         REF      S29STD,S27READ    PRINT MESSAGE, READ ATTN
         REF      ZRORTNST          RESET RETURN STACK
         REF      BOXFLG
         REF      CREDFLG           'TEXT' CREDIT FLAG
         REF      S27XOPEN,S27XCLSE OPEN,CLOSE XGP FILE
         REF      S27OVPG           OPEN XGP FILE FOR GO
         REF      S60XGO            INITIATE XGP JOB
         REF      S37OUTLN          PRINT OUTPUT LINE
         REF      S27PRINT          PRINT MESSAGES
         REF      S35CNVRT          CONVERT TO EBCDIC
*
         REF      S42WRPRN          SAVE PRINTOUT LINES IN DYNAMIC MEMORY
         REF      S42RDPRN          GET PRINTOUT LINES FROM DYNAMIC MEMORY
         REF      S42FRPGS          FREE DYNAMIC MEMORY PAGES AFTER PRINTOUT
         REF      E45NWPRN          NAME/ADDRESS NEW PRINT
         REF      S45XNAMD          CLEAN UP N/A MODE FOR EXIT
         REF      S41STOP           KILL BOX-DRAWING.
         REF      NAFLG             NAME/ADDRESS FLAG
*
         REF      FILEFLG           FILE OUTPUT FLAG
         REF      M:LO              M:LO DCB
         REF      M:UC              M:UC DCB
         REF      S36M:BCD          SET BCD MODE
         REF      E37EKT            PROCESS END OF K-T
         REF      S27CLOSE          CLOSE A DCB
         REF      S04XFILE          EXIT FILE OUTPUT MODE
         REF      S37LP             LINE PRINTER TO QUEUE
         REF      3010FLG           3010 TERMINAL FLAG
         REF      S363010R          RESET 3010 TERMINAL
         REF      TEMPW             TEMPORARY WIDTH WORD
         REF      DCBADDR           DCB ADDRESS SAVE WORD
         REF      BATCHFLG          BATCH MODE FLAG
         REF      S02BCHK           BATCH MODE ERROR CHECK
         REF      S36INIT           INITIALIZE 3010 TERMINAL
         REF      LFTMRGN           LEFT MARGIN
         PAGE
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVCMDSTA
            INVWSSTA
            INVLNSTA
            INVPRSTA
            INVHDRSTA
*
*
         DEF      8P,8D,8END
8P       EQU      %
         DATA     X'08'             MODULE NUMBER
         DATA     X'030376'         DATE
         DATA     X'1800'           TIME
*
*
         TITLE    '** PRINT(8) **'
*
* C08PRINT,C08XP -- PRINT COMMANDS
*
C08PRINT EQU      %                 'P' COMMAND
         SAVRTN
         LI,D1    0                 SET LP FLAG FOR TERMINAL
         PUT,D1   PR:VFLG           RESET XGP FLAG
         STB,D1   BATCHFLG          SET TO OUTPUT THRU M:LO
         LW,AC1   3010FLG           TEST FOR 3010 OUTPUT
         STB,AC1  3010FLG           SET FOR FORWARD/BACKWARD IF 3010
         LW,AC1   FILEFLG           TEST FOR FILE OUTPUT MODE
         STB,AC1  FILEFLG           SET TO GO TO FILE IF FLAG ON
         B        PXPINIT
*
C08XP    EQU      %                 'XP' COMMAND
         SAVRTN
         BAL,SRTN S27SETLP          SET-UP LINE PRINTER OUTPUT
         LI,D1    0                 XGP FLAG OFF
         PUT,D1   PR:VFLG
*
XPGO     EQU      %
         LI,D1    1                 SET LP FLAG FOR LINE PRINTER
         CI,SR3   0                 TEST FOR SET-UP ERROR
         BE       PXPINIT              NO, INITIALIZE FOR PRINTOUT
         LI,AC1   30                   YES, 'LP ERROR' MESSAGE
         BAL,SRTN S29STD            PRINT ERROR MESSAGE
         B        RTNPR             CLOSE LP FILE AND RETURN
*
PXPINIT  EQU      %
         LI,D2    1
         STW,D2   PAGECNT           INITIALIZE PAGE COUNT
         GET,D2   PR:VFLG           SAVE XGP FLAG
         STW,D2   SAVVFLG
         BAL,SRTN S08INIT           INITIALIZE PRINTOUT STATUS
         CI,SR3   0                 TEST FOR INITIALIZATION ERROR
         BNE      RELPRFLE              YES, RELEASE PR FILE
         JNEZ,D1  PR:LPFLG,CALLPRNT TEST LP FLAG FOR TERMINAL
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     SVSTA             YES, SKIP 'SIGNAL' MSG
         MTW,0    BATCHFLG          BATCH OUTPUT MODE
         BGZ      SVSTA             YES
         LI,AC1   16                'SIGNAL WHEN READY' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         BAL,SRTN S363010R          RESET 3010 TERMINAL
         BAL,SRTN S09RDATN          GET ATTN-ATTN RESPONSE
         CI,SR3   #ATTN             TEST FOR ATTN-ATTN
         BNE      RELPRFLE              NO, RELEASE PR FILE
SVSTA    RES      0
         BAL,SRTN S09WRSTA              YES, SAVE PRINTOUT STATUS
*
CALLPRNT EQU      %
         BAL,SRTN S37TOP            GO TO TOP-OF-PAGE
         B        STNWLN            PRINT DOCUMENT
         PAGE
*
* C08PR -- REPRINT FROM START OF PREVIOUS PAGE
*
C08PR    EQU      %
         SAVRTN
         BAL,SRTN S02BCHK           CHECK FOR BATCH MODE
*
         LI,AC1   #INOUT            OPEN PRINT FILE IN INOUT MODE
         BAL,SRTN S03OPNPR
         CI,SR3   0                 TEST FOR FILE OK
         BNE      ERRPR                 NO, PR ERROR
         LI,AC1   16                'SIGNAL WHEN READY' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         LW,AC1   3010FLG           TEST FOR 3010 OUTPUT
         STB,AC1  3010FLG           SET FOR FORWARD/BACKWARD IF 3010
         BAL,SRTN S363010R          RESET 3010 TERMINAL
*
PRNTOVER EQU      %
         MTW,0    NAFLG             FORM LETTER WITH NAME/ADDR FILE
         BEZ      POVER1            NO
         BAL,SRTN E45NWPRN          READ NEXT NAME/ADDRESS ENTRY
         CI,SR3   3                 EOF
         BE       PRSTOP            YES, FINISHED
         MTW,0    CFRMFLG           CONTINUOUS-FORM MODE
         BNEZ     POVER4            YES
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     POVER4            YES
         MTW,0    BATCHFLG          BATCH MODE
         BGZ      POVER4            YES
         BAL,SRTN S363010R          RESET 3010 TERMINAL
POVER1   RES      0
         BAL,SRTN S09RDATN          GET ATTN-ATTN FOR PRINT
         CI,SR3   #ATTN             TEST ATTN-ATTN
         BNE      PRSTOP            NO, STOP PRINTOUT
POVER4   RES      0
         BAL,SRTN S09RDSTA          RESTORE LAST PRINT STATUS
* S09RDSTA DOES NOT RETURN HERE.  IT RESTORES RETURN
* STACK AND RETURNS TO LAST SAVED LINK.
*
ERRPR    EQU      %                 PR ERROR
         LI,AC1   10                'ILLEGAL ACTION' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
RELPRFLE EQU      %
         BAL,SRTN S12INIT           RELEASE TABLE PAGES
         LI,AC1   #REL              CLOSE PRINT FILE WITH RELEASE
         B        CLSPRFLE          CLOSE FILE
*
*
C08VP    EQU      %
         SAVRTN
*
         LI,D1    1                 SET XGP FLAG ON
         PUT,D1   PR:VFLG
         GET,D1   #FLAGS,:K(8)      GET XGP GO FLAG
         STW,D1   XGOFLG            SAVE
         BEZ      VP20              XGP FLAG RESET
         BAL,SRTN S27OVPG           OPEN XGP FILE FOR GO
         B        VP30
VP20     RES      0
         BAL,SRTN S27XOPEN          OPEN XGP FILE
VP30     RES      0
         LI,SR3   0                 LP ERROR FLAG OFF
         B        XPGO              GO SET XGP FLAG
         PAGE
*
* S08FNDPG -- GET PAGE NUMBERS FOR INDEX ROUTINE
*
* ENTRY PARAMETERS:
*        D1 = KEY OF LINE TO FIND PAGE NUMBER
*        AC2= PAGE NUMBER (NEGATIVE FOR FIRST CALL, 0 FOR LAST CALL)
*
* EXIT PARAMETERS:
*        AC1= 0 IF LINE LIES COMPLETEY ON PAGE
*           = DISPLACEMENT IF LINE OVERLAPS PAGE
*        AC2= PAGE NUMBER WHERE LINE ENDS
*
S08FNDPG EQU      %
         SAVRTN
*
         CI,AC2   0                 TEST FOR INITIALIZATION CALL
         BE       RELPRFLE              NO, END CALL
         BG       FNDPGNUM              NO, FIND PAGE NUMBER
         STW,D1   SVFNDKEY              YES, SAVE FIND KEY
*
         LI,X1    SZCMDINIT         INITIALIZE COMMAND STATUS TABLE
         LI,D1    0
ZROCMDLP EQU      %
         PUT,D1   #CMDINIT,X1
         BDR,X1   ZROCMDLP
         LCW,D1   AC2               SET STARTING PAGE NUMBER
         PUT,D1   #DSHW,:K(1)
*
         LI,D1    -1                SET LP FLAG NEGATIVE
         BAL,SRTN S08INIT           INITIALIZE PRINTOUT
*
*
         PAGE
*
*
         LI,AC2   -1                INITIALIZE ERROR RETURN
         CI,SR3   0                 TEST FOR INITIALIZATION ERROR
         BNE      RELPRFLE              YES, RETURN
         BAL,SRTN S37TOP                NO, GO TO TOP-OF-PAGE
         BAL,SRTN S08PRINT          NOW FORMAT DOCUMENT
         LW,D1    SVFNDKEY          GET SAVED FIND KEY
FNDPGNUM EQU      %
         LI,BUF2  BA(INDXDISP)      GET BUFFER ADDR FOR FIND INFO
         LI,AC1   8                 8 CHARS
         LW,AC2   D1                GET FIND KEY
         BAL,SRTN S27RCPY           READ INDEX INFO
         CI,AC1   0                 TEST FOR RECORD FOUND
         BE       RTNFNDPG              NO, RETURN
*
         LCI      2                 GET RETURN ARGS
         LM,AC1   INDXDISP
*
RTNFNDPG EQU      %                 RETURN TO INDEX PROGRAM
         RETURN
*
*
         PAGE
*
* S08INIT -- INITIALIZATION FOR PRINT ROUTINE
*
S08INIT  EQU      %
         SAVRTN
*
         LI,X1    SZPRSTA           INITIALIZE PR STATUS TABLE
         LI,D2    0
ZROPRLP  EQU      %
         PUT,D2   PR:INIT,X1
         BDR,X1   ZROPRLP
         PUT,D1   PR:LPFLG          NOW SET LP FLAG
         LW,D2    SAVVFLG           RESTORE XGP FLAG
         PUT,D2   PR:VFLG
         BRKCTRL  BRKMSG            SET BREAK CONTROL
*
         LI,D2    0                 INITIALIZE FORM FLAG
         CI,D1    0                 TEST LP FLAG
         BNE      STFRMFLG             SET, STORE 0 FOR FORM-LETTER
         GET,D2   WS:FORM           GET FORM-LETTER FLAG
*
STFRMFLG EQU      %
         STW,D2   FORMFLG           STORE FORM-LETTER FLAG
         DEPZ,D1  WS:FORM           RESET WS FORM-LETTER FLAG
         BAL,SRTN S03SETPR          SET-UP PRINT FILE
         CI,SR3   0                 TEST FOR PRINT FILE ERROR
         BEZ      RTBLPG               OK, CONTINUE
         LI,AC1   45                   'BAD FILE' MESSAGE
         B        INITERR           ERROR RETURN
*
RTBLPG   EQU      %
         BAL,SRTN S12INIT           RELEASE TABLE PAGES
         BAL,SRTN S083010I          INITIALIZE 3010 TERMINAL FOR OUTPUT
*
*
         PAGE
*
*
GPGNUM   EQU      %
         JGZ,D1   (#DSHW,:K(1)),SETPGCTR TEST FOR STARTING PAGE NUMBER
         LI,D1    1                 NO, START AT PAGE 1
SETPGCTR EQU      %
         AI,D1    -1                DECREMENT TO START
         PUT,D1   PR:PGNUM          SAVE STARTING PAGE NUMBER
*
GFLGS    EQU      %                 NOW GET COMMAND FLAGS
         LI,X1    7                 SEVEN FLAGS
GFLGLP   EQU      %
         GET,D1   #FLAGS,X1         GET COMMAND FLAG
         STW,D1   LOCFLAGS,X1       STORE IN LOCAL FLAGS
         BDR,X1   GFLGLP            GET ALL SEVEN
*
         LI,X1    2                 GET INDEX TO TEST SPACING
TSTSPFLG EQU      %
         MTW,0    DSFLG-1,X1        TEST DS AND TS FLAGS
         BNEZ     SETSPACE              SET
         BDR,X1   TSTSPFLG              NOT SET, TEST NEXT
SETSPACE EQU      %
         AI,X1    1                 INCREMENT INDEX FOR SPACING
         PUT,X1   PR:SPACE          SAVE SPACING
*
* CHECK FOR STARTING PHRASE AND SAVE
*
TPHRASE  EQU      %
         JEZ,D1   (#NCCS,:K(1)),SETPHRSZ   GET STARTING PHRASE SIZE
         CI,D1    MXPHRBUF          TEST MAX PHRASE SIZE
         BLE      MVPHRASE             OK, MOVE PHRASE
         LI,D1    MXPHRBUF             TOO BIG, SET TO MAX
*
MVPHRASE EQU      %
         GET,X1   #CS,:K(1)         GET ADDR OF STARTING PHRASE
         LI,X2    BA(PHRBUF)        ADDR OF BUFFER TO SAVE PHRASE
         STB,D1   X2                COUNT FOR MBS INSTR
         MBS,X1   0                 MOVE  STARTING PHRASE TO SAVE BUFFER
*
SETPHRSZ EQU      %
         STW,D1   PHRSZ             SAVE SIZE OF STARTING PHRASE
*
*
*
         PAGE
*
*
TSTULFLG EQU      %
         LI,D2    0                 INITIALIZE FOR NO UNDERLINES
         JNEZ,D1  PR:LPFLG,SETULFLG TEST LP FLAG
         LW,D1    AEFLG             AS-ENTERED FLAG MUST BE OFF
         AW,D1    LNWUFLG           W/O UNDERLINE FLAG MUST BE OFF
         SW,D1    LNFLG             LINE NUMBER FLAG MUST BE ON
         BGEZ     SETULFLG              NO, SET FLAG OFF
         LI,D2    1                     ALL OK, SET FLAG ON
*
SETULFLG EQU      %
         PUT,D2   PR:ULFLG          STORE UNDER LINE FLAG
*
GPDEPTH  EQU      %
         MTW,0    CFRMFLG           TEST CONTINUOUS-FORM OPTION
         BEZ      GETRN                 ZERO, GO GET PRINT RANGE
         GET,D2   #LDEPTH               SET, GET C-F DEPTH
         GET,D1   #DEPTH            GET PRINTABLE LINES DEPTH
         SW,D2    D1                FIND DIFFERENCE
         BLEZ     GETRN                 <=0, NO C-F PRINTOUT
         STW,D2   CFRMFLG               >0, STORE DIFFERENCE IN C-F FLAG
*
*
         PAGE
*
*
GETRN    EQU      %
         GET,D1   #FKEY             INITIALIZE PRINT RANGE TO
         GET,D2   #LKEY               TO FULL DOCUMENT
         JEZ,AC1  #RN1,TSTRANGE     TEST FOR STARTING LINE
         LW,D1    AC1                  YES, USE FOR RANGE
         JEZ,AC1  #RN2,TSTRANGE     TEST FOR ENDING LINE
         LW,D2    AC1                  YES, USE FOR RANGE
*
TSTRANGE EQU      %
         BAL,SRTN S05RANGE          GET RANGE OF LINE KEYS
         CI,AC1   0                 TEST STARTING KEY
         BNE      STRANGE   OK, STORE             RANGE
         LI,AC1   9                 'NOTHING TO PRINT' MESSAGE
         B        INITERR           INITIALIZATION ERROR
*
STRANGE  EQU      %
         LW,D1    AC2               GET LAST KEY
         PUT,D1   PR:LSTLN          STORE LAST PRINT KEY
         STW,D1   LSTLN
         PUT,AC1  PR:FSTLN          STORE FIRST PRINT KEY
*
*
         PAGE
*
*
HDRINIT  EQU      %
         GET,D1   #DEPTH            INITIALIZE REMAINING LINES COUNT
         PUT,D1   PR:RLNS
         DEPZ,D1  #FLAGS,:K(1)      SET COMMAND CENTERING FLAG TO ZERO
         BAL,SRTN E08TU             SET UNFORMATTED MODE
         LW,D1    AEFLG             TEST AS-ENTERED FLAG
         BNEZ     SETAEMDE              SET, INITIALIZE A-E MODE
*
         STW,D1   MODEFLG           INITIALIZE MODE FLAG
         STW,D1   HDGFLG                HEADING FLAG
         STW,D1   FTGFLG                FOOTING FLAG
         STW,D1   HFCFLG                CENTERING FLAG
         LI,D1    3
         STW,D1   MODEKNT               MODE COUNT
*
*
         PAGE
*
*
         GET,AC1  PR:FSTLN          GETTKEY OF FIRST TEXT LINE
         SLD,AC1  -32               SET TO POSITION HEADER FILE
         BAL,SRTN S27RHDR           READ HEADER FILE
         CI,AC2   0                 TEST FOR KEY FOUND
         BNE      RDHDRLP               YES, READ PREVIOUS
         LI,AC2   -1                    NO, READ ONLY ONE BACK
         B        GHDRADDR          GO GET PREVIOUS HEADER
*
RDHDRLP  EQU      %
         LI,AC2   -2                SET KEY TO READ PREVIOUS KEY
GHDRADDR EQU      %
         LI,BUF2  BA(HDRSTA)        GET ADDR OF HEADER STATUS
         LI,AC1   4                 READ CONTROL WORD ONLY (SIZE=4)
         BAL,SRTN S27RHDR           READ PREVIOUS KEY
         CW,AC2   L(#ZROKEY)        TEST FOR ZERO KEY
         BLE      HDRFIN                YES HEADER FILE DONE
*
*
         PAGE
*
*
HDRFND   EQU      %
         JEZ,D1   HDR:FMTCDE,RDHDRLP    TEST FOR FORMATTING RECORD
         CI,D1    0                 TEST FOR H/F CODE
         BG       SETPRMDE              NO, SET UNF/FMT MODE
         LCW,X1   D1                GET H/F INDEX
         MTW,0    HDGFLG-1,X1       TEST FOR ALREADY SET
         BNEZ     RDHDRLP               YES, READ PREVIOUS RECORD
         MTW,1    HDGFLG-1,X1           NO, SET FLAG
         STW,AC2  FSTLN             SAVE KEY OF H/F COMMAND
         GET,D2   PR:LSTLN          GET LAST LINE OF PRINT COMMAND
         STW,D2   LSTLN             SAVE LAST LINE
*
HDRENDLP EQU      %                 FIND END OF H/F LINES
         LI,BUF2  BA(HDRSTA)        GET ADDR OF HDR RECORD BUFFER
         LI,AC1   4                 READ CONTROL RECORD
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RHDR           READ NEXT HEADER RECORD
         STW,AC2  FNDKEY
*
         CI,AC2   0                 TEST FOR EOF FOUND
         BE       INITREL               YES, ERROR RETURN
         CW,AC2   LSTLN             TEST FOR LAST PRINT LINE
         BGE      INITREL               YES, ERROR RETURN
         JEZ,D1   HDR:HFEND,HDRENDLP   TEST FOR H/F END CODE
         PAGE
*
*
READHF   EQU      %
         LW,AC2   FSTLN             GET KEY OF FIRST H/F LINE
         BAL,SRTN S09RDKEY          READ FIRST H/F LINE
         MTW,-1   FNDKEY            DECREMENT LAST KEY TO READ
*
         BAL,SRTN S08PRINT          GO SET-UP H/F LINES
         LI,AC1   0                 NOW POSITION FILE AT FIRST H/F LINE
         LW,AC2   FSTLN
         BAL,SRTN S27RHDR
         B        SETMDRTN          SET UP RETURN
*
SETPRMDE EQU      %                 SET UNF/FRM MODE
         MTW,0    MODEFLG           TEST MODE FLAG
         BNEZ     RDHDRLP               ALREADY SET, READ PREVIOUS RECD
         STW,D1   MODEFLG           SAVE MODE FLAG
         GET,D2   HDR:CTRFLG        GET CENTERING FLAG
         STW,D2   HFCFLG            SAVE CENTERING FLAG
*
SETMDRTN EQU      %
         MTW,-1   MODEKNT           DECREMENT MODE COUNT
         BGZ      RDHDRLP               MORE, READ LAST FORMAT
*
*
         PAGE
*
*
HDRFIN   EQU      %
         LW,D1    MODEFLG           GET MODE FLAG
         AI,D1    -1                DECRMENT TO TEST MODE TYPE
         BGZ      INITFMT               POSITIVE, SET FORMATTED MODE
         LW,D1    HFCFLG                <=0, SET UNFORMATTED MODE
         PUT,D1   #FLAGS,:K(1)      STORE FLAGS IN COMMAND STATUS
         BAL,SRTN E08TU             SET UNF MODE
         B        TXTINIT           NOW INITIALIZE TEXT FILE
*
INITFMT  EQU      %
         BAL,SRTN E08TF             SET FORMATTED MODE
         B        TXTINIT           INITIALIZE TEXT FILE
*
*
         PAGE
*
*
SETAEMDE EQU      %
         LI,D1    -1                SET 'AS-ENTERED' MODE
         PUT,D1   PR:FMTFLG
*
TXTINIT  EQU      %
         GET,AC2  PR:FSTLN          GET KEY FOR FIRST TEXT LINE
         BAL,SRTN S09RDKEY          READ FIRST TEXT LINE
         LCI      2                 SAVE TAB COUNTS
         STM,X1   TAB1
*
         LW,X2    PHRSZ             GET SIZE OF STARTING PHRASE
         BLEZ     INITPGFL             ZERO, GO INITIALIZE DISP.
         LW,D1    X2                   >0, SAVE SIZE
         LI,X2    BA(PHRBUF)        GET ADDR OF PHRASE
         STB,D1   X2                STORE SIZE FOR S05LOC
         GET,X1   LN:INPTR          GET ADDR OF INPUT LINE
         STW,X1   INPTR             SAVE ADDR
         BAL,SRTN S05LOC            LOCATE PHRASE IN LINE
*
         CI,AC2   0                 TEST FOR PHRASE FOUND
         BNEZ     GETDISP               YES, FIND DISP. OF PHRASE
         LI,AC1   14                    NO, PRINT ERROR MESSAGE
         B        INITERR
*
*
         PAGE
*
*
GETDISP  EQU      %                 CALC DISP FOR THIS LINE
         PUT,X1   LN:INPTR          SAVE NEW START-OF-LINE ADDR
         SW,X1    INPTR             CALC SIZE DIFFERENCE
         GET,D2   LN:INSZ           GET ORIGINAL LINE SIZE
         SW,D2    X1                SUBTRACT DIFFERENCE
         PUT,D2   LN:INSZ           STORE NEW LINE SIZE
         LW,X2    X1                GET DISPLACEMENT
*
         JLEZ,D1  PR:FMTFLG,INITPGFL   TEST FOR FORMATTED MODE
         LW,D1    TAB1                     YES, GET LEADING TABS COUNT
         BLEZ     INITPGFL                      NO TABS, INITIALIZE DISP.
         CW,D1    X2                COMPARE TAB COUNT TO DISP.
         BLE      SUBTABS              OK, SUBTRACT FROM LINE POINTER
         LW,D1    X2                   TOO MANY, USE DISPLACEMENT
*
SUBTABS  EQU      %
         GET,D2   LN:INPTR          GET INPUT LINE POINTER
         SW,D2    D1                SUBTRACT TAB COUNT
         PUT,D2   LN:INPTR          SAVE POINTER
         GET,D2   LN:INSZ           GET INPUT LINE SIZE
         AW,D2    D1                ADD TAB COUNT
         PUT,D2   LN:INSZ           SAVE NEW SIZE
*
INITPGFL EQU      %
         STW,X2   INDXDISP          STORE DISP. FOR FIRST LINE
         GET,D1   PR:PGNUM          GET PAGE NUMBER
         AI,D1    1                 INCREMENT FOR FIRST PAGE
         STW,D1   INDXPAGE          SAVE INDEX PAGE NUMBER
*
INITFIN  EQU      %
         LI,SR3   0                 SET ERROR RETURN OFF
         STW,SR3  FNDKEY            INITIALIZE FIND KEY
         STW,SR3  ENDFLG            INITIALIZE END FLAG
         STW,SR3  XTRAFLG           INITIALIZE XTRA LINE FLAG
*
RTNINIT  EQU      %                 RETURN
         RETURN
*
INITERR  EQU      %
         BAL,SRTN S29STD            PRINT ERROR MESSAGE
INITREL  EQU      %
         LI,SR3   1                 SET ERROR RETURN ON
         B        RTNINIT           RETURN
*
*
         PAGE
*
* S08PRINT -- FORMAT AND PRINT DOCUMENT
*
*
S08PRINT EQU      %
         SAVRTN
         B        STNWLN            STORE FIRST INPUT LINE INFO.
*
RDNXTLN  EQU      %
         JGEZ,D1  PR:LPFLG,RDINBUF  TEST  LP FLAG FOR INDEXING (-1)
         MTW,0    INDXPAGE          TEST INDEX PAGE
         BEZ      SETNWPG               ZERO, GO SET NEW PAGE
*
         LI,BUF3  BA(INDXDISP)      GET ADDR OF INDEX DISP AND PAGE
         LI,AC1   8                 SIZE=8 BYTES
         LW,AC2   CKEY              GET KEY OF LAST INPUT LINE
         BAL,SRTN S27WCPY           WRITE INDEXING INFO. ON PRINT FILE
*
SETNWPG  EQU      %
         GET,D1   PR:PGNUM          GET CURRENT PAGE NUMBER
         STW,D1   INDXPAGE          SAVE IN INDEX PAGE NUMBER
         LI,D1    0                 SET INITIAL DISP. TO ZERO
         STW,D1   INDXDISP
*
*
         PAGE
*
*
RDINBUF  EQU      %
         BAL,SRTN S09RDNXT          READ NEXT INPUT LINE
         MTW,0    FNDKEY            TEST FOR FIND KEY
         BEZ      TSTEOF                NO, GO TEST EOF
         CI,AC1   0                     YES, TEST FOR EOF
         BLE      RTNPRINT          EOF FOUND, RETURN
         CW,AC2   FNDKEY            TEST FOR KEY AFTER FIND KEY
         BG       RTNPRINT              YES, RETURN
*
TSTEOF   EQU      %
         JNEZ,D1  PR:BLKCKEY,TSTBLEOF  TEST BLOCK DEF. FLAG
         CI,AC1   0                 TEST FOR EOF
         BLE      TXTEOF                YES, HANDLE END-OF-PRINT
         CW,AC2   LSTLN             TEST FOR LAST KEY
         BG       TXTEOF                YES, END-OF-PRINT
STMTABS  EQU      %
         LCI      2                 SAVE TAB COUNTS
         STM,X1   TAB1
*
STNWLN   EQU      %
         GET,D1   LN:INPTR          SAVE INPUT POINTER
         STW,D1   INPTR
         GET,D1   LN:CKEY           SAVE CURRENT LINE KEY
         STW,D1   CKEY
         GET,D2   LN:STKEY          GET OUTPUT LINE START KEY
         STW,D2   SVSTKEY           SAVE
         CI,D2    0                 TEST FOR NOT SET
         BG       TSTFMT                SET, GO TEST FORMAT TYPE
         PUT,D1   LN:STKEY          SET NEW START KEY
*
*
         PAGE
*
*
TSTFMT   EQU      %
         JGZ,D1   PR:FMTFLG,FMTOUTLN TEST FORMAT FLAG
         BAL,SRTN S08ULBS               UNFORMATTED, INSERT UL-BS
         BAL,SRTN S38PSCAN          SCAN AND FORMAT OUTPUT LINE
         JLEZ,D1  LN:OUTSZ,RESUNFLN TEST OUTPUT SIZE
         BAL,SRTN S08PRLN               NON-ZERO, PRINT LINE
*
RESUNFLN EQU      %
         BAL,SRTN S09RESLN          RESET OUTPUT LINE
         B        RDNXTLN           READ NEXT INPUT LINE
*
TSTBLEOF EQU      %
         CI,AC1   0                 TEST FOR EOF
         BG       STMTABS              NO, STORE TABS
         BAL,SRTN E39EBLK              YES, END-BLOCK
         B        RDINBUF           NOW GET NEXT LINE
*
*
         PAGE
*
*
FMTOUTLN EQU      %
         LW,X3    TAB1              GET INITIAL TABS COUNT
         BGEZ     TSTPGRPH              >=0, TEST FOR NEW PARAGRAPH
         STW,X3   PTABSLN               <0, LINE IS CR ONLY
         LI,D1    1                 SET PARAGRAPH LAST-LINE FLAG
         STW,D1   LSTPLN
         BAL,SRTN S08FMTPR          PRINT REMAINDER OF PREVIOUS PAR.
         LI,D2    1                 SET NEW-PARAGRAPH FLAG
         PUT,D2   PR:PRFLG
*
         LI,D1    0                 SET INDEX PAGE TO ZERO FOR CR LINE
         STW,D1   INDXPAGE
         JLEZ,D1  PR:RLNS,RDNXTLN   TEST REMAINING LINES
         JNEZ,D1  PR:TOPFLG,RDNXTLN TEST TOP-OF-PAGE
*
         GET,X1   LN:OUTPTR         GET OUTPUT POINTER
         LI,AC2   #BLANK            GET BLANK CHAR
         STB,AC2  0,X1              STORE BLANK IN OUTPUT LINE
         AI,X1    1                 INCREMENT OUTPUT POINTER
         PUT,X1   LN:OUTPTR         SAVE NEW OUTPUT POINTER
         LI,AC1   1                 ADD ONE FOR BLANK
         PUT,AC1  LN:OUTSZ          SAVE NEW OUTPUT SIZE
         PUT,AC1  LN:CPSTN          SET CARRIER POSITION
         LW,D1    CKEY              GET CURRENT INPUT KEY
         PUT,D1   LN:STKEY          STORE IN LINE START KEY
         LI,D1    0                 RESET PARAGRAPH LAST-LINE FLAG
         STW,D1   LSTPLN
         BAL,SRTN S08FMTPR          PRINT OR LINE
         B        RDNXTLN           READ NEXT INPUT LINE
*
*
         PAGE
*
*
TSTPGRPH EQU      %
         MTW,0    PTABSLN           TEST FOR NEW PARAGRAPH
         BLZ      PRNTLST               YES, PRINT END OF PREVIOUS PAR.
         CI,X3    0                 TEST FOR ZERO TABS
         BE       NWINLN                YES, SAME PARAGRAPH
         CW,X3    PTABSLN           COMPARE TO PREVIOUS TABS
         BE       NWINLN                EQUAL, SAME PARAGRAPH
*
PRNTLST  EQU      %
         STW,X3   PTABSLN           SAVE FIRST LINE TABS
         LI,D1    1                 SET PARAGRAPH LAST-LINE FLAG
         STW,D1   LSTPLN
         BAL,SRTN S08FMTPR          PRINT END OF PREVIOUS PARAGRAPH
         LI,D2    1                 SET NEW-PARAGRAPH FLAG
         PUT,D2   PR:PRFLG
         LW,D1    CKEY              GET NEW LINE KEY
         PUT,D1   LN:STKEY          SET LINE START KEY
         LW,X3    TAB2              GET SECOND LINE TABS
         STW,X3   PTABSLN           SAVE IN INITIAL TAB COUNT
*
         GET,D1   PR:RLNS           GET REMAINING LINES
         GET,AC1  PR:SPACE          GET SPACING SIZE
         CW,D1    AC1               TEST FOR ROOM
         BG       NWINLN               YES, NEW INPUT LINE
         BAL,SRTN S08PGEND          SKIP TO BOTTOM
*
*
         PAGE
*
NWINLN   EQU      %
         GET,D1   LN:INPTR          GET INPUT LINE ADDR
         AW,D1    TAB1              INCR. BY TAB COUNT
         PUT,D1   LN:INPTR          STORE NEW INPUT POINTER
         GET,D1   LN:INSZ           GET INPUT LINE SIZE
         SW,D1    TAB1              DECR. BY TAB COUNT
         PUT,D1   LN:INSZ           STORE NEW LINE SIZE
NWULBS   EQU      %
         BAL,SRTN S08ULBS           INSERT UL-BS SEQUENCE
NWSAVPTR EQU      %
         GET,D1   LN:OUTPTR         GET CURRENT OUTPUT POINTER
         STW,D1   SVOUTPTR          SAVE CURRENT OUTPUT POINTER
*
SCANLN   EQU      %
         BAL,SRTN S38PSCAN          SCAN INPUT LINE
         LI,D2    0                 RESET NEW-PARAGRAPH FLAG
         PUT,D2   PR:PRFLG
         JEZ,D1   PR:LNFIN,RDNXTLN  TEST FOR OUTPUT LINE FINISHED
         JLEZ,D1  LN:OUTSZ,RDNXTLN  TEST FOR OUTPUT SIZE ZERO
*
         LI,D1    0
         XW,D1    SVOUTPTR          GET SAVED OUTPUT POINTER
         GET,D2   LN:OUTPTR         GET NEW OUTPUT POINTER
         CW,D1    D2                TEST FOR INCREASE
         BL       PRNTLN                YES, PRINT LINE
         LW,D1    SVSTKEY               NO, GET OLD LINE START KEY
         PUT,D1   LN:STKEY          SET LINE START KEY
         STW,D2   SVOUTPTR          SAVE OUTPUT POINTER
*
*
         PAGE
*
PRNTLN   EQU      %
         LI,D1    0                 RESET PARAGRAPH LAST-LINE FLAG
         STW,D1   LSTPLN
         BAL,SRTN S08FMTPR          PRINT OUTPUT LINE
         JLEZ,D1  LN:INSZ,RDNXTLN   TEST INPUT REMAINING SIZE
         JGEZ,D1  PR:LPFLG,TSTUSED  TEST FOR INDEXING
         GET,D1   PR:PGNUM              YES,GET CURRENT PAGE NUMBER
         CW,D1    INDXPAGE          TEST AGAINST INDEX PAGE NUMBER
         BE       TSTUSED               EQUAL, DO NOT RESET
         STW,D1   INDXPAGE              NOT EQUAL, SET NEW INDEX PAGE
         GET,D1   LN:INPTR          GET CURRENT INPUT LINE POINTER
         SW,D1    INPTR             SUBTRACT STARTING POINTER
         STW,D1   INDXDISP          SAVE DISP. ON NEW PAGE
*
TSTUSED  EQU      %
         MTW,0    SVOUTPTR          TEST FOR INPUT LINE USED
         BEZ      NWSAVPTR              YES, SET NEW OUTPUT POINTER
         LW,D1    CKEY                  NO, GET CURRENT LINE KEY
         PUT,D1   LN:STKEY          SET OUTPUT LINE START KEY
         STW,D1   SVSTKEY           ...AND SAVE KEY
         B        NWULBS            SET-UP NEW INPUT LINE
*
*
         PAGE
*
TXTEOF   EQU      %
         JEZ,D1   PR:KTFLG,ZROP2KT  BRANCH IF NOT IN K-T
         BAL,SRTN E37EKT            FORCE END OF K-T
         B        RDNXTLN           GO READ K-T LINES
ZROP2KT  RES      0
         DEPZ,D1  PR:P2KT           MAKE SURE PASS 2 K-T = 0
         JLZ,D1   PR:LPFLG,RTNINDEX TEST FOR INDEXING-IF YES, RETURN
         LI,D1    1                 SET
         STW,D1   ENDFLG            END FLAG
         BAL,SRTN S08SCMD           PRINT REMAINING OUTPUT LINES
         JNEZ,D1  PR:TOPFLG,TSTFORM TEST TOP-OF-PAGE
         BAL,SRTN S08PGEND          GO TO END-OF-PAGE
*
TSTFORM  EQU      %
         MTW,0    FORMFLG           TEST FORM-LETTER FLAG
         BNEZ     PRNTOVER             SET, PRINT AGAIN
         LI,AC1   #SAVE             SET-UP CLOSE WITH SAVE
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     PRTOTAL2          YES
         JEZ,D1   PR:LPFLG,CLSPRFLE TEST FOR PRINT TO LP
PRTOTAL2 RES      0
         LW,AC1   PAGECNT           GET NUMBER OF PAGES
         BAL,SRTN S35CNVRT          CONVERT TO EBCDIC
         STW,AC2  PAGENUM           SAVE EBCDIC PAGE COUNT
         MOVE,X1  BA(PAGENUM),INSTPGS,4  MOVE PAGE COUNT TO MSG
         LI,BUF1  BA(TPAGEMSG)+1    ADDR OF TOTAL PAGE MSG
         LB,AC1   TPAGEMSG          SIZE OF TOTAL PAGE MSG
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BEZ      PRTOTAL4          NO
         MTB,-1   FILEFLG           ALLOW TERMINAL PRINT
PRTOTAL4 RES      0
         BAL,SRTN S27PRINT          PRINT TOTAL PAGE MSG
         JEZ,D1   PR:VFLG,PRMSG     TEST XGP FLAG
         BAL,SRTN S27XCLSE             SET, CLOSE XGP FILE
         MTW,0    XGOFLG            IS XGP GO FLAG SET
         BEZ      PRMSG             NO
         BAL,SRTN S60XGO            GO INITIATE XGP JOB
PRMSG    EQU      %
         LI,AC1   36                'DOCUMENT PRINTED' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BEZ      PRTOTAL6          NO
         MTB,1    FILEFLG           INHIBIT TERMINAL PRINT
PRTOTAL6 RES      0
         B        RELPRFLE          RELEASE PRINT FILE
*
RTNPRINT EQU      %                 RETURN
         RETURN
*
*
PRSTOP   EQU      %
         LI,AC1   #SAVE             CLOSE PRINT FILE WITH SAVE
         B        CLSPRFLE          CLOSE PRINT FILE
*                                       ACCEPT NEW INPUT LINE
RTNINDEX EQU      %
         BAL,SRTN S12INIT           RELEASE TABLE PAGES
         RETURN
         PAGE
*
*
PRINTBRK EQU      %
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     BRKMSG            YES
         JNEZ,D1  PR:LPFLG,BRKMSG   TEST LP FLAG
         MTB,0    3010FLG           IS 3010 OUTPUT SET
         BEZ      PRSTOP            NO
         LI,AC1   M:UC              GET ADDR OF M:UC
         STW,AC1  DCBADDR           STORE ADDRESS
         BAL,SRTN S36M:BCD          SET BCD MODE
         B        PRSTOP            STOP PRINTOUT
*
BRKMSG   EQU      %
         LI,AC1   43                'INDEX INTERRUPTED'
         JLZ,D1   PR:LPFLG,PRBRKMSG TEST FOR INDEXING
         LI,AC1   44                   NO, 'PRINT INTERRUPT'
*
PRBRKMSG EQU      %
         BAL,SRTN S29STD            PRINT BREAK MSG
         B        RELPRFLE          RELEASE PRINT FILE
*
CLSPRFLE EQU      %
         BAL,SRTN S03CLSPR          CLOSE PRINT FILE
         BAL,SRTN S42FRPGS          FREE DYNAMIC MEMORY PAGES USED
*
RTNPR    EQU      %
         LI,AC1   +1                SET FLAG=1 SO BOX-DRAWING DEFAULT
         STW,AC1  BOXFLG            IS 'ON' MODE FOR NEXT DOCUMENT.
         BAL,SRTN S41STOP           KILL BOX-DRAWING SO NO RUNAWAY.
         MTW,0    NAFLG             WAS NAME/ADDR FILE REQUESTED
         BEZ      RTNPR5            NO
         BAL,SRTN S45XNAMD          CLEAN UP N/A MODE FOR EXIT
RTNPR5   RES      0
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BEZ      RTNPR7            NO
         BAL,SRTN S04XFILE          EXIT FILE OUTPUT MODE
RTNPR7   RES      0
         BAL,SRTN S37LP             TRY TO FORCE LP OUTPUT TO QUEUE
         BAL,SRTN S363010R          RESET 3010 TERMINAL
         LI,AC1   0
         STB,AC1  3010FLG           RESET FORWARD/BACKWARD PRINT
         LW,D1    TEMPW             GET TEMPORARY WIDTH (IF ANY)
         BEZ      RTNPR9            NONE
         PUT,D1   #WIDTH            RESTORE AS PERM WIDTH
         LI,D1    0
         STW,D1   TEMPW             RESET TEMPORARY WIDTH
RTNPR9   RES      0
         BRKCTRL  0                 RESET BREAK CONTROL
         DO       #SYS=TEXT
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
         ELSE
         RETURN
         FIN
*
*
         PAGE
*
* S08PRLN -- PRINT OUTPUT LINE
*
S08PRLN  EQU      %
         SAVRTN
         GET,D1   PR:RLNS           GET REMAINING LINE COUNT
         GET,D2   PR:SPACE          GET SPACING SIZE
         CW,D1    D2                TEST FOR ROOM LEFT
         BGE      GETPRBUF             YES, GET PRINT BUFFER
         MTW,0    XTRAFLG           TEST X-TRA LINE FLAG
         BNEZ     GETPRBUF             SET, NOT END-OF-PAGE
         BAL,SRTN S08PGEND             NONE, GO TO END-OF-PAGE
         MTW,0    INDXPAGE          TEST FOR INDEX PAGE
         BEZ      GETPRBUF             NO, GET PR BUFFER
         MTW,1    INDXPAGE             YES, INCREMENT
GETPRBUF EQU      %
         LI,BUF3  BA(STDPRBUF)      GET ADDR OF PRINT BUFFER
         GET,AC1  LN:OUTSZ          GET OUTPUT LINE SIZE
         AI,AC1   2                 ADD 2 FOR SKIP AND STOP COUNTS
         JLZ,D1   PR:FMTFLG,TSTLNFLG TEST FOR 'AS-ENTERED' PRINTING
         GET,D1   LN:NSTOP              NO, GET STOP COUNT
         LW,X1    BUF3              GET ADDR OF BUFFER START
         AI,X1    1                 ADD 1 FOR STOP COUNT ADDR
         STB,D1   0,X1              STORE STOP COUNT
*
         LI,D1    1                 INITIALIZE FORMAT CODE
         JLEZ,D2  PR:FMTFLG,TESTUNFC   TEST FORMAT FLAG
         MTW,0    RJFLG             SET, NOW TEST R-J FLAG
         BEZ      SETFCODE          NOT SET, GO SAVE FORMAT CODE
         MTW,0    LSTPLN            TEST FOR LAST LINE IN PARAGRAPH
         BNEZ     SETFCODE          SET, GO SAVE FORMAT CODE
         LI,D1    0                 SET FORMAT CODE FOR R-J
         B        SETFCODE          GO SAVE FORMAT CODE
*
TESTUNFC EQU      %
         JEZ,D2   PR:CTRFLG,SETFCODE   TEST CENTERING FLAG
         LI,D1    2                 SET, FORMAT CODE = 2
*
SETFCODE EQU      %
         STW,D1   FCODE             SAVE FORMAT CODE FOR THIS LINE
*
TSTKTFLG EQU      %
         JEZ,D1   PR:KTFLG,TSTRJFLG TEST KEEP-TOGETHER FLAG
         BAL,SRTN S37SAVKT              SET, SAVE K-T LINE
         B        ZINDXPG           NOW ZERO INDEX PAGE
*
TSTRJFLG EQU      %
         MTW,0    FCODE             TEST FORMATTING CODE
         BNEZ     TSTCFLG           NO R-J, TEST FOR CENTERING
         BAL,SRTN S30RJSTY              SET, RIGHT-JUSTIFY LINE
         B        TSTLNFLG          NOW TEST LN FLAG
*
TSTCFLG  EQU      %
         LW,D1    FCODE             GET FORMATTING CODE
         CI,D1    2                 TEST FOR CENTERING
         BNE      TSTHFSAV             NO, GO TEST FOR H/F
         BAL,SRTN S30CTRLN             YES, GO CENTER LINE
         B        TSTHFSAV          GO TEST FOR H/F
*
*
         PAGE
*
*
TSTHFSAV EQU      %
         JEZ,X1   PR:HFSAV,TSTLNFLG TEST H/F SAVE FLAG
         BAL,SRTN S09SAVHF              SET, GO SAVE H/F LINE
ZINDXPG  EQU      %
         LI,D1    0                 SET INDEXING PAGE TO ZERO
         STW,D1   INDXPAGE
         B        RTNPRLN           RETURN
*
*
         PAGE
*
*
TSTLNFLG EQU      %
         MTW,0    LNFLG             TEST LINE NUMBER FLAG
         BEZ      TSTBLFLG             NOT SET, GO TEST FOR A BLOCK
         JEZ,AC2  LN:STKEY,TSTBLFLG SET, TEST FOR NEW START KEY
         BAL,SRTN S30ADDLN          ADD LINE NUMBER TO LINE
*
TSTBLFLG EQU      %
         JEZ,D1   PR:BLKFLG,SETPRNT  TEST BLOCK FLAG - IF NOT SET, PRINT LINE
         LW,D1    FCODE             GET FORMATTING CODE FOR THIS LINE
         BAL,SRTN S39SAVBL             SET, SAVE BLOCK LINE
         B        ZINDXPG           GO ZERO INDEX PAGE NUMBER
SETPRNT  EQU      %
         JLZ,D1   PR:LPFLG,TSTRLNS  TEST LP FLAG
         LW,D1    FCODE             GET FORMATTING CODE FOR THIS LINE
         BAL,SRTN S42WRPRN          GO SAVE PRINTOUT LINE IN DYNAMIC MEMORY
*
TSTRLNS  EQU      %
         DEPZ,D1  PR:TOPFLG         RESET TOP FLAG
         GET,D1   PR:RLNS           GET REMAINING LINES
         GET,D2   PR:SPACE          GET SPACING COUNT
         SW,D1    D2                CALC. NEW LINE COUNT
         PUT,D1   PR:RLNS           SAVE NEW LINE COUNT
*
RTNPRLN  EQU      %
         RETURN
*
*
         PAGE
*
*
S08FMTPR EQU      %
         SAVRTN
*
         JLEZ,AC1 LN:OUTSZ,NWOUTLN  TEST FOR OUTPUT LINE
TSTLSTPL EQU      %
         MTW,0    LSTPLN            TEST LAST-LINE FLAG
         BEZ      TSTINSZ              ZERO, GO ADD TABS
         LW,D1    SVSTKEY           GET SAVED LINE START KEY
         PUT,D1   LN:STKEY          SET LINE START KEY
         B        TSTPGEND          GO TEST PAGE END
*
TSTINSZ  EQU      %
         JGZ,D1   LN:INSZ,ADDTABS   TEST IN LINE SIZE
         LW,D1    TAB2              TEST NEXT LINE TABS
         BEZ      ADDTABS              ZERO, NOT PAR. END
         BLZ      TSTPGEND             <0, PAGE END?
         CW,D1    PTABSLN           TEST FOR PAR. END
         BE       ADDTABS              NO, ADDTABS
*
TSTPGEND EQU      %
         LB,AC2   STDPRBUF          GET SKIP COUNT
         LCW,AC3  AC2               NEGATE FOR LAST IN PARAGRAPH
         STB,AC3  STDPRBUF          STORE SKIP COUNT
         JGZ,D1   PR:RLNS,ADDTABS   TEST END-OF-PAGE
         LI,D1    1                    YES, SET X-TRA FLAG
         STW,D1   XTRAFLG
*
*
         PAGE
*
*
ADDTABS  EQU      %
         GET,X1   LN:OUTPTR         GET POINTER TO END-OF-LINE
         AW,AC1   NLTABS            ADD LEADING TABS COUNT
         AI,AC1   1                 ADD 1 FOR CR
         PUT,AC1  LN:OUTSZ          STORE NEW OUTPUT SIZE
         LI,AC2   #CR               GET CR CHAR
         STB,AC2  0,X1              STORE IN OUTPUT LINE
         BAL,SRTN S08PRLN           NOW PRINT OUTPUT LINE
         MTW,0    XTRAFLG           TEST X-TRA LINE FLAG
         BEZ      NWOUTLN              RESET, RESET OUT LINE
         LI,D1    0                 RESET X-TRA FLAG
         STW,D1   XTRAFLG
         BAL,SRTN S08PGEND          NOW GO TO END-OF-PAGE
*
NWOUTLN  EQU      %
         BAL,SRTN S09RESLN          RESET OUTPUT LINE
         LW,X3    PTABSLN           GET NEXT LINE TABS
         BLEZ     ZRONLTBS              NEW  PARAGRAPH, ZERO TABS
         STW,X3   NLTABS            SAVE LEADING TABS COUNT
         BAL,SRTN S09STABS          INSERT LEADING TABS
         B        RTNFMTPR          RETURN
*
ZRONLTBS EQU      %
         LI,D1    0                 SET LEADING TABS TO ZERO
         STW,D1   NLTABS
RTNFMTPR EQU      %                 RETURN
         RETURN
*
         PAGE
*
* S08PGEND -- END OF PAGE
*
*
S08PGEND EQU      %
         SAVRTN
         JNEZ,D1  PR:KTFLG,RTNPGEND IF KEEP-TOGETHER, RETURN
         JNEZ,D1  PR:P2KT,RTNPGEND  IF PASS 2 K-T, RETURN
*
STPGEND  EQU      %
         JLZ,D1   PR:LPFLG,CALLTOP  TEST FOR INDEXING
         LI,AC1   0                 INITIALIZE CREDIT FLAG
         JLZ,D1   PR:FMTFLG,TSTESKP   TEST A-E MODE
         LW,AC1   CREDFLG           GET 'TEXT' CREDIT FLAG
TSTESKP  EQU      %
         GET,D1   PR:FLNS           GET FOOTING LINES
         AW,D1    AC1               ADD CREDIT FLAG
         GET,D2   PR:BSLNS          GET REMAINING LINES
         AW,D1    D2                ADD TO COUNT
         AW,D1    CFRMFLG           ADD C-F FLAG
         BLEZ     NOENDSKP             ZERO, NO END SKIP
         BAL,SRTN S37PGEND          HANDLE END-SKIP
NOENDSKP EQU      %
         BAL,SRTN S09PRHDG              NO, PRINT HEADING
         BAL,SRTN S42RDPRN          GET PRINTOUT LINES FOR THIS PAGE
         BAL,SRTN S09PRFTG          NOW PRINT FOOTING
         JLZ,D1   PR:FMTFLG,TSTEFLG  TEST A-E MODE
         MTW,0    CREDFLG           TEST CREDIT FLAG
         BEZ      TSTEFLG              RESET, TEST END FLAG
         LI,BUF2  BA(TEXTCRED)      ADDR OF CREDIT
         LI,AC1   SZTEXTCR          SIZE OF CREDIT
         LI,AC3   1                 SET UNFORMATTED MODE
         BAL,SRTN S37OUTLN          PRINT CREDIT
         GET,D1   PR:RLNS           GET REMAINING LINES COUNT
         AI,D1    -1                SUBTRACT ONE FOR 'TEXT' CREDIT LINE
         PUT,D1   PR:RLNS           SAVE NEW REMAINING LINES COUNT
         B        TSTEFLG           GO TEST END FLAG
*
TEXTCRED EQU      %
         GEN,8,8  1,0               CONTROL BYTES
         GEN,32   'TEXT'            'TEXT' CREDIT
         GEN,8    #CR               CARRIER RETURN
SZTEXTCR EQU      BA(%)-BA(TEXTCRED)  SIZE OF MESSAGE
         BOUND    4
*
TSTEFLG  EQU      %
         MTW,0    ENDFLG            TEST END FLAG
         BNEZ     CALLTOP               SET, RETURN
*
*
         PAGE
*
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     PRACK             YES
         JEZ,D1   PR:LPFLG,TSTCFORM  TEST FOR LP OUTPUT
         BAL,SRTN S27EJLP              YES, EJECT LP PAGE
PRACK    RES      0
         MTW,1    PAGECNT           INCR PAGE COUNT
         LI,AC1   0                 SET UP DIVIDE
         LW,AC2   PAGECNT
         DW,AC1   L(10)             DIVIDE PAGE COUNT BY 10
         CI,AC1   0                 TEST FOR REMAINDER
         BNE      SAVPRSTA             YES, DON'T PRINT MSG
*
         LW,AC1   PAGECNT           NO REMAINDER, GET PAGE COUNT
         BAL,SRTN S35CNVRT          CONVERT TO EBCDIC
         STW,AC2  PAGENUM           SAVE PAGE NUMBER
         MOVE,X1  BA(PAGENUM),INSPGNUM,4  MOVE PAGE COUNT TO MSG
         LI,BUF1  BA(PAGEMSG)+1     ADDR IF PAGE COUNT MSG
         LB,AC1   PAGEMSG           SIZE OF MSG
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BEZ      PRACK10           NO
         MTB,-1   FILEFLG           ALLOW TERMINAL PRINT
PRACK10  RES      0
         BAL,SRTN S27PRINT          PRINT MSG
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BEZ      PRACK20           NO
         MTB,1    FILEFLG           INHIBIT TERMINAL PRINT
         B        TSTCFORM
PRACK20  RES      0
         B        SAVPRSTA          NOW GO SAVE STATUS
TSTCFORM EQU      %
         LW,AC1   CFRMFLG               NO, GET C-F FLAG
         BNEZ     PGEJECT           C-F FLAG SET, EJECT PAGE
*
         MTW,0    FILEFLG           FILE OUTPUT MODE
         BNEZ     SAVPRSTA          YES
         MTW,0    BATCHFLG          BATCH OUTPUT MODE
         BGZ      SAVPRSTA          YES
         BAL,SRTN S363010R          RESET 3010 TERMINAL
         BAL,SRTN S09RDATN          READ ATTN-ATTN RESPONSE
         CI,SR3   #ATTN             TEST FOR CONTINUE
         BNE      PRSTOP                NO, STOP PRINTOUT
         B        SAVPRSTA          GO SAVE CURRENT STATUS
*
PGEJECT  EQU      %                 C-F FLAG SET
         GET,D1   PR:RLNS           GET REMAINING PAGE LINES
         AW,AC1   D1                ADD TO C-F COUNT
         BLEZ     SAVPRSTA          NO LINES TO SKIP, GO SAVE STATUS
         LI,BUF2  BA(MSGBUF)        GET ADDR OF MESSAGE BUFFER
         STB,AC1  MSGBUF            STORE SKIP COUNT IN BUFFER
         LI,AC1   1                 SET SIZE TO ONE
         LI,AC3   1                 SET MODE TO UNFORMATTED
         BAL,SRTN S37OUTLN          GO PRINT SKIP LINES
*
SAVPRSTA EQU      %
         MTW,0    FORMFLG           TEST FORM-LETTER FLAG
         BNEZ     CALLTOP               SET, SKIP STATUS SAVE
         BAL,SRTN S09WRSTA          SAVE CURRENT STATUS
CALLTOP  EQU      %
         BAL,SRTN S37TOP            SET-UP TOP-OF-PAGE
         JLEZ,D1  PR:RLNS,STPGEND   TEST FOR SKIP PAGE
*
RTNPGEND EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S08SCMD -- CALLED BY ALL FORMATTING COMMANDS TO END
*            PARAGRAPHS AND RESET OUTPUT LINE
*
S08SCMD  EQU      %
         SAVRTN
*
         LI,D1    -1                SET FOR NEW PARAGRAPH
         STW,D1   PTABSLN
         JLEZ,D1  PR:FMTFLG,RESOUTLN TEST FOR FORMAT FLAG SET
         JEZ,D1   PR:ULFLG,CALLFPR  TEST UL-BKSP FLAG
         GET,D1   LN:OUTPTR         GET OUTPUT LINE POINTER
         CW,D1    SVOUTPTR          COMPARE TO SAVED POINTER
         BG       CALLFPR              INCREASE, PRINT LINE
         AI,D1    -2                   NO INCREASE, DECR PTR
         PUT,D1   LN:OUTPTR         STORE NEW POINTER
         GET,D1   LN:OUTSZ          GET OUTPUT LINE SIZE
         AI,D1    -2                DECR. SIZE
         PUT,D1   LN:OUTSZ          STORE NEW SIZE
*
CALLFPR  EQU      %
         LI,D1    1                 SET PARAGRAPH LAST-LINE FLAG
         STW,D1   LSTPLN
         BAL,SRTN S08FMTPR          PRINT END OF PREVIOUS PARAGRAPH
         B        RESINLN           NOW RESET INPUT LINE
*
*
         PAGE
*
*
RESOUTLN EQU      %
         BAL,SRTN S09RESLN          RESET OUTPUT LINE
RESINLN  EQU      %
         LI,D1    0                 SET INDEX PAGE TO ZERO
         STW,D1   INDXPAGE
         PUT,D1   LN:INSZ           SET INPUT LINE SIZE TO ZERO
         GET,D1   PR:RLNS           GET REMAINING LINE COUNT
         GET,D2   PR:SPACE          GET SPACING SIZE
         CW,D1    D2                TEST FOR ROOM LEFT
         BGE      RTNSCMD              YES, RETURN
         BAL,SRTN S08PGEND             ZERO, END OF PAGE
*
RTNSCMD  EQU      %
         RETURN
*
*
         PAGE
*
* E08TU,E08TF -- FORMATTING COMMANDS
*
*
E08TU    EQU      %
         SAVRTN
*
         BAL,SRTN S08SCMD           RESET LINE FOR SYSTEM COMMAND
         GET,D1   #FLAGS,:K(1)      GET CENTERING FLAG
         LI,D2    0                 SET UNF. MODE
         B        SETMODE           GO SET MODE
*
*
E08TF    EQU      %
         SAVRTN
*
         BAL,SRTN S08SCMD           RESET INPUT/OUTPUT LINES
         GET,D1   #WIDTH            GET PAGE WIDTH
         PUT,D1   LN:MXPSTN         SET MAX WIDTH
         LI,D1    0                 SET CENTERING FLAG TO ZERO
         LI,D2    1                 SET FORMATTING FLAG ON
*
SETMODE  EQU      %
         PUT,D1   PR:CTRFLG         STORE CENTERING FLAG
         PUT,D2   PR:FMTFLG         STORE FORMATTING FLAG
         DEPZ,D1  PR:HFSAV          SET H/F SAVE OFF
         RETURN
*
*
         PAGE
*
* S08ULBS -- INSERT UL-BS FOR NEW INPUT LINE
*
*
S08ULBS  EQU      %
         SAVRTN
*
         JEZ,D1   PR:ULFLG,RTNULBS  TEST U-L FLAG, IF NOT SET RETURN
         JNEZ,D1  PR:HFSAV,RTNULBS  TEST H/F SAVE
*
         GET,X1   LN:OUTPTR         GET CURRENT OUTPUT POINTER
         LI,AC2   #UL               GET UL CHAR
         STB,AC2  0,X1              STORE IN OUTPUT BUFFER
         AI,X1    1                 INCREMENT POINTER
         LI,AC2   #BKSP             GET BKSP CHAR
         STB,AC2  0,X1              STORE IN OUTPUT BUFFER
         AI,X1    1                 INCREMENT POINTER
         PUT,X1   LN:OUTPTR         STORE NEW OUTPUT POINTER
         GET,AC1  LN:OUTSZ          GET OUTPUT SIZE
         AI,AC1   2                 ADD 2 FOR UL-BS
         PUT,AC1  LN:OUTSZ          STORE NEW OUTPUT SIZE
*
RTNULBS  EQU      %                 RETURN
         RETURN
*
         PAGE
*
*
* S083010I -- INITIALIZE 3010 TERMINAL
*
* USES REGISTERS: D1,D2
*
S083010I RES      0
         SAVRTN
         MTW,0    3010FLG           IS OUTPUT TO 3010 TERM
         BEZ      3010I900          NO
         GET,D1   #DEPTH            GET PAGE DEPTH
         JEZ,D2   (#FLAGS,:K(7)),3010I300  CHECK FOR C-F DEPTH
         GET,D1   #LDEPTH           GET C-F DEPTH
3010I300 RES      0
         LW,D2    LFTMRGN           GET LEFT MARGIN
         BAL,SRTN S36INIT           INIT 3010 DEPTH AND LEFT MARGIN
3010I900 RES      0
         RETURN
         PAGE
*
* LOCAL VARIABLES FOR PRINT ROUTINE
*
*
8D       CSECT    0                 START OF PRINT LOCALS
*
LOCFLAGS EQU      %-1
AEFLG    RES      1                 AS-ENTERED FLAG
RJFLG    RES      1                 RIGHT-JUSTIFY FLAG
LNFLG    RES      1                 LINE NUMBER FLAG
LNWUFLG  RES      1                 LINE NUMBER W/O UNDERLINES
DSFLG    RES      1                 DOUBLE-SPACE FLAG
TSFLG    RES      1                 TRIPLE-SPACE FLAG
CFRMFLG  RES      1                 CONTINUOUS-FORM FLAG
XGOFLG   RES      1                 XGP GO FLAG
*
SVFNDKEY RES      1                 SAVE FIND KEY
SVOUTPTR RES      1                 SAVE OUTPUT POINTER
SVSTKEY  RES      1                 SAVE LINE START KEY
*
INDXDISP RES      1                 DISPLACEMENT FOR INDEXING
INDXPAGE RES      1                 PAGE FOR INDEXING
*
*
         PAGE
*
*
MODEFLG  RES      1                 MODE SET FLAG
HDGFLG   RES      1                 HEADING SET FLAG
FTGFLG   RES      1                 FOOTING SET FLAG
MODEKNT  RES      1                 MODE COUNT
HFCFLG   RES      1                 SAVE CENTERING FLAG
*
FSTLN    RES      1                 FIRST PRINT INPUT LINE
LSTLN    RES      1                 LAST PRINT INPUT LINE
FNDKEY   RES      1                 FIND KEY
*
INPTR    RES      1                 INPUT LINE START
CKEY     RES      1                 INPUT LINE KEY
TAB1     RES      1                 CURRENT LINE INITIAL TABS
TAB2     RES      1                 NEXT LINE INITIAL TABS
XTRAFLG  RES      1                 EXTRA LINE ON PAGE FLAG
*
PTABSLN  RES      1                 PARAGRAPHING INDICATOR
NLTABS   RES      1                 OUTPUT LINE INITIAL TABS
LSTPLN   RES      1                 PARAGRAPH LAST-LINE FLAG
*
ENDFLG   RES      1                 END FLAG
FORMFLG  RES      1                 FORM-LETTER FLAG
PAGECNT  RES      1                 PAGE COUNT
8END     EQU      %                 END OF PRINT LOCALS
*
SAVVFLG  RES      1                 SAVE SETTING OF XGP FLAG
FCODE    RES      1                 FORMATTING CODE FOR PRINTOUT LINES
MXPHRBUF EQU      20                MAX SIZE FOR STARTING PHRASE
PHRBUF   RES,1    MXPHRBUF          BUFFER TO SAVE STARTING PHRASE
PHRSZ    RES      1                 SIZE OF STARTING PHRASE
PAGENUM  RES      1                 TEMP FOR PAGE COUNT
TPAGEMSG MESSAGE  'TOTAL PAGES =',(INSTPGS,4)
PAGEMSG  MESSAGE  '  PAGES =',(INSPGNUM,4)
*
         USECT    #PLOC
         END
