* 02/04/76 -- 13:00
* MODULE NAME: TABLE
* NUMBER: 12
* PURPOSE: FORMAT AND PRINT TABLES
*
* ENTRY POINTS:
*
         DEF      E12TABLE          FORMAT AND PRINT TABLE
         DEF      C12TABLE          READ TABLE
         DEF      S12WRD            GET WORD
         DEF      S12INIT           RELEASE TABLE PAGES
         DEF      S12SAVPG,S12RESPG SAVE/RESTORE TABLE PAGES
*
         REF      S36M:GP,S36M:FP   GET,FREE MEMORY PAGES
         REF      S08PRLN           PRINT OUTPUT LINE
         REF      E08TU,E08TF       SET OUTPUT MODES
         REF      S27RTXT,S27RHDR   READ TEXT,HEADER FILES
         REF      S27WCPY,S27RCPY   WRITE,READ PRINT FILE
         REF      S03NXTAB          FIND NEXT TAB POSITION
         REF      S09RESLN          RESET OUTPUT LINE
         REF      S29STD            PRINT ERROR MSG
         REF      S38PSCAN          SCAN OUTPUT LINE
         REF      S09RDKEY          READ TEXT FILE KEY
         REF      S37SKLNS          SKIP OUTPUT LINES
         REF      CMDERRFG          COMMAND ERROR FLAG
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVLNSTA
            INVPRSTA
            INVTBLSTA
            INVCMDSTA
            INVWSSTA
            INVHDRSTA
*
         PAGE
*
*
*
         DEF      12P,12D,12END
*
12P      EQU      %
         DATA     X'12'             MODULE NUMBER
         DATA     X'020476'         DATE
         DATA     X'2200'           TIME
*
*
         TITLE    '** TABLE(12) **'
*
* S12INIT -- RELEASE TABLE PAGES
*
*
S12INIT  EQU      %
         SAVRTN
*
RELTBLPG EQU      %
         LW,AC1   NUMPGS            RELEASE TABLE PAGES
         BAL,SRTN S36M:FP
         LI,AC1   0                 INITIALIZE:
         STW,AC1  NUMPGS               NUMBER OF PAGES
         PUT,AC1  PR:TBLMODE           TABLE FLAG
         LW,AC2   TMPKEY            GET SAVE KEY
*
         RETURN
*
*
         PAGE
*
* S12SAVPG -- SAVE CURRENT TABLE PAGES
*
*
S12SAVPG EQU      %
         SAVRTN
*
         STW,AC2  TMPKEY            SAVE PRINT FILE KEY
         JEZ,D1   PR:TBLMODE,RELTBLPG  TEST TABLE FLAG
         LW,AC1   NUMPGS            GET CURRENT PAGE COUNT
         BLEZ     RTNSAVPG             ZERO, RETURN
         STW,AC1  TMPPGS            SAVE PAGE COUNT
         LW,BUF3  PGADDR            GET ADDR OF FIRST PAGE
         SLS,BUF3 2                 CONVERT TO BYTE ADDR
*
SAVPGLP  EQU      %
         LI,AC1   2048              SIZE OF PAGE (BYTES)
         BAL,SRTN S27WCPY           SAVE PAGE IN PRINT FILE
         AI,AC2   1                 INCR SAVE KEY
         AI,BUF3  2048              INCR BUFFER TO NEXT PAGE
         MTW,-1   TMPPGS            DECR PAGE COUNT
         BGZ      SAVPGLP           MORE PAGES, SAVE NEXT
*
RTNSAVPG EQU      %
         RETURN
*
*
         PAGE
*
* S12RESPG -- RESTORE TABLE PAGES
*
*
S12RESPG EQU      %
         SAVRTN
*
         STW,AC2  TMPKEY            SAVE PRINT FILE KEY
         JEZ,D1   PR:TBLMODE,RELTBLPG  TEST TABLE FLAG
         LW,AC1   NUMPGS            GET PAGE COUNT
         BLEZ     RTNRESPG             ZERO, RETURN
         STW,AC1  TMPPGS            SAVE PAGE COUNT
         LW,BUF2  PGADDR            GET ADDR OF FIRST PAGE
         SLS,BUF2 2                 CONVERT TO BYTE ADDR
*
RESPGLP  EQU      %
         LI,AC1   2048              SIZE OF PAGE (BYTES)
         BAL,SRTN S27RCPY           RESTORE PAGE FROM PRINT FILE
         AI,AC2   1                 INCR SAVE KEY
         AI,BUF2  2048              INCR BUFFER TO NEXT PAGE
         MTW,-1   TMPPGS            DECR PAGE COUNT
         BGZ      RESPGLP           MORE PAGES, RESTORE NEXT
*
RTNRESPG EQU      %
         RETURN
