* 12/19/75 -- 15:30
*        SUBROUTINE TO OUTPUT TO THE LP AND/OR XGP
*        ENTRY POINT - S40PRINT
*        WITH: BUF1 - BYTE ADDRESS OF OUTPUT LINE
*              AC1 - NO. OF CHARACTERS IN OUTPUT LINE
*              AC2 - 0 FOR TYPEWRITER
*                  - 1 FOR LINE PRINTER
*                  - 2 FOR XGP
*                  - 3 FOR XGP AND LP
*              AC3 - FORMATTING CODE FOR THIS OUTPUT LINE:
*                       0 = RIGHT-JUSTIFY LINE
*                       1 = NO FORMATTING
*                       2 = CENTER LINE
*                       3 = MOVE LINE AGAINST RIGHT MARGIN
*
         DEF      S40PRINT
         DEF      S40BFLGS          BOX-DRAWING CONTROL
         DEF      LNCOUNT           LINE COUNT FOR EACH PAGE
         DEF      S40SQUEZ,S40XTAB,S40VFCTB,S40BUF1 DEF'S FOR MODIFYS
*
         REF      S03NXTAB,S27LPRNT,S27XPRNT
         REF      S27PRINT          PRINT TO TERMINAL
         REF      LFTMRGN
         REF      S35HEXC           HEX CONVERSION ROUTINE
         REF      FGENFLG           FORMS GENERATION FLAG
         REF      S41STOP           BOX DRAW INITIALIZER .
         REF      S41BOX            BOX-DRAWING ROUTINE
         REF      1200FLG           1200 OUTPUT FLAG
*
         SYSTEM   TEXTDEF
         DEF      40P,40D
*
*
40P      EQU      %
         DATA     X'40'             MODULE NUMBER
         DATA     X'121975'         DATE
         DATA     X'1530'           TIME
*
         TITLE    '** XPRNT(40) **'
*
*
*        ENTRY POINT, PROCESS THE LINE
*
S40PRINT EQU      %
         SAVRTN
*
         STW,BUF1 INBUFADD          SAVE INCOMING PARAMETERS
         STW,AC1  INPUTCT
         STW,AC2  OUTCODE
         STB,AC3  FMTCODE           SAVE FORMATTING CODE .
         MTW,0    OUTCODE           TEST DEVICE TYPE
         BEZ      2741OUT              2741, GO PRINT
         LI,AC3   0                 INITIALIZE OVERPRINT FLAG
         STW,AC3  BUF1MAX           MAX COUNT FOR MAIN BUFFER
         STW,AC3  BUF2MAX           MAX COUNT FOR OVERSTRIKE BUFFER
         LW,AC3   ='    '           CLEAR OUTPUT BUFFERS
         LI,X1    OUTBUFL
         STW,AC3  OUTBUF1-1,X1
         STW,AC3  OUTBUF2-1,X1
         BDR,X1   %-2
*
         LI,AC3   1                 INITIALIZE POINTERS
         STW,AC3  OTBUFPTR
         STW,AC3  INBUFPTR
         MTW,1    OTBUFPTR             LP OR XGP, INCR POINTER
         CI,AC2   2                 TEST FOR XGP
         BNE      S40NEXTC             NO, GET FIRST CHAR
         AW,AC3   LFTMRGN           ADD LEFT MARGIN CHARS
         STW,AC3  OTBUFPTR          STORE OUTPUT BUFFER POINTER
         LB,AC3   FMTCODE           RETRIEVE FORMAT CODE FOR THIS LINE .
         SCS,AC3  -7                PUT 'DONT HONOR BOX CONTROL CHARS'
*        FLAG IN BIT 31, 'CANCEL BOX-DRAWING' FLAG IN BIT 0 .
         STB,AC3  BOXOSFLG          SAVE 'IGNORE BCC' INDICATOR .
         AI,AC3   +0
         BGEZ     %+2               GO IF NO CANCELLATION REQUEST.
         BAL,SRTN S41STOP           KILL THE BOX DRAWING ROUTINE .
*
S40NEXTC EQU      %
         LW,X1    INBUFPTR          CHECK FOR INPUT EMPTY
         CW,X1    INPUTCT
         BG       S40OUTPT
*
         LW,X1    INBUFADD
         MTW,1    INBUFADD
         LB,X2    0,X1              GET NEXT CHARACTER
         MTW,1    INBUFPTR          ADVANCE POINTER
*
         CI,X2    CTLMAX            IS IT A CONTROL CODE
         BG       S40SEL            NO, TRANSLATE IT
         CI,X2    #TAB              IS CHAR = TAB
         BE       S40TAB            YES
         MTW,0    1200FLG           1200 OUTPUT
         BNEZ     S40SEL            YES, SKIP SPECIAL CHAR PROC
         CI,X2    #BLANK            TEST FOR BLANK
         BE       S40BLANK             YES, PROCESS BLANK
         CI,X2    #BKSP             TEST FOR BACKSPACE
         BE       S40BKSP              YES, PROCESS BKSP
