*  9/19/74  --  16:30
* MODULE NAME: BOXDRAW
* NUMBER: 41
* PURPOSE: DRAWS BOXES AND LINES FOR XGP OUTPUT
* ENTRY POINTS:
*
         DEF      S41BOX            BOX-DRAWING ROUTINE
         DEF      S41STOP
*
*
         SYSTEM   TEXTDEF
*
         DEF      41P,41D
*
41P      EQU      %
         DATA     X'41'             MODULE NUMBER
         DATA     X'091974'         DATE
         DATA     X'1630'           TIME
*
*
         TITLE    '** BOXDRAW(41) **'
*
* S41BOX -- BOX-DRAWING ROUTINE
*
* ENTRY: BUF1 = BYTE ADDR OF MAIN OUTPUT BUFFER
*        BUF2 = BYTE ADDR OF OVERSTRIKE BUFFER
*        AC1  = NUMBER OF CHARS IN MAIN BUFFER
*        AC2  = NUMBER OF CHARS IN OVERSTRIKE BUFFER
*        AC3  = LINE COUNT FOR CURRENT PAGE
*
* RETURN: BUF1,BUF2 - UNCHANGED.  AC1,AC2 - NEW COUNTS(IF
*   CHANGED).  ALL OTHER REGISTERS VOLATILE.
*
* CONTROL: COLUMN 1 IS CONTROL CODE: X'14' = T+99 OR T+(N);... COMMAND,
*   X'10' = START HEADING, X'11' = END HEADING, X'12' = START FOOTING,
*   X'13' = END FOOTING.    X'14' = CANCEL BOX DRAWING(CLEAR ALL
*   COLUMN FLAGS), X'10'-X'13' = SET/RESET 'SUSPEND BOX'
*   FLAG; IGNORE REST OF LINE.  ALL OTHERS = INSPECT NORMAL AND
*   OVERSTRIKE BUFFERS;  GENERATE APPROPRIATE BOX DRAWING CHARACTERS.
*
         PAGE
S41BOX   EQU      %
         SAVRTN
*
         LI,AC3   +0                INITIALIZE COLUMN INDEX.
         STW,AC3  ROWFLG            INITIALIZE ROW CONTROL FLAG.
         AI,BUF1  +1                SKIP PADDING BYTE 40PRINT ADDED TO LINE
         LB,X2    0,BUF1            GET 1ST BYTE(MAIN BUFFER)
         AI,BUF1  -1                RESTORE VALUE OF BUFFER POINTER.
*
CHKCTRL  CLM,X2   BOXSUSRESLIMS     IS THIS SUSPEND OR RESUME CODE?
         BCS,9    STARTSCAN         NO - GO SCAN BUFFERS.
         B        %+1-LOSUSRES,X2   YES - TURN BOX-DRAWING ON OR OFF.
*
         B        SUSPEND
         B        RESUME
         B        SUSPEND
         B        RESUME
         B        S41STOP2
RESUME   EQU      %
         STW,AC3  SUSFLG            CLEAR SUSPEND FLAG
         RETURN
SUSPEND  MTW,+1   SUSFLG            SET SUSPEND FLAG.
         B        RESUME+1