*
*
*
* E12TABLE -- PRINT TABLE
*
*
E12TABLE EQU      %
         SAVRTN
*
         GET,D1   #FLAGS,:K(2)      GET 'C' FLAG
         STW,D1   TBLTYPE           SAVE TABLE TYPE (0=R,1=C)
*
         LI,D1    1                 DEFAULT SPACING = 1
         JEZ,D2   (#FLAGS,:K(3)),SAVSP   IF SPACE NOT SPECIFIED, SAVE
         GET,D1   #DSHW,:K(1)       GET SPACING COUNT
         CLM,D1   SPLIMIT           CHECK WITHIN LIMITS
         BCS,9    SPERR5            OUTSIDE LIMITS
SAVSP    RES      0
         STW,D1   TABLESP           OK, SAVE SPACING
*
         LI,AC1   1                 GET ONE MEMORY PAGE TO START
         BAL,SRTN S36M:GP
         CI,AC1   0                 TEST FOR PAGE
         BLE      TBLPGERR             NONE, MEMORY ERROR
         STW,BUF1 PGADDR            SAVE WA OF MEMORY PAGE
         STW,BUF1 TBLPTR            SET TABLE POINTER
         STW,AC1  NUMPGS            SET NUMBER OF PAGES
*
*
         PAGE
*
*
SAVFMT   EQU      %                 SAVE CURRENT PRINT FORMAT
         LI,D1    1                 SET TABLE MODE FLAG
         PUT,D1   PR:TBLMODE
         GET,D1   LN:CKEY           SAVE CURRENT INPUT KEY
         STW,D1   TBLSTKEY
         GET,D1   PR:FMTFLG         GET LAST MODE SETTING
         GET,D2   PR:CTRFLG         GET CENTERING FLAG
         STW,D1   FMTSAV            SAVE PREVIOUS FORMAT
         STW,D2   CTRSAV            SAVE CENTERING FLAG
         DEPZ,D1  #FLAGS,:K(1)      RESET CENTERING
         BAL,SRTN E08TU             SET UNFORMATTED MODE
*
RDFMTLN  EQU      %                 NOW READ TABLE FORMAT LINE
         LI,AC1   0                 RE-POSITION TEXT FILE
         LW,AC2   TBLSTKEY
         BAL,SRTN S27RTXT
         LI,BUF2  BA(STDPRBUF)      GET BUFFER ADDR
         LI,AC1   #STDBUFSZ         MAX SIZE
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RTXT           READ FORMAT LINE
         AI,BUF2  1                 INCREMENT BUFFER FOR ATTN COUNT
         AI,AC1   -1                DECREMENT SIZE
         STW,AC1  LNSZ              SAVE FORMAT LINE SIZE
*
*
         PAGE
*
*
RDENDKEY EQU      %                 FIND NEXT FORMAT STATEMENT
         GET,D1   PR:LSTLN          SET MAX KEY
         AI,D1    1
         STW,D1   MAXKEY
         LI,AC1   0                 READ NEXT HEADER LINE
         LW,AC2   TBLSTKEY
         BAL,SRTN S27RHDR
*
ENDKEYLP EQU      %
         LI,BUF2  BA(HDRSTA)        BUFFER ADDR
         LI,AC1   4                 READ CONTROL WORD
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RHDR
*
         CI,AC2   0                 TEST FOR EOF
         BE       INITCOL              YES, INITIALIZE COLS
         CW,AC2   MAXKEY            TEST FOR MAX KEY
         BGE      INITCOL              YES, INITIALIZE COLS
         JEZ,D1   HDR:TBLEND,ENDKEYLP  TEST TABLE END CODE
         STW,AC2  MAXKEY                 SET, STORE MAX KEY
INITCOL  EQU      %
         LI,AC1   0                 RE-POSITION HEADER FILE
         LW,AC2   TBLSTKEY
         BAL,SRTN S27RHDR
         STW,AC1  NUMCOLS           INITIALIZE COLUMN COUNT
         STW,AC1  ENDLNFLG          INITIALIZE END-OF-FORMAT FLAG
         LI,BUF2  BA(STDPRBUF)+1    GET ADDR OF BUFFER
         LI,AC2   1                 SET STARTING POSITION
         STW,AC2  CPSTN
         PAGE
*
*
NXTFCHAR EQU      %                 GET NEXT CHAR IN FORMAT LINE
         MTW,-1   LNSZ              DECREMENT FORMAT LINE SIZE
         BGZ      GETFCHAR              >0, GET CHAR
         MTW,1    ENDLNFLG              =0, SET END-OF-FORMAT FLAG
         B        ENDFMT            NOW END LAST ENTRY
*
GETFCHAR EQU      %
         LB,AC3   0,BUF2            GET CHAR
         CI,AC3   LC('F')           TEST FOR L.C. 'F'
         BE       FCOL                  FOUND, START FORMATTED COLUMN
         CI,AC3   LC('U')           TEST FOR L.C. 'U'
         BE       UCOL                  FOUND, START UNFORMATTED COLUMN
         CI,AC3   'F'               TEST FOR U.C. 'F'
         BE       FCOL                 YES, FORMATTED COL
         CI,AC3   'U'               TEST FOR U.C. 'U'
         BE       UCOL                 YES, UNF COLUMN
*
         CI,AC3   #BLANK            TEST FOR BLANK
         BNE      INCRCOL               NO, GO INCREMENT COLUMN COUNT
         AI,AC1   1                     YES, INCREMENT LEADING BLANK CNT
         CI,AC1   1                 TEST FOR FIRST LEADING BLANK
         BG       INCRCOL               NO, GO INCREMENT COLUMN COUNT
         LW,AC2   CPSTN                 YES, GET CARRIER PSTN.
         STW,AC2  FSTBLNK           SET FIRST BLANK POSITION
*
INCRCOL  EQU      %
         MTW,1    CPSTN             INCR POSITION
         AI,BUF2  1                 INCREMENT FORMAT LINE POINTER
         B        NXTFCHAR          GO GET NEXT CHAR
*
*
         PAGE
*
*
FCOL     EQU      %                 START FORMATTED ENTRY
         LI,D1    1                 SET ENTRY TYPE TO ONE
         B        SETFMT            GO START ENTRY
UCOL     EQU      %                 START UNFORMATTED ENTRY
         LI,D1    0                 SET ENTRY TYPE TO ZERO
*
SETFMT   EQU      %
         MTW,0    NUMCOLS           TEST FOR FIRST ENTRY
         BEZ      NEWCOL                YES, SET NEW COLUMN
ENDFMT   EQU      %                     NO, END LAST ENTRY
         LW,D2    CPSTN             GET FIRST COL. OF NEW ENTRY
         CI,AC1   0                 TEST FOR LEADING BLANKS
         BE       SETMX                 NO, SET MAX POSITION
         LW,D2    FSTBLNK               YES, GET COL.OF FIRST BLANK
*
SETMX    EQU      %
         AI,D2    -1                DECREMENT TO LAST COL. OF ENTRY
         PUT,D2   *TB:MXPSTN        SAVE MAX. COLUMN
         LI,AC3   SZTBLSTA          GET SIZE OF ENTRY
         AWM,AC3  TBLPTR            ADD TO TABLE POINTER (NEXT ENTRY)
         MTW,0    ENDLNFLG          TEST END-OF-LINE FLAG
         BNEZ     CALCBUFS              SET, CALCULATE INPUT BUFFERS
*
*
         PAGE
*
*
NEWCOL   EQU      %                 START NEW COLUMN ENTRY
         PUT,D1   *TB:TYPE          STORE ENTRY TYPE
         LW,D2    CPSTN             GET STARTING CARRIER POSITION
         PUT,D2   *TB:CPSTN         STORE IN ENTRY
         PUT,AC1  *TB:LBLNKS        STORE NUMBER OF LEADING BLANKS
*
         MTW,1    NUMCOLS           INCREMENT COLUMN COUNT
         LI,AC1   0                 INITIALIZE LEADING BLANK COUNT
         B        INCRCOL           GO INCREMENT COLUMN POINTER
*
*
         PAGE
*
*
CALCBUFS EQU      %                 CALCULATE COLUMN INPUT BUFFERS
         MTW,0    NUMCOLS           TEST NUMBER OF COLS
         BLEZ     TBLFIN               ZERO, NO TABLE
         LW,AC3   PGADDR            GET ADDR OF FIRST ENTRY
         XW,AC3   TBLPTR            GET WORD ADDR OF FIRST BUFFER
         SLS,AC3  2                 CONVERT TO BYTE ADDR
         STW,AC3  FSTBUF            SAVE NEXT BUFFER ADDR
*
         LI,AC2   SZTBLSTA          GET ENTRY SIZE
         AI,AC2   #RDLNSZ/4         ADD SIZE OF INPUT BUFFERS (IN WORDS)
         MW,AC2   NUMCOLS           MULTIPLY BY NUMBER OF COLUMNS
         SLS,AC2  -9                DIVIDE BY 512 (FOR NUMBER OF PAGES)
         CI,AC2   0                 TEST FOR    ADDL PAGES REQD.
         BEZ      SETTCOL               NO, GO GET STARTING KEYS
*
         STW,AC2  TMPPGS            SAVE PAGES REQD
         LW,AC1   AC2               GET NUMBER OF PAGES REQD
         BAL,SRTN S36M:GP           GET MEMORY PAGES
         CW,AC1   TMPPGS            TEST FOR ENOUGH PAGES
         BL       TBLPGERR             NO, ERROR
         AWM,AC1  NUMPGS
*
SETTCOL  EQU      %
         LI,D1    0                 INITIALIZE ROW COUNT
         STW,D1   ROWCOUNT
*
*
         PAGE
*
*
GETCKEYS EQU      %
         LW,D1    FSTBUF            SET FIRST INPUT BUFFER ADDR
         STW,D1   NXTBUF
         LW,D1    PGADDR            SET FIRST TABLE ENTRY
         STW,D1   TBLPTR
         LW,D1    NUMCOLS           INITIALIZE COLUMN COUNT
         STW,D1   COLCOUNT
         LI,D1    0                 INITIALIZE ZERO FLAG
         STW,D1   ZROFLAG
*
NXTEND   EQU      %
         BAL,SRTN S12RCEND          GET KEY FOR ROW/COLUMN END
NXTSTART EQU      %
         MTW,0    ZROFLAG           TEST ZERO FLAG
         BEZ      TESTNEXT              RESET, GET NEXT ENTRY
         MTW,0    TBLTYPE               SET, TEST TABLE TYPE
         BEZ      ZROENTRY          ROW TYPE, ALL REMAINING ARE ZERO
*
*
         PAGE
*
*
TESTNEXT EQU      %
         LW,D1    NXTBUF            SET COLUMN BUFFER ADDR
         PUT,D1   *TB:INBUF
         BAL,SRTN S12RDNXT          READ START OF NEXT ENTRY IN COL
         CI,D1    0                 TEST FOR EOF
         BE       ZROENTRY              YES, ZERO ENTRY
         CW,D1    RCENDKEY          TEST FOR R/C END KEY
         BL       ENDCOL                NO, INCREMENT COLUMN
*
ZROENTRY EQU      %
         MTW,1    ZROFLAG           INCREMENT ZERO-ENTRY FLAG
         LI,D1    0                 RESET ENTRY FIRST KEY
         PUT,D1   *TB:CKEY
         LW,D1    RCENDKEY          SET ENTRY END KEY TO R/C END
         PUT,D1   *TB:ENDKEY
         B        DECRCNT           DECREMENT COLUMN COUNT
ENDCOL   EQU      %
         BAL,SRTN S12END            GO TO END-OF-ENTRY (SET END KEY)
DECRCNT  EQU      %
         MTW,-1   COLCOUNT          DECREMENT COLUMN COUNT
         BEZ      NXTROW                ZERO, INITIALIZATION FINISHED
         LI,AC1   #RDLNSZ           INCREMENT BUFFER POINTER
         AWM,AC1  NXTBUF
         LI,AC1   SZTBLSTA          INCREMENT ENTRY POINTER
         AWM,AC1  TBLPTR
*
*
         PAGE
*
*
         MTW,0    TBLTYPE           TEST FOR ROW TYPE
         BEZ      NXTSTART              YES, GET NEXT ENTRY
         LW,AC1   RCENDKEY          COLUMN TYPE, GET R/C END KEY
         MTW,0    ROWCOUNT          TEST FOR FIRST ROW
         BEZ      SETRCEND              YES, GO POSITION TEXT FILE
         GET,AC1  *TB:ENDKEY            NO, GET LAST ENTRY END KEY
*
SETRCEND EQU      %
         SLD,AC1  -32               POSITION TEXT FILE FOR NEXT ENTRY
         BAL,SRTN S27RTXT
         B        NXTEND            GO SET NEXT R/C END
*
NXTROW   EQU      %
         LW,D1    NUMCOLS           GET NUMBER OF COLUMNS
         SW,D1    ZROFLAG           SUBTRACT ZERO ENTRIES
         BLEZ     TBLFIN                ZERO, END-OF-TABLE
         STW,D1   ENTRYCNT          SAVE ACTUAL ENTRY COUNT
         MTW,1    ROWCOUNT          INCREMENT NUMBER OF ROWS
*
*
         PAGE
*
*
NXTOUTLN EQU      %
         LW,AC1   NUMCOLS           SET COLUMN COUNT
         STW,AC1  COLCOUNT
         LW,AC1   PGADDR            SET FIRST ENTRY ADDR
         STW,AC1  TBLPTR
         BAL,SRTN S09RESLN          RESET OUTPUT LINE
*
FMTENTRY EQU      %
         JEZ,AC1  *TB:CKEY,DECRCOL  GET CURRENT ENTRY KEY
         GET,D1   *TB:CPSTN         GET STARTING CARRIER POSITION
         AI,D1    -1                DECREMENT FOR STARTING POSITION
         GET,D2   LN:CPSTN          GET OUTPUT LINE CARRIER POSITION
         CW,D1    D2                TEST NEW COLUMN POSITION
         BLE      PSTNINLN              <=, POSITION INPUT LINE
*
         PUT,D1   LN:CPSTN          SET NEW OUTPUT LINE POSITION
         SW,D1    D2                CALCULATE NUMBER OF BLANKS TO ADD
         GET,X1   LN:OUTPTR         GET CURRENT OUTPUT LINE POINTER
         INSCHAR  #BLANK,*X1,*D1    INSERT BLANKS IN OUTPUT LINE
         PUT,BUF1 LN:OUTPTR         SET NEW OUTPUT LINE POINTER
         GET,D2   LN:OUTSZ          GET CURRENT OUTPUT LINE SIZE
         AW,D2    D1                ADD NUMBER OF BLANKS
         PUT,D2   LN:OUTSZ          SET NEW OUTPUT LINE SIZE
*
*
         PAGE
*
PSTNINLN EQU      %
         SLD,AC1  -32               POSITION TEXT FILE AT INPUT LINE
         BAL,SRTN S27RTXT
         GET,D1   *TB:TYPE          GET COLUMN TYPE
         PUT,D1   PR:FMTFLG         SET FORMAT FLAG
         GET,D1   *TB:MXPSTN        GET MAX POSITION FOR THIS COL
         PUT,D1   LN:MXPSTN         STORE IN LINE TABLE
         LI,D1    1                 SET NEW-OUTPUT-LINE FLAG
         PUT,D1   PR:NLFLG
         DEPZ,D1  PR:LNFIN          INITIALIZE LINE DONE
         JGZ,D1   *TB:INSZ,SCANCOL  TEST CURRENT INPUT LINE SIZE
*
RDNXTLN  EQU      %
         BAL,SRTN S12RDNXT          READ NEXT LINE IN ENTRY
         CI,D1    0                 TEST FOR EOF
         BE       ENDENTRY              YES, END-OF-ENTRY
         GET,D2   *TB:ENDKEY        GET COLUMN END KEY
         CW,D1    D2                TEST NEW KEY
         BGE      ENDENTRY              >=, END-OF-ENTRY
         GET,D1   *TB:INPTR         GET INPUT LINE POINTER
         PUT,D1   LN:INPTR          SET LINE STATUS
         GET,D1   *TB:INSZ          GET INPUT LINE SIZE
         PUT,D1   LN:INSZ           SET LINE STATUS
         JEZ,D1   PR:FMTFLG,DECRCOL TEST FORMAT FLAG
         JNEZ,D1  PR:LNFIN,DECRCOL  TEST FOR LINE FINISHED
         PAGE
*
*
SCANCOL  EQU      %
         GET,D1   *TB:INPTR         SET INPUT LINE POINTER
         PUT,D1   LN:INPTR
         GET,D1   *TB:INSZ          SET INPUT LINE SIZE
         PUT,D1   LN:INSZ
         BAL,SRTN S38PSCAN          SCAN LINE AND FORMAT COLUMN
*
         GET,D1   LN:INSZ           SET TABLE INPUT LINE SIZE
         PUT,D1   *TB:INSZ
         CI,D1    0                 TEST REMAINING IN SIZE
         BLE      RDNXTLN              ZERO, READ NEXT LINE
         GET,D2   LN:INPTR              SET, GET INPUT LINE POINTER
         PUT,D2   *TB:INPTR         SET TABLE INPUT LINE POINTER
         B        DECRCOL           DECREMENT COLUMN COUNT
*
*
         PAGE
*
*
ENDENTRY EQU      %
         MTW,-1   ENTRYCNT          DECREMENT ACTUAL ENTRY COUNT
         LI,D1    0                 SET CURRENT INPUT KEY TO ZERO
         PUT,D1   *TB:CKEY
*
DECRCOL  EQU      %
         LI,AC3   #CR               GET CR CHAR TO END LINE
         GET,X1   LN:OUTPTR         GET OUTPUT LINE POINTER
         JEZ,D1   LN:OUTSZ,TSTCOUNT GET CURRENT OUTPUT SIZE
         AI,X1    -1                DECREMENT POINTER TO TEST FOR CR
         CB,AC3   0,X1              TEST FOR CR
         BNE      INCRPTR               NO, TEST COL. COUNT
         PUT,X1   LN:OUTPTR             YES, DECR. OUTPUT POINTER
         AI,D1    -1                DECR. OUTPUT LINE SIZE
         PUT,D1   LN:OUTSZ
*
TSTCOUNT EQU      %
         MTW,-1   COLCOUNT          DECREMENT COLUMN COUNT
         BEZ      PRNTLN                ZERO, PRINT OUTPUT LINE
         LI,AC1   SZTBLSTA          SET TABLE POINTER TO NEXT COLUMN
         AWM,AC1  TBLPTR
         B        FMTENTRY          FORMAT NEXT TABLE COLUMN
*
INCRPTR  EQU      %
         AI,X1    1                 INCR POINTER TO END OF LINE
         B        TSTCOUNT          GO TEST COLUMN COUNT
*
*
         PAGE
*
*
PRNTLN   EQU      %
         STB,AC3  0,X1              STORE CR AT END-OF-LINE
         AI,X1    1                 INCR. OUTPUT LINE POINTER
         PUT,X1   LN:OUTPTR
         AI,D1    1                 INCR. OUTPUT LINE SIZE
         PUT,D1   LN:OUTSZ
*
         LI,D1    0
         PUT,D1   LN:STKEY          SET START KEY TO ZERO
         PUT,D1   PR:FMTFLG         SET UNF. MODE
         BAL,SRTN S08PRLN           PRINT OUTPUT LINE
         MTW,0    ENTRYCNT          TEST FOR MORE ENTRIES
         BGZ      NXTOUTLN              YES, FORMAT NEW OUTPUT LINE
*
         JLEZ,AC1 PR:RLNS,INCRROW   TEST REMAINING LINES COUNT
         GET,D1   PR:SPACE             NON-ZERO, GET SPACING COUNT
         AW,D1    TABLESP           ADD TABLE SPACING
         CW,AC1   D1                TEST FOR ROOM
         BL       SKPSPACE             NO, SKIP TO BOTTOM
         LW,AC2   TABLESP           GET TABLE SPACING COUNT
         BEZ      INCRROW           NO SPACING BETWEEN ROWS
         GET,D1   PR:SPACE          GET SPACING COUNT
         MW,AC2   D1                MULTIPLY TABLE SPACING BY SPACING
         LW,AC1   AC2               SET FOR LINE SKIP
*
SKPSPACE EQU      %
         BAL,SRTN S37SKLNS          SKIP ONE LINE BETWEEN ENTRIES
*
*
         PAGE
*
*
INCRROW  EQU      %
         MTW,0    TBLTYPE           TEST TABLE TYPE
         BNEZ     BYCOLS                BY COLUMNS, SET NEXT ROW
*
BYROWS   EQU      %                 BY ROWS
         LW,AC2   RCENDKEY          GET PREVIOUS ROW END KEY
         CW,AC2   MAXKEY            TEST FOR MAX TABLE KEY
         BGE      TBLFIN                YES, TABLE FINISHED
         LI,AC1   0                 POSITION TEXT FILE
         BAL,SRTN S27RTXT
         BAL,SRTN S27RHDR           POSITION HEADER FILE
         B        GETCKEYS          GO SET-UP NEXT ROW
*
BYCOLS   EQU      %                 BY COLUMNS
         LW,D1    PGADDR            SET TABLE POINTER TO 1ST ENTRY
         STW,D1   TBLPTR
         GET,AC1  *TB:ENDKEY        GET END KEY FOR THAT COL
         SLD,AC1  -32
         BAL,SRTN S27RTXT           POSITION TEXT FILE
         LW,AC2   TBLSTKEY          GET TABLE START KEY
         BAL,SRTN S27RHDR           POSITION HEADER FILE
         B        GETCKEYS          GO SET-UP NEXT ROW
*
*
         PAGE
*
*
TBLFIN   EQU      %
         DEPZ,D1  PR:TBLMODE        RESET TABLE MODE
         LW,D1    FMTSAV            GET SAVED PRINT FORMAT
         BNEZ     SETF                 FORMATTED, SET MODE
         LW,D1    CTRSAV               UNF, GET SAVED CENTERING FLAG
         PUT,D1   #FLAGS,:K(1)      SET COMMAND FLAG
         BAL,SRTN E08TU             RESET UNF MODE
         B        RELPGS            GO RELEASE TABLE PAGES
*
SETF     EQU      %
         BAL,SRTN E08TF             RESET FORMATTED MODE
*
RELPGS   EQU      %
         LI,AC1   0                 POSITION TEXT FILE AT TABLE END
         LW,AC2   MAXKEY            GET TABLE MAX KEY
         BAL,SRTN S09RDKEY          RE-POSITION TEXT FILE
         RETURN
*
*
TBLPGERR EQU      %
         AWM,AC1  NUMPGS            ACCUMULATE PAGES GOTTEN
         BAL,SRTN S12INIT           RELEASE TABLE PAGES
         LI,AC1   13                'NO STORAGE' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         RETURN
*
*
         PAGE
*
* S12END -- GO TO END OF ENTRY (SET TB:ENDKEY)
*
*
S12END   EQU      %
         SAVRTN
*
RDENDLP  EQU      %
         LI,BUF2  BA(MSGBUF)        GET ADDR OF MSG BUFFER
         LI,AC1   2                 NEED TO READ ONLY TWO CHARS
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RTXT           READ NEXT ENTRY LINE
         LW,D1    AC2               GET KEY
         BEZ      STENDKEY              ZERO, STORE END KEY
         CW,D1    RCENDKEY          TEST FOR MAX TABLE KEY
         BL       TSTEND                NO, TEST FOR END OF ENTRY
         BE       STENDKEY              =, STORE KEY
         LI,D1    0                     YES, SET END KEY TO ZERO
         B        STENDKEY          GO STORE END KEY
*
TSTEND   EQU      %
         AI,BUF2  1                 INCREMENT BUFFER FOR ATTN COUNT
         LB,AC3   0,BUF2            GET FIRST CHAR IN LINE
         CI,AC3   #CR               TEST FOR CR
         BNE      RDENDLP               NO, READ NEXT LINE
*
STENDKEY EQU      %                 END-OF-ENTRY FOUND
         PUT,D1   *TB:ENDKEY        STORE END KEY
         RETURN                     RETURN
*
*
         PAGE
*
* S12RDNXT -- READ NEXT LINE IN CURRENT ENTRY
*
*
S12RDNXT EQU      %
         SAVRTN
*
         GET,BUF2 *TB:INBUF         GET ADDR OF BUFFER  FOR THIS COLUMN
         LI,AC1   #RDLNSZ           MAX SIZE
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RTXT           READ NEXT LINE
         LW,D1    AC2               GET KEY OF READ
         BEZ      STCKEY                ZERO, END-OF-TABLE
         CW,D1    MAXKEY            TEST FOR MAX KEY
         BL       STLNPTR               NO, STORE LINE ADDR/SIZE
         LI,D1    0                     YES, SET LINE KEY TO ZERO
         B        STCKEY            GO STORE LINE KEY
*
STLNPTR  EQU      %
         AI,BUF2  1                 INCREMENT ADDR TO FIRST CHARACTER
         PUT,BUF2 *TB:INPTR         STORE ADDR IN INPUT LINE POINTER
         AI,AC1   -1                DECREMENT SIZE FOR ATTN COUNT
         PUT,AC1  *TB:INSZ          STORE SIZE
*
STCKEY   EQU      %
         PUT,D1   *TB:CKEY          STORE KEY FOR NEW LINE
         RETURN
*
*
         PAGE
*
* S12RCEND -- FIND ROW/COLUMN END KEY
*
*
S12RCEND EQU      %
         SAVRTN
*
NXTRCLP  EQU      %
         LI,BUF2  BA(HDRSTA)        BUFFER ADDR
         LI,AC1   4                 READ CONTROL WORD
         LI,AC2   0
         BAL,SRTN S27RHDR           READ NEXT HEADER RECORD
*
         CI,AC2   0                 TEST FOR EOF
         BE       SETLSTRC             YES, SET MAX
         CW,AC2   MAXKEY            TEST MAX KEY
         BL       TSTRCEND             NO, TEST R/C END CODE
*
SETLSTRC EQU      %
         LW,AC2   MAXKEY            SET MAX KEY FOR R/C END
         B        RTNRCEND          RETURN
*
TSTRCEND EQU      %
         JEZ,D1   HDR:TRCEND,NXTRCLP  TEST R/C END CODE
*
RTNRCEND EQU      %
         STW,AC2  RCENDKEY          SET NEW R/C END KEY
         RETURN
*
*
         PAGE
*
* C12TABLE -- START TABLE INPUT
*
C12TABLE EQU      %
         SAVRTN
*
         JEZ,D1   (#FLAGS,:K(3)),SETHDR  NO SPACING
         GET,D1   #DSHW,:K(1)       GET SPACING COUNT
         CLM,D1   SPLIMIT           CHECK WITHIN LIMITS
         BCS,9    SPERR             OUTSIDE LIMITS
SETHDR   RES      0
*
         LI,D1    X'B'              SET HEADER WORD END CODES
         PUT,D1   HDR:CMDCDE
         LI,AC1   5                 'TABLE MODE' MESSAGE
CTAB450  RES      0
         BAL,SRTN S29STD            PRINT MESSAGE
         RETURN
*
SPERR    RES      0
         MTW,1    CMDERRFG          SET COMMAND ERROR FLAG
SPERR5   RES      0
         LI,AC1   73                SET UP 'SPACING OUTSIDE LIMITS' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         LI,AC1   6                 SET UP 'ACTION CANCELLED' MSG
         B        CTAB450
*
         BOUND    8
SPLIMIT  DATA     0,98              SPACING LIMITS
*
*
         PAGE
*
* S12WRD -- EXTRACT NEXT WORD FROM INPUT LINE
*
* ENTRY PARAMETERS:
*        X1 = BYTE ADDR OF NEXT CHAR
*        AC1= NUMBER OF CHARS REMAINING IN LINE
*
* EXIT PARAMETERS:
*        X1 = BYTE ADDR OF FIRST CHAR IN WORD
*        X2 = BYTE ADDR OF NEXT INPUT CHAR
*        AC1= NUMBER OF CHARS REMAINING IN LINE
*        AC2= NUMBER OF CHARS IN WORD (0 IF END-OF-LINE)
*
* WORD IS TERMINATED BY THE FOLLOWING CHARS:
*        ATTN
*        BLANK
*        CR
*        TAB
*
*
         PAGE
*
*
S12WRD   EQU      %
*
         LW,X2    X1                GET FIRST CHAR ADDR
         LI,AC2   0                 INITIALIZE CHARACTER COUNT
GETCHAR  EQU      %
         AI,AC1   -1                DECREMENT SIZE OF LINE
         BLZ      RTNWRD            NO CHARS LEFT, RETURN
         LB,AC3   0,X2              GET NEXT INPUT CHAR
         CI,AC3   X'40'             IS THIS A TERMINAL CHARACTER?
         BG       NOTTRM            BRANCH IF NOT
         BE       TERMCHAR          BRANCH IF CHARACTER IS A BLANK
*
         LI,X4    SZTRMTBL          SIZE OF TERMINAL CHAR TABLE
TSTTRMLP EQU      %
         CB,AC3   TRMTBL,X4         TEST FOR TERMINAL CHAR
         BE       TERMCHAR              FOUND
         BDR,X4   TSTTRMLP          TEST ALL TERMINAL CHARS
*
NOTTRM   EQU      %
         AI,AC2   1                 INCREMENT CHARACTER COUNT FOR WORD
INCRCHAR EQU      %
         AI,X2    1                 INCREMENT INPUT LINE POINTER
         B        GETCHAR           GET NEXT CHARACTER
*
*
         PAGE
*
*
TERMCHAR EQU      %                 TERMINAL CHAR FOUND
         CI,AC2   0                 TEST FOR WORD STARTED
         BG       RTNWRD                YES, RETURN
         AI,X1    1                     NO, INCREMENT FIRST CHAR PTR
         B        INCRCHAR          NOW INCREMENT LINE POINTER
*
RTNWRD   EQU      %
         AI,X2    1                 INCREMENT TO NEXT CHAR
         B        *SRTN             RETURN
*
*
TRMTBL   DATA,1   0,#ATTN,#TAB,#CR
SZTRMTBL EQU      BA(%)-BA(TRMTBL)-1              TABLE SIZE
         BOUND    4
*
*
         PAGE
*
* LOCAL VARIABLES
*
*
12D      CSECT    0                 START OF LOCALS
*
TBLTYPE  RES      1                 TABLE TYPE (0=ROWS,1=COLS)
NUMROWS  RES      1                 NUMBER OF ROWS
NUMCOLS  RES      1                 NUMBER OF COLS
*
LNSZ     RES      1                 LINE SIZE
PGADDR   RES      1                 MEMORY PAGE ADDR FOR COLUMN ENTRIES
NUMPGS   DATA     0                 NUMBER OF PAGES REQUIRED
*
FSTBUF   RES      1                 FIRST BUFFER ADDR
NXTBUF   RES      1                 NEXT BUFFER ADDR
CPSTN    RES      1                 CURRENT CARRIER POSITION
ZROFLAG  RES      1                 ZERO-ENTRY FLAG
*
TMPKEY   RES      1                 TEMP SAVE KEY
TMPPGS   RES      1                 TEMP PAGE COUNT
*
*
         PAGE
*
*
FMTSAV   RES      1                 SAVE LAST FORMAT
CTRSAV   RES      1                 SAVE CENTERING FLAG
*
TBLSTKEY RES      1                 TABLE-START KEY
MAXKEY   RES      1                 MAX KEY IN TABLE
ENDLNFLG RES      1                 END-OF-FORMAT LINE FLAG
FSTBLNK  RES      1                 FIRST BLANK ADDR
RCENDKEY RES      1                 R/C END KEY
*
COLCOUNT RES      1                 TEMP COLUMN COUNT
ROWCOUNT RES      1                      ROW COUNT
ENTRYCNT RES      1                      ENTRY COUNT
SAVPTR   RES      1                      POINTER SAVE
*
TABLESP  RES      1                 TABLE SPACING COUNT
*
12END    EQU      %
*
         USECT    #PLOC
         END