*
         CI,X2    #STOP
         BE       S40STOP           STOP
         CI,X2    #CR               TEST FOR END-OF-LINE
         BE       S40OUTPT             YES, PRINT LINE
*
S40SEL   EQU      %
         LW,X3    OUTCODE           GET DEVICE CODE
         CI,X3    2                 TEST FOR XGP
         BE       S40BUF1              YES, STORE CHAR IN MAIN BUFFER
         LW,X3    X2
         AI,X3    -CTLMAX           SHIFT CHAR RANGE
         BLZ      LPSPCL               SPECIAL, GO SUB '*'
         CI,X2    #UL               TEST FOR UNDERLINE
         BNE      TSTLPTBL             NO, TEST LP TABLE
         LI,X2    '-'                  YES, SUB '-'
         B        S40BUF2           GO STORE DASH IN OS BUFFER
*
TSTLPTBL EQU      %
         LB,AC1   PRINTAB,X3        GET ENTRY IN LP TABLE
         BNEZ     S40BUF1              PRINTABLE, GO PRINT
*
LPSPCL   EQU      %
         LI,X2    '*'               NON-PRINTABLE, SUB '*'
         B        S40BUF2           PRINT IN OS BUFFER
*
*
S40BUF1  EQU      %
         LW,X3    OTBUFPTR          GET OUTPUT INDEX
         LB,AC1   OUTBUF1,X3        IS NEXT POSITION BLANK
         CI,AC1   ' '
         BNE      TSTBUF2           NO, TEST OS BUFFER
*
SETBUF1  EQU      %
         STB,X2   OUTBUF1,X3        YES, STORE IT IN PRINTABLE BUFFER
         CW,X3    BUF1MAX           TEST MAX COUNT
         BLE      S40BINC              LESS, INCR POINTER
         STW,X3   BUF1MAX              MORE, STORE NEW MAX
*
S40BINC  EQU      %
         MTW,1    OTBUFPTR
         B        S40NEXTC
*
TSTBUF2  EQU      %
         LW,X3    OUTCODE           TEST FOR LINE PRINTER
         CI,X3    1
         BE       S40BUF2              YES, STORE CHAR IN OV BUFF
         STW,AC1  BUF1CHAR          SAVE  MAIN BUFFER CHAR
         STW,X2   NEWCHAR           SAVE  NEW CHAR
         LW,X3    OTBUFPTR          GET OUTPUT POINTER
         LB,AC3   OUTBUF2,X3        GET OS BUFFER CHAR
         STW,AC3  BUF2CHAR          SAVE OS BUFFER CHAR
         CI,AC3   #BLANK            TEST FOR BLANK IN OS BUFFER
         BE       S40TSTSC             YES, TEST FOR SPECIAL CHAR
         LW,AC1   BUF2CHAR             NO, GET CHAR
*
S40TSTSC EQU      %
         LI,X3    WA(OSTBL)         ADDR OF SP. CHAR TABLE
         LI,X4    1                 BYTE INDEX FOR 2ND CHAR
*
TSTOSLP  EQU      %
         CB,AC1   *X3               TEST 1ST CHAR IN ENTRY
         BNE      INCROSLP             NO, INCR POINTER
         CB,X2    *X3,X4            TEST 2ND CHAR IN ENTRY
         BNE      INCROSLP             NO, INCR POINTER
         CI,X3    OSTBLBOX          SEE IF THIS IS BOX-DRAWING CTRL CHAR
         BL       %+3               BRANCH IF NOT
         MTW,0    BOXOSFLG          IS BOX DRAWING TURNED OFF ?
         BEZ      NOSPCHAR          YES - DON'T DO ANYTHING SPECIAL .
         LW,AC1   *X3               SP CHAR FOUND, GET HEX CODE (BYTE 3)
         B        STSPCHAR          GO STORE HEX CODE
*
INCROSLP EQU      %
         AI,X3    1                 INCR TABLE POINTER
         CI,X3    WA(OSTBLEND)      TEST FOR END-OF-TABLE
         BLE      TSTOSLP              NO, TEST NEXT ENTRY
*
*
TSTHEX   EQU      %                 NOT SP CODE, TEST FOR HEX SEQ
         LW,AC2   X2                GET 2ND CHAR IN SEQ
         BAL,SRTN S35HEXC           CONVERT TO HEX IF VALID
         CI,AC1   0                 TEST FOR VALID CODE
         BGE      STSPCHAR             YES, STORE HEX CODE
*
NOSPCHAR EQU      %                 SPECIAL CHAR NOT FOUND
         LW,X2    NEWCHAR           RESTORE NEW CHAR
         B        S40BUF2           STORE IN OS BUFFER