*
* THE IF PROC GENERATES THE CALLING SEQUENCE FOR THE ROUTINE THAT
* CHECKS THE CURRENT CONTENTS OF THE MAIN AND OVERSTRIKE BUFFERS
* AND PLACES THE ACTUAL BOX & LINE DRAWING CODES IN THEM.
*   EACH CALL MUST SPECIFY A COMPARISON BETWEEN SUSFLG, ROWFLG OR
*   COLFLG(CURRENT COLUMN) AND A CONSTANT, THE CONDITION(EQUAL OR
*   UNEQUAL COMPARE) UNDER WHICH ACTION IS TO BE TAKEN AND WHETHER
*   THE RESULTING GRAPHIC CHARACTER GOES IN THE MAIN OR OVERSTRIKE
*   BUFFER.  THE VALUE TO WHICH ROWFLG AND/OR COLFLG WILL BE SET
*   IF THE COMPARISON CONDITION IS MET CAN ALSO BE SPECIFIED.  THE
*   PROC ALSO SAYS WHETHER THE SUBROUTINE SHOULD RETURN TO ITS
*   CALLER OR GO SCAN THE NEXT CHAR IN THE BUFFERS.
*
* THE FOLLOWING EQUS DEFINE THE LOCATIONS AND SIZES OF THE FIELDS
* IN THE ARGUMENT WORD THAT IS PASSED TO THE PUTBUF ROUTINE.
*
COMP1SHFT  EQU    12
COMP1MASK  EQU    3**COMP1SHFT
COMPOPSHFT  EQU   11
COMPOPMASK  EQU   1**COMPOPSHFT
COMP2SHFT  EQU    9
COMP2MASK  EQU    3**COMP2SHFT
WRITESTRIKESHFT  EQU  8
WRITESTRIKEMASK  EQU  1**WRITESTRIKESHFT
ARGSHFT  EQU      7
ARGMASK  EQU      1**ARGSHFT
SETCOLSHFT  EQU   6
SETCOLMASK  EQU   1**SETCOLSHFT
COLVALSHFT  EQU   4
COLVALMASK  EQU   3**COLVALSHFT
SETROWSHFT  EQU   3
SETROWMASK  EQU   1**SETROWSHFT
ROWVALSHFT  EQU   1
ROWVALMASK  EQU   3**ROWVALSHFT
SCANSHFT EQU      0
SCANMASK EQU      1**SCANSHFT
*
IF       CNAME
         PROC
         GOTO,NUM(AF)<2|NUM(AF)>5 IFERR  DIE IF TOO FEW OR TOO MANY ARGS
LF       EQU      %
AVAL     SET      (SCOR(AF(1,1),SUS,ROW,COL,SUS1COL0)-1)**COMP1SHFT
         DO       AVAL<3**COMP1SHFT DO UNLESS SUS1COL0
         GOTO,NUM(AF(1))~=3  IFERR  REQUIRE 3 ARGS FOR COMPARISON.
AVAL     SET      AVAL|(SCOR(AF(1,2),EQ,NE)-1)**COMPOPSHFT|;
                    AF(1,3)**COMP2SHFT&COMP2MASK  SPECIFY COMPARISON.
         FIN
AVAL     SET      AVAL|(SCOR(AF(2,1),WRITE,OSTRIKE)-1)**WRITESTRIKESHFT
IFIX     DO       NUM(AF)-2
IFIX2    SET      SCOR(AF(IFIX+2,1),SETCOL,SETROW,SCAN)
         GOTO,IFIX<1|NUM(AF(IFIX+2))~=2&IFIX2<3 IFERR
         DO1      IFIX2=1
AVAL     SET      AVAL|SETCOLMASK|AF(IFIX+2,2)**COLVALSHFT&COLVALMASK
         DO1      IFIX2=2
AVAL     SET      AVAL|SETROWMASK|AF(IFIX+2,2)**ROWVALSHFT&ROWVALMASK
         DO1      IFIX2=3           SCAN
AVAL     SET      AVAL|SCANMASK
         FIN
         DO       NUM(AF(2))>1      IF THE CHAR TO BE PRINTED WAS GIVEN,
         LI,AC3   AF(2,2)           PUT IT IN A REG .
AVAL     SET      AVAL|ARGMASK      NOTE THAT WE HAD A CHAR ARGUMENT.
         FIN
         GOTO,AVAL>0  IFLI
IFERR    ERROR,3  'BAD ARGUMENTS TO IF PROC'
*
IFLI     BOUND    1
         LI,DX1   AVAL
         BAL,SRTN S41PUTBUF
         PEND
         PAGE