*
STSPCHAR EQU      %                 SP CHAR FOUND
         LW,X2    AC1               GET HEX CODE
         LW,AC1   BUF2CHAR          GET OLD OS BUFFER CHAR
         CI,AC1   #BLANK            TEST FOR BLANK
         BNE      S40BUF2              NO, STORE HEX CODE IN OS BUFFER
         CI,X3    OSTBLBOX          DOES THIS SPECIAL CHAR HAVE TO BE
         BL       %+4               AN OVERSTRIKE?  BRANCH NO .
         LW,X3    OTBUFPTR          GET INDEX TO CURRENT COLUMN
         STB,AC1  OUTBUF1,X3        BLANK OUT MAIN BUFFER POSITION .
         B        S40BUF2           GO STORE OVERSTRIKE .
         LW,X3    OTBUFPTR             YES, GET INDEX FOR MAIN BUFFER
         B        SETBUF1           GO STORE HEX CODE
*
S40BUF2  EQU      %
         LW,X3    OTBUFPTR
         STB,X2   OUTBUF2,X3        STORE IN OVERSTRIKE BUFFER
         CW,X3    BUF2MAX           TEST MAX COUNT
         BLE      S40BINC              LESS, INCR POINTER
         STW,X3   BUF2MAX              MORE, STORE NEW MAX
         B        S40BINC
*
* PROCESS BACKSPACE CHAR FOR LP OR XGP
*
S40BKSP  EQU      %
         LW,AC1   OTBUFPTR          GET OUTPUT POINTER
         AI,AC1   -1                DECR OUTPUT POINTER
         BLEZ     S40NEXTC             ZERO, GET NEXT CHAR
         STW,AC1  OTBUFPTR          STORE NEW OUTPUT POINTER
         B        S40NEXTC          GET NEXT CHAR
*
* PROCESS TAB CHARACTER FOR LP OR XGP
*
S40TAB   EQU      %                 TAB
         LW,X3    OTBUFPTR          GET BUFFER INDEX
         LW,AC3   OUTCODE           GET DEVICE CODE
         CI,AC3   2                 TEST FOR XGP
         BE       S40XTAB              YES, ADD MARGIN
         AI,X3    -1                DECR TAB POINTER
         BAL,SRTN S03NXTAB             NO, GET NEXT TAB POSITION
         AI,X3    1                 INCR TAB POINTER
         B        ADDTABS           GO UPDATE OUTPUT POINTER
*
S40XTAB  EQU      %
         SW,X3    LFTMRGN           SUBTRACT MARGIN COUNT
         BAL,SRTN S03NXTAB          GET NEXT TAB POSITION
         AW,X3    LFTMRGN           ADD MARGIN COUNT BACK IN
ADDTABS  EQU      %
         STW,X3   OTBUFPTR          SAVE IT
         B        S40NEXTC
*
S40BLANK EQU      %                 BLANK
S40STOP  EQU      %                 STOP
         MTW,1    OTBUFPTR          TREAT AS BLANK
         B        S40NEXTC
*
*        OUTPUT THE LINE
*
S40OUTPT EQU      %
         LW,X1    OUTCODE           GET DEV CODE FOR INDEX
         B        DEVTBL,X1         PROCESS OUTPUT
*
DEVTBL   EQU      %
         B        2741OUT           DEVICE = TERMINAL
         B        LPOUT             DEVICE = LINE PRINTER
         B        XGPOUT            DEVICE = XGP
*
2741OUT  EQU      %
         BAL,SRTN S27PRINT          PRINT OUTPUT LINE
         B        S40EXIT           RETURN TO CALLING PROGRAM
*
LPOUT    EQU      %                 LINE PRINTER OUTPUT
         LI,BUF1  BA(OUTBUF1)       ADDR OF MAIN BUFFER
         LW,AC1   BUF1MAX           SIZE OF MAIN BUFFER
         AI,AC1   1                 INCR COUNT FOR VFC CONTROL
         BAL,SRTN S27LPRNT          PRINT MAIN BUFFER OUTPUT LINE
         LW,AC1   BUF2MAX           GET SIZE OF OVERSTRIKE BUFFER
         BLEZ     S40EXIT              ZERO, RETURN
*
         LI,AC2   '++'              STORE CARRIAGE CONTROL CODE
         STH,AC2  OUTBUF2           STORE IN OVERSTRIKE BUFFER
         AI,AC1   1                 INCR COUNT FOR VFC CONTROL
         LI,BUF1  BA(OUTBUF2)       GET ADDR OF OVERSTRIKE BUFFER
         BAL,SRTN S27LPRNT          PRINT OVERSTRIKE LINE
         B        S40EXIT           RETURN
*
*
XGPOUT   EQU      %
         MTW,1    LNCOUNT           INCR LINE COUNT FOR THIS PAGE
         LW,AC3   LNCOUNT           PASS LN # TO BOX BUT I DON'T THINK IT'S USED
         LI,BUF1  BA(OUTBUF1)       PASS ADDRESSES OF MAIN AND
         LI,BUF2  BA(OUTBUF2)       OVERSTRIKE BUFFERS TO BOX DRAWER.
         LW,AC1   BUF1MAX           PASS NO. OF CHARS IN
         LW,AC2   BUF2MAX           BUFFERS .
         BAL,SRTN S41BOX            CALL ROUTINE TO CONVERT BOX-DRAWING
*                 CONTROL CODES INTO ACTUAL CHARS THAT GO ONTO PAPER .
         STW,AC1  BUF1MAX           PUT BACK LINE LENGTHS IN CASE
         STW,AC2  BUF2MAX           BOX DRAWER CHANGED THEM .
         BAL,SRTN S40FGEN           GO GENERATE FORM FOR THIS LINE
         LI,BUF1  BA(OUTBUF1)+1     ADDR OF MAIN BUFFER (W/O VFC)
         LW,AC1   BUF1MAX           SIZE OF MAIN BUFFER
         BLEZ     BLNKLN               BLANK LINE, GO PRINT
         BAL,SRTN S40SQUEZ          REPLACE BLANKS WITH TABS - COUNT
         AI,BUF1  -1                NOW SET ADDR TO INCLUDE VFC
         AI,AC1   1                 INCR COUNT TO INCLUDE VFC
         MTW,0    BUF2MAX           TEST FOR OVERSTRIKE LINE
         BLEZ     PRNTBUF              NO, PRINT MAIN BUFFER
         LI,AC2   X'E0'                YES, SET OVERSTRIKE VFC
         STB,AC2  OUTBUF1           STORE VFC IN MAIN BUFFER
         BAL,SRTN S27XPRNT          PRINT MAIN BUFFR LINE
*
         LW,AC1   BUF2MAX           GET OVERSTRIKE BUFFER SIZE
         LI,BUF1  BA(OUTBUF2)+1     ADDR OF OVERSTRIKE BUFFER
         BAL,SRTN S40SQUEZ          SQUEEZE OUT BLANKS
         AI,BUF1  -1                DECR ADDR TO INCLUDE VFC
         AI,AC1   1                 INCR SIZE TO INCLUDE VFC
*
PRNTBUF  EQU      %
         LB,X4    FMTCODE           GET FORMATTING CODE AND
         AND,X4   L(63)             CLEAR EXTRA BOX CONTROL BITS .
         LB,AC3   S40VFCTB,X4       GET VFC CHAR FOR THIS CODE
         STB,AC3  0,BUF1            STORE VFC CHARACTER
         BAL,SRTN S27XPRNT          PRINT XGP BUFFER
*
*
*
S40EXIT  EQU      %
         RETURN
*
S40VFCTB EQU      %                 VFC CHARS FOR FORMATTING CODES 0-3
         DATA,1   ' ',' ',' ',' '   ALL NORMAL BLANKS FOR NOW
         DATA,1   X'E1'             INSERT FIGURE VFC
         BOUND    4
*
*
BLNKLN   EQU      %
         LI,BUF1  BA(BLNKCODE)      ADDR OF BLANK LINE CODE
         LI,AC1   2                 SIZE OF BLANK LINE
         BAL,SRTN S27XPRNT          GO PRINT LINE
         B        S40EXIT           RETURN
*
*
BLNKCODE TEXT     '    '            BLANK LINE
*
*
         PAGE
*
*        SQUEEZE SUBROUTINE - ELIMINATES BLANK STRINGS MORE THAN 3 IN
*          LENGTH.  SUBSTITUTES TAB/CT SEQUENCE & RETURNS BUF LENGTH
*          IN REG AC1
*        ENTRY:
*        LI,BUF1  BA(BUFFER)
*        LW,AC1   OTBUFPTR
*        BAL,SRTN S40SQUEZ
*
S40SQUEZ EQU      %
         SAVRTN
         MTW,0    1200FLG           1200 OUTPUT
         BNEZ     S40SQ03           YES, EXIT
*
         LW,X1    BUF1              INPUT INDEX
         LW,X2    BUF1              OUTPUT INDEX
         LI,X3    0                 BLANK COUNTER
         AW,AC1   BUF1              LAST LOCATION
S40SQ01  EQU      %
         CW,X1    AC1               ARE THERE MORE CHARACTERS
         BL       S40SQ05           YES
         SW,X2    BUF1              COMPUTE COUNT
         LW,AC1   X2                MOVE TO PROPER REGISTER
S40SQ03  RES      0
         RETURN
*
S40SQ05  EQU      %
         LB,AC2   0,X1              GET NEXT BYTE
         AI,X1    1
         CI,AC2   ' '               IS IT A BLANK
         BNE      S40SQ10           NO
         AI,X3    1                 CT = CT + 1
         B        S40SQ01