*  FOLLOWING CHARACTERS(BYTES) ARE SENT TO XGP HANDLER TO
*  PUT LINE AND BOX SEGMENTS ON PAPER .
*
LEFTTEE EQU      X'2A'
RIGHTTEE  EQU    X'2B'
CROSS    EQU      X'2C'
LOWTEE   EQU      X'2D'             LOWER TEE
UPTEE    EQU      X'2E'             UPPER TEE
UPLEFTCORN  EQU   X'30'             UPPER LEFT CORNER
UPRIGHTCORN  EQU  X'31'             UPPER RIGHT CORNER
LOWRIGHTCORN  EQU  X'32'            LOWER RIGHT CORNER
LOWLEFTCORN  EQU  X'33'             LOWER LEFT CORNER
VERTBAR  EQU      X'3E'             CENTERED VERTICAL BAR
HORIZBAR EQU      X'3F'             CENTERED HORIZONTAL BAR
LEFTVERTBAR   EQU  X'62'            LEFT EDGE VERTICAL BAR
RIGHTVERTBAR  EQU  X'63'            RIGHT EDGE VERTICAL BAR
BIGLEFTCORNR  EQU  X'64'            LARGE LOWER LEFT CORNER
BIGRIGHTCORNR  EQU  X'65'           LARGE LOWER RIGHT CORNER
UNDLINE  EQU      X'6D'             UNDERLINE
*
*
STARTSCAN  EQU    %
* SINCE THIS MODULE DOES NOT USE ANY DATADEF PROCEDURES, IT'S ALL
* RIGHT TO USE THE REGISTERS NORMALLY RESERVED FOR THEM.
         LI,X1    +0                INITIALIZE COLUMN FLAG INDEX.
         LW,D2    AC1
         CW,D2    AC2               FIND THE LARGEST OF  A)SIZE OF
         BGE      %+2               MAIN BUFFER  B)SIZE OF OVERSTRIKE
         LW,D2    AC2               BUFFER &  C)RIGHTMOST COLUMN THAT
         CW,D2    RIGHTEDGE         NOW HOLDS A VERTICAL LINE
         BGE      %+2               SO WE KNOW HOW FAR TO SCAN INTO
         LW,D2    RIGHTEDGE         THE BUFFERS.  D2<--LARGEST .
         LW,BUF3  BUF1              GET BA(MAIN BUFFER) AND
         LW,X3    BUF2              BA(O'STRIKE BUFFER) IN VOLATILE   REGS
         AW,AC1   BUF1              PUT BYTE ADDRS OF LAST CHARS IN
         AW,AC2   BUF2              BUFFERS INTO AC1 & AC2.
*
SCANNEXT EQU      %
         AI,X1    +1                STEP POINTER TO NEXT COLUMN.
         CW,X1    D2                ARE ALL SIGNIFICANT COLUMNS CHECKED
         BG       S41WINDUP         ALREADY?  BRANCH YES .
         AI,BUF3  +1                STEP MAIN AND OVERSTRIKE
         AI,X3    +1                BUFFER POINTERS TO NEXT COLUMN.
         LB,DX2   COLFLG,X1         GET COLFLG FOR FUTURE REFERENCE.
         LB,X2    0,X3              GET OVERSTRIKE CHAR .
         LI,AC3   ' '
         CLM,X2   BCCLIMS           DO WE HAVE A BOX CONTROL CHARACTER?
         BCS,9    %+3               BRANCH IF NOT.
         STB,AC3  0,X3              BLANK OUT THE BCC .
         B        BCCGO,X2          GO PROCESS THE BCC .
*
* NO BOX CONTROL CHARACTER IN THIS COLUMN .
         AI,DX2   +0                IF COLFLG
         BEZ      %+3               EQUALS ZERO OR
         MTW,0    SUSFLG            SUSFLG IS SET
         BEZ      NOBCCCOLGT0      THEN FALL THROUGH.
         IF       (ROW,EQ,0),(WRITE),SCAN
         IF       (ROW,EQ,1),(WRITE,HORIZBAR),SCAN
         IF       (ROW,EQ,2),(OSTRIKE,UNDLINE),SCAN
         B        ERROR2            ROW>2|ROW<0
*
NOBCCCOLGT0  EQU %
         CI,DX2   +1                IF COLFLG EQUALS ONE
         BNE      NOBCCCOLGT1      FALL THROUGH .
         IF       (ROW,EQ,2),(OSTRIKE,UNDLINE)
         IF       (ROW,EQ,1),(WRITE,CROSS),SCAN
         IF       (ROW,NE,1),(WRITE,VERTBAR),SCAN
*
NOBCCCOLGT1  EQU %
         CI,DX2   +2                IF COLFLG EQUALS TWO
         BNE      NOBCCCOLGT2      FALL THROUGH .
         IF       (ROW,EQ,1),(WRITE,HORIZBAR)
         IF       (ROW,EQ,2),(OSTRIKE,BIGLEFTCORNR),SCAN
         IF       (ROW,NE,2),(OSTRIKE,LEFTVERTBAR),SCAN
*
NOBCCCOLGT2  EQU %
         CI,DX2   +3                IF COLFLG EQUALS THREE,
         BNE      ERROR2            FALL THROUGH - ELSE ERROR .
         IF       (ROW,EQ,1),(WRITE,HORIZBAR)
         IF       (ROW,EQ,2),(OSTRIKE,BIGRIGHTCORNR),SCAN
         IF       (ROW,NE,2),(OSTRIKE,RIGHTVERTBAR),SCAN
*
BCCFLC   EQU      %                 FULL-CHARACTER LEFT CORNER
         IF       (SUS,EQ,1),(WRITE,' '),SCAN
         MTW,0    ROWFLG            ERROR IF
         BNEZ     ERROR             ROWFLG .NE. ZERO .
         IF       (COL,EQ,0),(WRITE,UPLEFTCORN),(SETROW,1),;
                    (SETCOL,1),SCAN
         IF       (COL,EQ,1),(WRITE,LOWLEFTCORN),(SETROW,1),;
                    (SETCOL,0),SCAN
         B        ERROR             ERROR IF COL>1 .
*
BCCFRC   EQU      %                 FULL-CHARACTER RIGHT CORNER
         IF       (SUS,EQ,1),(WRITE,' '),SCAN
         LW,DX2   ROWFLG
         CI,DX2   +1                ERROR IF
         BNE      ERROR             ROWFLG .NE. 1 .
         IF       (COL,EQ,0),(WRITE,UPRIGHTCORN),(SETROW,0),;
                    (SETCOL,1),SCAN
         IF       (COL,EQ,1),(WRITE,LOWRIGHTCORN),(SETROW,0),;
                    (SETCOL,0),SCAN
         B        ERROR             ERROR IF COL>1 .
*
BCCFLL   EQU      %                 FULL-CHARACTER HORIZ LINE (LEFT END)
         MTW,0    ROWFLG            ERROR IF
         BNEZ     ERROR             ROWFLG .NE. 0 .
         IF       (SUS1COL0),(WRITE,HORIZBAR),(SETROW,1),;
                    SCAN            SUS=1|COL=0
         IF       (COL,EQ,1),(WRITE,LEFTTEE),(SETROW,1),SCAN
         B        ERROR             ERROR IF COL>1 .
*
BCCFLR   EQU      %                 FULL-CHAR HORIZ LINE (RIGHT END)
         LW,DX2   ROWFLG
         CI,DX2   +1                ERROR IF
         BNE      ERROR             ROWFLG .NE. 1 .
         IF       (SUS1COL0),(WRITE,HORIZBAR),(SETROW,0),;
                    SCAN            SUS=1|COL=0
         IF       (COL,EQ,1),(WRITE,RIGHTTEE),(SETROW,0),SCAN
         B        ERROR             ERROR IF COL>1
*
BCCFV    EQU      %                 FULL-CHAR VERTICAL LINE (CENTERED)
         IF       (SUS,EQ,1),(WRITE,' '),SCAN
         AI,DX2   +0                IF COLFLG EQUALS ZERO
         BGZ      BCCFVCOLGT0      FALL THRUOGH .
         IF       (ROW,EQ,0),(WRITE,VERTBAR),(SETCOL,1),SCAN
         IF       (ROW,EQ,1),(WRITE,UPTEE),(SETCOL,1),SCAN
         B        ERROR             ERROR IF ROW>1|ROW<0
*
BCCFVCOLGT0  EQU %
         CI,DX2   +1                IF COLFLG EQUALS ONE,
         BG       ERROR             FALL THROUGH - ELSE ERROR .
         IF       (ROW,EQ,0),(WRITE,VERTBAR),(SETCOL,0),SCAN
         IF       (ROW,EQ,1),(WRITE,LOWTEE),(SETCOL,0),SCAN
         B        ERROR             ERROR IF ROW>1|ROW<0
*
BCCOLC   EQU      %                 OVERLAPPED LEFT CORNER
         IF       (SUS,EQ,1),(WRITE),SCAN
         MTW,0    ROWFLG            ERROR IF
         BNEZ     ERROR             ROWFLG .NE. ZERO .
         IF       (COL,EQ,0),(OSTRIKE,UNDLINE),(SETROW,2),;
                    (SETCOL,2),SCAN
         IF       (COL,EQ,2),(OSTRIKE,BIGLEFTCORNR),(SETROW,2),;
                    (SETCOL,0),SCAN
         B        ERROR             ERROR IF COL=1|COL>2
*
BCCORC   EQU      %                 OVERLAPPED RIGHT CORNER
         IF       (SUS,EQ,1),(WRITE),SCAN
         LW,DX2   ROWFLG
         CI,DX2   +2                ERROR IF
         BNE      ERROR             ROWFLG .NE. 2 .
         IF       (COL,EQ,0),(OSTRIKE,UNDLINE),(SETROW,0),;
                    (SETCOL,3),SCAN
         IF       (COL,EQ,3),(OSTRIKE,BIGRIGHTCORNR),(SETROW,0),;
                    (SETCOL,0),SCAN
         B        ERROR             ERROR IF COL=1|COL=2|COL>3
*
BCCOLL   EQU      %                 OVERLAPPED HORIZ LINE (LEFT END)
         MTW,0    ROWFLG            ERROR IF
         BNEZ     ERROR             ROWFLG .NE. ZERO .
         IF       (SUS1COL0),(OSTRIKE,UNDLINE),(SETROW,2),SCAN
         IF       (COL,EQ,2),(OSTRIKE,BIGLEFTCORNR),(SETROW,2),SCAN
         B        ERROR             ERROR IF COL=1|COL>2
*
BCCOLR   EQU      %                 OVERLAPPED HORIZ LINE (RIGHT END)
         LW,DX2   ROWFLG
         CI,DX2   +2                ERROR IF
         BNE      ERROR             ROWFLG .NE. 2 .
         IF       (SUS1COL0),(OSTRIKE,UNDLINE),(SETROW,0),SCAN
         IF       (COL,EQ,3),(OSTRIKE,BIGRIGHTCORNR),(SETROW,0),SCAN
         B        ERROR             ERROR IF COL=1|COL=2|COL>3
*
BCCOVL   EQU      %                 OVERLAPPED VERTICAL LINE (LEFT)
         IF       (SUS,EQ,1),(WRITE),SCAN
         AI,DX2   +0                IF COLFLG EQUALS ZERO
         BGZ      BCCOVLCOLGT0     FALL THROUGH .
         IF       (ROW,EQ,2),(OSTRIKE,BIGLEFTCORNR),(SETCOL,2),SCAN
         IF       (ROW,EQ,0),(OSTRIKE,LEFTVERTBAR),(SETCOL,2),SCAN
         B        ERROR             ERROR IF ROW<0|ROW=1|ROW>2
*
BCCOVLCOLGT0  EQU  %
         CI,DX2   +2                IF COLFLG EQUALS 2 FALL
         BL       ERROR             THROUGH .   ERROR IF
         BG       BCCOVLCOLGT2     COLFLG .EQ. 1 .
         IF       (ROW,EQ,2),(OSTRIKE,BIGLEFTCORNR),(SETCOL,0),SCAN
         IF       (ROW,EQ,0),(OSTRIKE,LEFTVERTBAR),(SETCOL,0),SCAN
         B        ERROR             ERROR IF ROW<0|ROW=1|ROW>2
*
BCCOVLCOLGT2  EQU  %
         CI,DX2   +3                IF COLFLG EQUALS THREE
         BG       ERROR2            FALL THROUGH - ELSE ERROR .
BCCOVRCOLEQ3  EQU  %
         IF       (ROW,EQ,2),(OSTRIKE,BIGRIGHTCORNR),(SETCOL,0),SCAN
         IF       (ROW,EQ,0),(OSTRIKE,RIGHTVERTBAR),(SETCOL,0),SCAN
         B        ERROR             ERROR IF ROW<0|ROW=1|ROW>2
*
BCCOVR   EQU      %                 OVERLAPPED VERTICAL LINE (RIGHT)
         IF       (SUS,EQ,1),(WRITE),(SCAN)
         AI,DX2   +0                IF COLFLG EQUALS ZERO
         BGZ      BCCOVRCOLGT0     FALL THROUGH .
         IF       (ROW,EQ,2),(OSTRIKE,BIGRIGHTCORNR),(SETCOL,3),SCAN
         IF       (ROW,EQ,0),(OSTRIKE,RIGHTVERTBAR),(SETCOL,3),SCAN
         B        ERROR             ERROR IF ROW<0|ROW=1|ROW>2
*
BCCOVRCOLGT0  EQU  %
         CI,DX2   +3                IF COLFGL EQUALS THREE
         BL       ERROR             BRANCH - ELSE ERROR .
         BE       BCCOVRCOLEQ3
*
*
ERROR2   EQU      %                 A FLAG VALUE IS OUTSIDE LEGAL RANGE .
         LI,DX2   '*'               GET ERROR MARKER CHARACTER .
         AI,BUF2  +3                POINT TO THIRD CHAR IN O'STRIKE BUFFER
         STB,DX2  0,BUF2            AND PUT MARKER THERE .
         AI,BUF2  +1                PUT THE MARKER IN
         STB,DX2  0,BUF2            THE FOURTH COLUMN TOO .
         AI,BUF2  -4                RESTORE ORIGINAL POINTER VALUE .
*
ERROR    EQU      %                 OUTSIDE RANGE FOR CERTAIN CONDITION .
         LI,DX2   '*'               GET ERROR MARKER CHARACTER .
         AI,BUF2  +1                POINT TO FIRST CHAR IN O'STRIKE BUFFER
         STB,DX2  0,BUF2            AND PUT THE MARKER THERE .
         AI,BUF2  +1                PUT THE MARKER IN
         STB,DX2  0,BUF2            THE SECOND COLUMN TOO .
         AI,BUF2  -2                RESTORE ORIGINAL POINTER VALUE .
         B        SCANNEXT          GO CHECK NEXT COLUMN .
         PAGE
*  ROUTINE TO CLEAR FLAGS USED BY BOXDRAW.  MAY BE USED TO
*  STOP OR INITIALIZE DRAWING PROCESS.
*
S41STOP  EQU      %
         SAVRTN
S41STOP2 LI,AC1   +0
         STW,AC1  SUSFLG            CLEAR SUSPEND,
         STW,AC1  ROWFLG            ROW CONTROL AND
         STW,AC1  COLFLG            FIRST FOUR COLUMN CONTROL FLAGS .
         STW,AC1  RIGHTEDGE         CLEAR POINTER TO RIGHT EDGE OF BOX .
         LW,AC2   L(BA(COLFLG+1)+252**24)  SAY THERE ARE 252 MORE COLUMN
         MBS,AC2  -4                FLAGS AND CLEAR THEM TOO .
         RETURN
         PAGE
S41PUTBUF         EQU               %
         LI,D1    COMP2MASK         GET SECOND
         AND,D1   DX1               OPERAND OF
         SLS,D1   -COMP2SHFT        COMPARISON OPERATION .
         LI,X2    COMPOPMASK        GET CODE FOR OPERATION
         AND,X2   DX1               TYPE .  (0 FOR EQ, 1 FOR NE)
         LI,X4    COMP1MASK         GET CODE FOR FIRST OPERAND .
         AND,X4   DX1               0 = SUSFLG, 1 = ROWFLG, 2 =
         BEZ      PBSUS             COLFLG, 3 = (SUS=1 OR COL=0)
         CI,X4    3**COMP1SHFT
         BE       PBSUS1COL0        GO IF SUS1COL0
         CI,X4    2**COMP1SHFT
         BE       PBCOL             GO IF COL
         CW,D1    ROWFLG            COMPARE CONSTANT TO ROWFLG .
         B        PBCC              GO SEE IF VALUES MATCH .
PBSUS    CW,D1    SUSFLG            COMPARE TO SUSFLG
         B        PBCC              GO CHECK MATCH
PBSUS1COL0  MTW,0 SUSFLG            CHECK SUSFLG AGAINST 0
         BNEZ     PBACT             GO IF NON-ZERO
*  NOTE: FOLLOWING CODE WILL WORK ONLY IF SUS1COL0 OPTION
*    PUTS ZEROES IN COMP2 AND COMPOP FIELDS .
PBCOL    CB,D1    COLFLG,X1         CHECK CONSTANT AGAINST COLFLG(CURRENT COLUMN
*
PBCC     SLS,X2   32-COMPOPSHFT     SET CC1 TO COMPOP .
         BCR,8+3  PBACT             GO IF EQ OP AND = COMPARISON .
         BCR,8    *SRTN             FALL THROUGH IF
         BCR,3    *SRTN             NE OP AND UNEQUAL COMPARE .
*
PBACT    CI,DX1   SETCOLMASK        IF CALL
         BAZ      PBSET2            SPECIFIES NEW
         LI,D1    COLVALMASK        VALUE FOR COLFLG,
         AND,D1   DX1               EXTRACT VALUE
         SLS,D1   -COLVALSHFT       AND PUT IT
         STB,D1   COLFLG,X1         INTO COLFLG TABLE .
PBSET2   CI,DX1   SETROWMASK        IF CALL
         BAZ      PBCHAR            SPECIFIES NEW
         LI,D1    ROWVALMASK        VALUE FOR ROWFLG,
         AND,D1   DX1               EXTRACT VALUE
         SLS,D1   -ROWVALSHFT       AND PUT IT
         STW,D1   ROWFLG            INTO ROWFLG .
PBCHAR   CI,DX1   ARGMASK           IS THERE A CHAR TO PRINT?
         BAZ      PBEXIT            BRANCH NO .
         CI,DX1   WRITESTRIKEMASK   FIND OUT WHETHER IT
         BANZ     %+6               GOES IN MAIN OR OVERSTRIKE
         STB,AC3  0,BUF3            BUFFER .  PUT IT THERE (MAIN) .
         CW,AC1   BUF3              SEE IF THIS CHAR EXTENDS LINE.
         BGE      PBEXIT            IF IT DOES,
         LW,AC1   BUF3              GET NEW VALUE FOR LAST CHAR POINTER .
         B        PBEXIT
         STB,AC3  0,X3              PUT IT OTHER PLACE (O'STRIKE) .
         CW,AC2   X3                SEE IF THIS CHAR EXTENDS LINE (
         BGE      PBEXIT            O'STRIKE BUFF) .  IF IT DOES
         LW,AC2   X3                GET NEW VALUE FOR LAST CHAR POINTER .
*
PBEXIT   CI,DX1   SCANMASK          SEE IF WE SHOULD SCAN TO NEXT CHAR
         BANZ     SCANNEXT          YES - GO CHECK NEXT .
         B        *SRTN             NO - DO MORE IN CURRENT COLUMN .
*
*
S41WINDUP  EQU    %
         LI,X2    +255
         MTB,0    COLFLG,X2         FIND RIGHTMOST COLUMN WHERE
         BNEZ     %+2               VERTICAL LINE IS
         BDR,X2   %-2               NOW BEING DRAWN.
         STW,X2   RIGHTEDGE         SAVE NUMBER OF THAT COLUMN .
         SW,AC2   BUF2              CONVERT AC1 & AC2 FROM ADDR OF LAST
         SW,AC1   BUF1              CHAR TO NO. OF CHARS IN BUFFER .
         BNEZ     %+4               IF THERE ARE NO CHARACTERS IN THE
         AI,AC2   +0                MAIN BUFFER BUT BOXDRAW HAS PUT
         BEZ      %+2               SOME IN THE OVERSTRIKE BUFFER,
         AI,AC1   +1                PRETEND WE HAVE ONE IN MAIN SINCE
*                 ROUTINE THAT SQUEEZES BLANKS FROM OUTPUT LINES
*                 DOESN'T WORK IF IT SEES OVERSTRIKES BUT NO
*                 ORIGINALS.  THE FAKE CHAR WILL BE A BLANK.
         RETURN
*
*
         BOUND    8
BOXSUSRESLIMS  DATA  X'10',X'14'
LOSUSRES  EQU     X'10'
BCCLIMS  DATA     X'10',X'1A'
LOBCC    EQU      X'10'
*
BCCGO    EQU      %-LOBCC
         B        BCCFLC
         B        BCCFRC
         B        BCCFLL
         B        BCCFLR
         B        BCCFV
         B        BCCOLC
         B        BCCORC
         B        BCCOLL
         B        BCCOLR
         B        BCCOVL
         B        BCCOVR
         PAGE
*
* LOCAL VARIABLES
*
41D      CSECT    0                 START OF LOCALS
SUSFLG   DATA     0
ROWFLG   DATA     0
COLFLG   DO1      256/16
         DATA,16  0
RIGHTEDGE         DATA              0
*
         USECT    #PLOC
         END