*
S40SQ10  EQU      %
         AI,X3    0                 IS CT = 0
         BNEZ     S40SQ15           NO
S40SQ12  EQU      %
         STB,AC2  0,X2              STORE THE BYTE
         AI,X2    1
         B        S40SQ01
*
S40SQ15  EQU      %
         CI,X3    2                 IS CT .GT. 2
         BG       S40SQ20           YES
*
         LI,AC3   ' '               LOAD BLANK
         STB,AC3  0,X2
         AI,X2    1
         CI,X3    2
         BNE      S40SQ18           ONLY 1 BLANK
         STB,AC3  0,X2
         AI,X2    1
S40SQ18  EQU      %
         LI,X3    0                 CT = 0
         B        S40SQ12           GO STORE THIS CHAR.
*
S40SQ20  EQU      %
         LI,AC3   5                 TAB CHAR
         STB,AC3  0,X2
         AI,X2    1
         STB,X3   0,X2              STORE BLANK COUNT
         AI,X2    1
         B        S40SQ18
*
*
         PAGE
*
* S40FGEN -- GENERATE FORM FOR XGP
*
*
S40FGEN  EQU      %
         SAVRTN
*
         LW,AC3   OUTCODE           TEST FOR XGP OUTPUT
         CI,AC3   2
         BNE      RTNFGEN           NOT XGP, RETURN
         MTW,0    FGENFLG           TEST FORMS GENERATION FLAG
         BEZ      RTNFGEN              RESET, RETURN
*
         LI,AC3   WA(FORMSTBL)      GET ADDR OF FIRST ENTRY
         STW,AC3  FTBLPTR           SET POINTER
*
NXTLNLP  EQU      %
         LW,AC3   LNCOUNT           GET CURRENT OUTPUT LINE COUNT
         CB,AC3   *FTBLPTR          TEST FIRST LINE FOR THIS ENTRY
         BL       RTNFGEN              > CURRENT LINE, RETURN
         BE       ENTRYFND             = CURRENT LINE, ENTRY FOUND
         LI,X4    1                    < CURRENT LINE, GET 2ND LINE INDEX
         CB,AC3   *FTBLPTR,X4       TEST 2ND LINE FOR THIS ENTRY
         BLE      ENTRYFND             >= CURRENT LINE, ENTRY FOUND
*
         LI,X4    3                 ENTRY NOT FOUND, GET NWORDS FOR THIS ENTRY
         LB,AC3   *FTBLPTR,X4
         AWM,AC3  FTBLPTR           INCR TABLE POINTER TO NEXT ENTRY
         MTW,0    *FTBLPTR          TEST FOR END-OF-TABLE
         BEZ      RTNFGEN              YES, RETURN
         B        NXTLNLP              NO, TEST THE NEXT ENTRY
*
*
ENTRYFND EQU      %                 ENTRY FOUND, NOW GET CHARS
         LI,X4    3                 GET NUMBER OF CHARS FOR THIS ENTRY
         LB,AC3   *FTBLPTR,X4
         STW,AC3  NLNCHARS          SAVE CHAR COUNT
*
GETCHARS EQU      %
         MTW,-1   NLNCHARS          DECR CHAR COUNT
         BLEZ     RTNFGEN              ZERO, RETURN
         MTW,1    FTBLPTR           INCR TABLE POINTER TO NEXT CHAR
         LB,X1    *FTBLPTR          GET FIRST COL FOR THIS CHAR
         LI,X4    1                 GET LAST COL FOR THIS CHAR
         LB,AC3   *FTBLPTR,X4
         STW,AC3  LSTCOL            SAVE LAST COL
*
         LI,X4    2                 GET CHAR FOR MAIN BUFFER
         LB,AC3   *FTBLPTR,X4
         BEZ      GETOSCH           NONE, GET OS BUFFER CHAR
         LI,AC1   WA(OUTBUF1)       ADDR OF MAIN BUFFER
         LI,AC2   WA(BUF1MAX)       MAX COUNT OF MAIN BUFFER
         B        STFORMCH          GO STORE CHAR
*
GETOSCH  EQU      %
         LI,X4    3                 GET CHAR FOR OVERSTRIKE BUFFER
         LB,AC3   *FTBLPTR,X4
         LI,AC1   WA(OUTBUF2)       ADDR OF OVERSTRIKE BUFFER
         LI,AC2   WA(BUF2MAX)       MAX COUNT OF OVERSTRIKE BUFFER
*
STFORMCH EQU      %
         STB,AC3  *AC1,X1           STORE FORM CHAR IN BUFFER
         CW,X1    LSTCOL            TEST LAST COL FOR THIS CHAR
         BGE      SETBMAX              YES, GO SET MAX COUNT
         AI,X1    1                    NO, INCR POINTER
         B        STFORMCH          STORE NEXT CHAR
*
SETBMAX  EQU      %
         CW,X1    *AC2              TEST MAX COUNT FOR BUFFER
         BLE      GETCHARS             <=, GET NEXT CHAR
         STW,X1   *AC2                 >, STORE NEW MAX
         B        GETCHARS          GO GET NEXT CHAR FOR THIS ENTRY
*
*
RTNFGEN  EQU      %
         RETURN
*
*
         PAGE
*
* S40BFLGS -- BOX DRAWING CONTROL
*
* ENTRY: AC1 = 1  START NEW PAGE (ST CODE)
*              2  START HEADING OR FOOTING (SD CODE)
*              3  END HEADING OR FOOTING (RD CODE)
*
S40BFLGS EQU      %
         SAVRTN
*
         LI,BUF1  BA(BCTRLTBL)-1    ADDR OF CONTROL CODE TABLE.
         AW,BUF1  AC1               ADD INPUT PARAMETER
         LI,AC1   1                 SIZE OF LINE = 1
         LI,AC2   0                 SIZE OF OVERSTRIKE BUFFER = 0
         LW,AC3   LNCOUNT           CURRENT LINE NUMBER
         BAL,SRTN S41BOX            CALL BOX-DRAWING ROUTINE
         RETURN
*
*
BCTRLTBL EQU      %                 BOX-DRAWING CONTROL CODE TABLE
         DATA,1   0                 START OF TABLE
         DATA,1   X'14'             ST CODE
         DATA,1   X'10'             SD CODE
         DATA,1   X'11'             RD CODE
         BOUND    4
*
         PAGE
*
*        TABLE OF PRINTABLE CHARACTERS
*
PRINTAB  EQU      %
         DATA,8   X'0100000000000000'  X'40' - X'47'
         DATA,1   0,0,0,1,1,1,1,1   X'48'-X'4F'
         DATA,8   X'0100000000000000'  X'50' - X'57'
         DATA,8   X'0000000101010100'  X'58' - X'5F'
         DATA,8   X'0101000000000000'  X'60' - X'67'
         DATA,8   X'0000000101000100'  X'68' - X'6F'
         DATA,8   0                    X'70' - X'77'
         DATA,8   X'0000010101010100'  X'78' - X'7F'
         DATA,8   X'0001010101010101'  X'80' - X'87'
         DATA,8   X'0101000000000000'  X'88' - X'8F'
         DATA,8   X'0001010101010101'  X'90' - X'97'
         DATA,8   X'0101000000000000'  X'98' - X'9F'
         DATA,8   X'0000010101010101'  X'A0' - X'A7'
         DATA,8   X'0101000000000000'  X'A8' - X'AF'
         DATA,8   0,0                  X'B0' - X'BF'
         DATA,8   X'0001010101010101'  X'C0' - X'C7'
         DATA,8   X'0101000000000000'  X'C8' - X'CF'
         DATA,8   X'0001010101010101'  X'D0' - X'D7'
         DATA,8   X'0101000000000000'  X'D8' - X'DF'
         DATA,8   X'0000010101010101'  X'E0' - X'E7'
         DATA,8   X'0101000000000000'  X'E8' - X'EF'
         DATA,8   X'0101010101010101'  X'F0' - X'F7'
         DATA,8   X'0101000000000000'  X'F8' - X'FF'
*
*
         PAGE
*
* SPECIAL OVERSTRIKE CHAR TABLE
*
* 1 WORD PER ENTRY: BYTE 0 = FIRST CHAR IN INPUT SEQUENCE
*                   BYTE 1 = LAST CHAR IN INPUT SEQUENCE
*                   BYTE 3 = HEX REPLACEMENT CODE
*
* PROC TO DEFINE SPECIAL OVERSTRIKE CHARS -- OSYM
*
OSYM     CNAME
         PROC
         LOCAL    ARG
*
ARG      SET      S:UT(AF(1))
         DO       ARG(1)>X'C0'&ARG(1)<X'EA'
ARG(1)   SET      ARG(1)&X'BF'
         FIN
*
         GEN,8,8,8,8  ARG(1),ARG(2),0,AF(2)
         PEND
*
*
OSTBL    EQU      %                 ADDR OF FIRST WORD IN TABLE
         OSYM     'U(',X'3A'        TOP-LEFT ROUND BRACKET
         OSYM     'D(',X'3B'        BOTTOM-LEFT ROUND BRACKET
         OSYM     'M(',X'3C'        LEFT-MIDDLE BRACKET
         OSYM     '=(',X'3E'        VERTICAL BAR
         OSYM     'C(',X'42'        SMALL LEFT BRACKET
         OSYM     'A(',X'44'        MUCH LESS THAN
         OSYM     'U)',X'38'        TOP-RIGHT ROUND BRACKET
         OSYM     'D)',X'39'        BOTTOM-RIGHT ROUND BRACKET
         OSYM     'M)',X'3D'        RIGHT-MIDDLE BRACKET
         OSYM     '=)',X'3E'        VERTICAL BAR
         OSYM     'C)',X'52'        SMALL RIGHT BRACKET
         OSYM     'A)',X'45'        MUCH GREATER THAN
*
         OSYM     'U^',X'35'        TOP-LEFT SQUARE BRACKET
         OSYM     'D^',X'36'        BOTTOM-LEFT SQUARE BRACKET
         OSYM     '=^',X'3E'        VERTICAL BAR
         OSYM     'U|',X'34'        TOP-RIGHT SQUARE BRACKET
         OSYM     'D|',X'37'        BOTTOM-RIGHT SQUARE BRACKET
         OSYM     '=|',X'3E'        VERTICAL BAR
*
         OSYM     '0+',X'B0'        SUPERSCRIPT 0
         OSYM     '1+',X'B1'                    1
         OSYM     '2+',X'B2'                    2
         OSYM     '3+',X'B3'                    3
         OSYM     '4+',X'B4'                    4
         OSYM     '5+',X'B5'                    5
         OSYM     '6+',X'B6'                    6
         OSYM     '7+',X'B7'                    7
         OSYM     '8+',X'B8'                    8
         OSYM     '9+',X'B9'                    9
*
         OSYM     '0-',X'70'          SUBSCRIPT 0
         OSYM     '1-',X'71'                    1
         OSYM     '2-',X'72'                    2
         OSYM     '3-',X'73'                    3
         OSYM     '4-',X'74'                    4
         OSYM     '5-',X'75'                    5
         OSYM     '6-',X'76'                    6
         OSYM     '7-',X'77'                    7
         OSYM     '8-',X'78'                    8
         OSYM     '9-',X'79'                    9
*
         OSYM     'B/',X'43'        BLANK SYMBOL
         OSYM     'C/',X'4A'        CENT SIGN
         OSYM     'D/',X'27'        DOWN ARROW
         OSYM     'L/',X'25'        LEFT ARROW
         OSYM     'R/',X'24'        RIGHT ARROW
         OSYM     'U/',X'26'        UP ARROW
*
         OSYM     'A-',X'20'        ATTN SYMBOL
         OSYM     'B-',X'22'        BKSP SYMBOL
         OSYM     'T-',X'21'        TAB SYMBOL
         OSYM     'R-',X'23'        RETURN SYMBOL
*
         OSYM     'G-',X'55'        GREATER-THAN
         OSYM     'L-',X'56'        LESS-THAN
         OSYM     'N-',X'58'        LOGICAL NOT
         OSYM     'O-',X'57'        LOGICAL OR
         OSYM     '.-',X'CB'        HIGH DOT
         OSYM     'G=',X'29'        GREATER-THAN OR EQUAL
         OSYM     'L=',X'28'        LESS-THAN OR EQUAL
*
*        RESULTANT CHARS PAST HERE CONTROL XGP BOX DRAWING AND
*                 ALWAYS GO IN OVERSTRIKE BUFFER .
*
OSTBLBOX EQU      %
*
* SPECIAL BOX-DRAWING OVERSTRIKE SYMBOLS
*
*     FULL CHARACTER POSITION BOXES
*
         OSYM     '[-',X'10'   LEFT CORNER  (ASCII LEFT BRACKET/MINUS)
         OSYM     '^-',X'10'   LEFT CORNER  (2741 LEFT BRACKET/MINUS)
         OSYM     ']-',X'11'   RIGHT CORNER  (ASCII RIGHT BRACKET/MINUS)
         OSYM     '|-',X'11'   RIGHT CORNER  (2741 RIGHT BRACKET/MINUS)
         OSYM     '(-',X'12'   START HORIZ LINE
         OSYM     ')-',X'13'   END HORIZ LINE
         OSYM     '+.',X'14'   START/END VERTICAL LINE
*
*     PARTIAL CHARACTER POSITION BOXES
*
         OSYM     '[=',X'15'   LEFT CORNER  (ASCII LEFT BRACKET/EQUALS)
         OSYM     '^=',X'15'   LEFT CORNER  (2741 LEFT BRACKET/EQUALS)
         OSYM     ']=',X'16'   RIGHT CORNER  (ASCII RIGHT BRACKET/EQUALS)
         OSYM     '|=',X'16'   RIGHT CORNER  (2741 RIGHT BRACKET/EQUALS)
         OSYM     '(=',X'17'   START UNDERLINE
         OSYM     ')=',X'18'   END UNDERLINE
         OSYM     '+=',X'19'   START LEFT VERT/END VERT LINE
         OSYM     '*=',X'1A'   START/END RIGHT VERT LINE
*
OSTBLEND EQU      %-1               ADDR OF LAST WORD IN TABLE
*
*
         PAGE
*
* FORMSTBL -- FORMS GENERATION TABLES
*
* PROCS FOR FORMS GENERATION:
*        STARTFORM - START NEW FORM
*        LINES - RANGE OF LINES FOR CURRENT ENTRY
*        MCHAR - MAIN BUFFER CHARACTER
*        OCHAR - OVERSTRIKE BUFFER CHARACTER
*
STARTFORM CNAME
         PROC
*
NLINES   SET      0
         PEND
*
*
LINES    CNAME
         PROC
         LOCAL    HERE
*
         DO       NLINES>0
HERE     SET      %
         ORG,1    LOCN
         GEN,8    NLINES+1
         ORG,4    HERE
         FIN
NLINES   SET      0
*
         DO       NUM(AF)<2
         GEN,8,8,8    AF(1),AF(1),0
         ELSE
         GEN,8,8,8    AF(1),AF(2),0
         FIN
*
LOCN     SET      BA(%)
         BOUND    4
         PEND
*
*
MCHAR    CNAME    0
OCHAR    CNAME    1
         PROC
*
NLINES   SET      NLINES+1
         DO       NUM(CF)<3
         GEN,8,8  CF(2),CF(2)
         ELSE
         GEN,8,8  CF(2),CF(3)
         FIN
*
         DO       NAME=0
         GEN,8,8  AF(1),0
         ELSE
         GEN,8,8  0,AF(1)
         FIN
         PEND
*
*
ENDFORM  CNAME
         PROC
*
         LOCAL    HERE
         DO       NLINES>0
HERE     SET      %
         ORG,1    LOCN
         GEN,8    NLINES+1
         ORG,4    HERE
         FIN
         DATA     0
*
NLINES   SET      0
         PEND
*
         PAGE
*
* SPECIFICATION FORM
*
*
FORMSTBL EQU      %
         STARTFORM
*
         LINES    2
         MCHAR,4,93   X'6D'
*
         LINES    3,57
         MCHAR,4      X'62'
         MCHAR,93     X'63'
*
         LINES    58
         MCHAR,4      X'62'
         OCHAR,20,92  X'6D'
         MCHAR,93     X'65'
*
         LINES    59
         MCHAR,4      X'62'
         OCHAR,20     X'62'
         OCHAR,60     X'62'
         OCHAR,93     X'63'
*
         LINES    60
         MCHAR,4      X'62'
         OCHAR,20     X'62'
         OCHAR,60     X'64'
         OCHAR,61,92  X'6D'
         OCHAR,93     X'65'
*
         LINES    61
         MCHAR,4      X'62'
         OCHAR,20     X'62'
         OCHAR,60     X'62'
         OCHAR,93     X'63'
*
         LINES    62
         MCHAR,4      X'62'
         OCHAR,20     X'62'
         OCHAR,60     X'64'
         OCHAR,61,92  X'6D'
         OCHAR,93     X'65'
*
         LINES    63
         MCHAR,4      X'64'
         OCHAR,5,19   X'6D'
         OCHAR,20     X'64'
         OCHAR,21,59  X'6D'
         OCHAR,60     X'64'
         OCHAR,61,92  X'6D'
         OCHAR,93     X'65'
*
         ENDFORM
*
*
         PAGE
*
*
40D      CSECT    0
*
*        VARIABLE AND STORAGE AREA
*
OUTBUFL  EQU      64                LENGTH (WORDS) OF OUTPUT BUFFERS
OUTBUF1  RES      OUTBUFL           PRINTABLE CHARACTER BUFFER
OUTBUF2  RES      OUTBUFL           NON-PRINTING AND OVERSTRIKE BUFFER
OTBUFPTR DATA     0                 INDEX TO NEXT POSITION IN OUT. BUF.
INPUTCT  DATA     0                 NO. OF CHARS. IN INPUT BUFFER
INBUFADD DATA     0                 ADDRESS OF INPUT BUFFER
BUF1MAX  RES      1                 MAX COUNT FOR MAIN BUFFER
BUF2MAX  RES      1                 MAX COUNT FOR OVERSTRIKE BUFFER
DEVADDR  RES      1                 OUTPUT ROUTINE ADDRESS
INBUFPTR DATA     0                 INDEX TO NEXT CHAR TO INPUT
OUTCODE  DATA     0                 OUTPUT DEVICE CODE
LNCOUNT  RES      1                 LINE COUNT FOR EACH PAGE
FMTCODE  RES      1                 FORMATTING CODE FOR OUTPUT LINES
BOXOSFLG DATA     0
*
BUF1CHAR RES      1                 MAIN BUFFER CHAR
BUF2CHAR RES      1                 OS BUFFER CHAR
NEWCHAR  RES      1                 NEW CHAR
*
FTBLPTR  RES      1   FORMS TABLE POINTER
NLNCHARS RES      1   LINES COUNTER FOR FORMS
LSTCOL   RES      1   LAST COL POINTER FOR FORMS
*
CTLMAX   EQU      X'40'
*
*
         USECT    #PLOC
         END
