Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-05 - decus/20-0141/daplat.for
There are 2 other files named daplat.for in the archive. Click here to see a list.
      SUBROUTINE DAPLAT( IPLOT,MAXWID,MAXHIH,LETTER,KONECT,
     1    XPOINT,YPOINT,MINSUB,MAXSUB, XLEFT,YLOWER,XRIGHT,
     2    YUPPER, IGRID, IEDGE,MARGIN,MSHWID,MSHHIH,LTROFF,
     3    LINOFF,LINPRT, IDISK,IRESET,LTRERR,LINERR)
C     RENBR(/POINT, CURVE AND PIN MAP PLOTTER FOR PRINTER)
C
C     DONALD BARTH, HARVARD BUSINESS SCHOOL
C
C     ROUTINE  TO  CONSTRUCT  A  PLOT  OF   USER   SELECTED
C     PROPORTIONS AND WHICH CAN CONTAIN ONE OR MORE CURVES,
C     EACH CURVE BEING REPRESENTED BY  ITS  OWN  ALPHABETIC
C     LETTER.    POINTS   ON  A  CURVE  CAN  OPTIONALLY  BE
C     CONNECTED EITHER BY ASTERISKS OR BY  SOME  ALPHABETIC
C     LETTER  WHICH  NEED  NOT  BE THE SAME AS THAT USED TO
C     REPRESENT THE  POINTS THEMSELVES.  IF PLOTTING POINTS
C     NOT CONNECTED BY LINES, A PIN MAP CAN BE SIMULATED BY
C     USING THE  CLOSEST  EMPTY  LOCATION  IF THE  LOCATION
C     REPRESENTING THE POINT IS ALREADY USED.  THE PLOT CAN
C     BE RULED  WITH GRID LINES EVERY 10  CHARACTERS ACROSS
C     ITS WIDTH AND EVERY 5 LINES ACROSS ITS HEIGHT.  THESE
C     GRID DIVISION  WIDTHS AND HEIGHTS  ARE ALSO UNDER THE
C     USER'S CONTROL.   NUMBERS PRINTED ALONGSIDE  THE PLOT
C     ARE REPRESENTED  WITH 5 SIGNIFICANT  DIGITS, BUT WITH
C     SUPPRESSION  OF RIGHTHAND  ZEROES TO THE RIGHT OF THE
C     DECIMAL POINT.   IF THE  NUMBER CANNOT  BE PRINTED IN
C     FLOATING POINT FORM,  THEN THE  NUMBER IS REPRESENTED
C     IN SCIENTIFIC NOTATION INSTEAD.
C
C     IF TWO OR MORE DIFFERENT ALPHABETIC  LETTERS  ARE  TO
C     APPEAR  IN  THE SAME LOCATION IN THE PRINTED PLOT, AN
C     AMPERSAND  WILL  APPEAR  INSTEAD.   HOWEVER,  IF  THE
C     POINTS  AND THE  LINES  OPTIONALLY  CONNECTING  THESE
C     POINTS ARE TO APPEAR AS DIFFERENT LETTERS, THEN THESE
C     LETTERS, WHERE USED FOR PREVIOUS CURVES OR WHERE USED
C     ELSEWHERE ON  THE CURRENT CURVE,  ARE  NOT CHANGED TO
C     AMPERSANDS BY COINCIDENCE WITH THE PRESENT CURVE.
C
C     THIS ROUTINE  CALLS THE WINDOWING  ROUTINE PLTCUT AND
C     THE GENERALIZED FLOATING POINT OUTPUT ROUTINE DARITE.
C
C     THE FOLLOWING INPUT  ARGUMENTS ARE  USED BY EACH CALL
C     TO DAPLAT WHETHER OR NOT A PLOT IS GENERATED
C
C     IPLOT  = -1, ADD THE POINTS AND/OR LINES  REPRESENTED
C              BY  THE COORDINATES IN THE XPOINT AND YPOINT
C              ARRAYS TO THE PLOT STORAGE, THEN  RETURN  TO
C              THE  CALLING  PROGRAM WITHOUT GENERATING THE
C              PLOT.   ADDITIONAL  DAPLAT  CALLS  WILL   BE
C              EXECUTED BEFORE THE PLOT IS TO BE PRINTED.
C            = 0, ADD THE POINTS AND/OR LINES IN THE XPOINT
C              AND  YPOINT ARRAYS TO THE PLOT STORAGE, THEN
C              GENERATE  THE  PLOT  AND  CLEAR   THE   PLOT
C              STORAGE.   ADDITIONAL  CALLS  TO  DAPLAT, IF
C              ANY, WILL STORE UPON A BLANK PLOT SURFACE.
C            = 1, ADD THE POINTS AND/OR LINES IN THE XPOINT
C              AND  YPOINT ARRAYS TO THE PLOT STORAGE, THEN
C              GENERATE THE PLOT BUT DO NOT CLEAR THE  PLOT
C              STORAGE.   THE CURRENTLY STORED PLOT WILL BE
C              ADDED TO BY ADDITIONAL CALLS TO DAPLAT.
C     MAXWID = WIDTH OF THE PLOT STATED AS  THE  NUMBER  OF
C              COLUMNS OF  CHARACTERS FORMING  THE PLOTTING
C              AREA UPON WHICH DATA CAN BE PLOTTED.  MAXWID
C              IS NORMALLY  1 PLUS  A MULTIPLE  OF  MSHWID.
C              MAXIMUM RECOMMENDED  VALUE OF MAXWID IS 101.
C              NOTE THAT THE PLOT HAS AN ADDITIONAL  MARGIN
C              OF 12  CHARACTERS ALONG  THE  LEFT  SIDE  IN
C              WHICH SCALE NUMBERS  ARE  PRINTED.  AN ADDI-
C              TIONAL 4 CHARACTERS  CAN APPEAR TO THE RIGHT
C              OF THE PLOT IN THE LOWER-RIGHT SCALE NUMBER.
C              THE LARGEST ACCEPTED VALUE OF MAXWID IS 131,
C              WHICH CAN LEAD TO LOWER SCALE 147 CHARACTERS
C              WIDE WHICH  IS TOO LARGE  TO OUTPUT ON  MOST
C              LINE-PRINTERS.  IF THE  VALUE OF IGRID TURNS
C              OFF BOTH  LEFT SCALE NUMBERS AND LOWER SCALE
C              NUMBERS,  THEN ONLY 1  CHARACTER  (EITHER AN
C              ASTERISK OR A SPACE) WILL APPEAR TO THE LEFT
C              OF THE  PLOT SO MAXIMUM  WIDTH  OF A PRINTED
C              WOULD THEN BE MERELY 1 PLUS MAXWID.
C            = 0, USE THE LAST NONZERO VALUE SPECIFIED  FOR
C              MAXWID AS  THE WIDTH OF THE PLOT, OR USE THE
C              VALUE 101  IF A NONZERO  VALUE OF MAXWID HAS
C              NOT BEEN SPECIFIED.
C     MAXHIH = HEIGHT OF THE PLOT STATED AS THE  NUMBER  OF
C              LINES FORMING  THE PLOTTING AREA  UPON WHICH
C              DATA CAN BE PLOTTED.   NORMALLY MAXHIH WOULD
C              BE 1 PLUS  A MULTIPLE  OF MSHHIH.   THE PLOT
C              HAS AN  ADDITIONAL  LOWER MARGIN  OF 2 LINES
C              (OR 3  LINES  IF THE  SCALE  NUMBERS  ARE IN
C              SCIENTIFIC  NOTATION).
C            = 0, USE THE LAST NONZERO VALUE SPECIFIED  FOR
C              MAXHIH AS THE HEIGHT OF THE PLOT, OR USE THE
C              VALUE 51  IF A NONZERO  VALUE OF  MAXHIH HAS
C              NOT BEEN SPECIFIED.
C     LETTER = 0, PLOT THE POINTS HAVING COORDINATES IN THE
C              XPOINT AND YPOINT ARRAYS WITH ASTERISKS.  IF
C              ONE (OR MORE)  OF THESE POINTS  IS TO APPEAR
C              AT THE  SAME  LOCATION  ON THE PLOT  AS SOME
C              OTHER  POINT OR  PORTION OF A  LINE SEGMENT,
C              THE OTHER POINT OR PORTION OF A LINE SEGMENT
C              IS SHOWN INSTEAD OF THE CURRENT POINT.
C            = 1 THRU 26, IDENTIFIES ALPHABETIC LETTER USED
C              TO PLOT THE POINTS HAVING COORDINATES IN THE
C              XPOINT AND YPOINT  ARRAYS.   LETTER  IS  THE
C              SERIAL NUMBER OF THE LETTER IN THE ALPHABET.
C              LETTER=3 WOULD CAUSE THE PLOTTED  POINTS  TO
C              BE REPRESENTED WITH C'S.
C            = 27, PLOT  THE POINTS  HAVING  COORDINATES IN
C              THE XPOINT AND YPOINT ARRAYS WITH ASTERISKS.
C              IF  ONE  (OR  MORE)  OF  THESE  POINTS IS TO
C              APPEAR AT THE SAME  LOCATION ON THE PLOT  AS
C              SOME  OTHER  POINT  OR  PORTION  OF  A  LINE
C              SEGMENT,  THEN THE ASTERISK  APPEARS INSTEAD
C              OF  THE  OTHER  POINT  OR PORTION  OF A LINE
C              SEGMENT.
C     KONECT = .LT.-1,  SIMULATE  PIN  MAP.   STORE  POINTS
C              HAVING  COORDINATES  IN  XPOINT  AND  YPOINT
C              ARRAYS FOR PLOTTING (EITHER BY CURRENT  CALL
C              TO  DAPLAT  IF  IPLOT.GE.0  OR BY SUBSEQUENT
C              CALL TO DAPLAT IF IPLOT.NE.0).  IF LETTER IS
C              GREATER   THAN   ZERO,   AND   IF   LOCATION
C              REPRESENTING POINT ALREADY CONTAINS PRINTING
C              CHARACTER  OTHER  THAN NONDOMINANT ASTERISK,
C              THEN SEARCH FOR CLOSEST  LOCATION  WHICH  IS
C              EMPTY    OR   WHICH   CONTAINS   NONDOMINANT
C              ASTERISK.  IF LETTER IS  ZERO  AND  LOCATION
C              REPRESENTING POINT ALREADY CONTAINS PRINTING
C              CHARACTER, THEN SEARCH FOR CLOSEST  LOCATION
C              WHICH  CONTAINS  SPACE.   IF,  AFTER  HAVING
C              SEARCHED NUMBER OF CONCENTRIC BOXES EQUAL TO
C              ABSOLUTE   VALUE  OF  KONECT,  NO  AVAILABLE
C              LOCATION HAS YET BEEN  FOUND,  THEN  ABANDON
C              ATTEMPT.    NOTE   THAT  IF  SEVERAL  POINTS
C              COINCIDE, IT IS MUCH MORE EFFICIENT TO  HAVE
C              THEM ADJACENT IN XPOINT AND YPOINT ARRAYS IF
C              PIN  MAP  OPTION  IS  USED.   FOLLOWING  ARE
C              EXAMPLES OF SIZES OF PIN GROUPS POSSIBLE FOR
C              VARIOUS VALUES OF KONECT.
C
C               KONECT=-2  KONECT=-3  KONECT=-4  KONECT=-5
C
C                                                555555555
C                                      4444444   544444445
C                            33333     4333334   543333345
C                  222       32223     4322234   543222345
C                  212       32123     4321234   543212345
C                  222       32223     4322234   543222345
C                            33333     4333334   543333345
C                                      4444444   544444445
C                                                555555555
C
C            = -1,  STORE  POINTS  HAVING  COORDINATES   IN
C              XPOINT   AND   YPOINT  ARRAYS  FOR  PLOTTING
C              (EITHER  BY  CURRENT  CALL  TO   DAPLAT   IF
C              IPLOT.GE.0  OR  BY SUBSEQUENT CALL TO DAPLAT
C              IF IPLOT.NE.0).  IF LETTER  IS IN   RANGE  1
C              THROUGH   26,   AND   IF  THERE  ALREADY  IS
C              CHARACTER OTHER THAN SPACE  OR  ASTERISK  AT
C              LOCATION   REPRESENTING  POINT,  THEN  PLACE
C              AMPERSAND AT LOCATION INSTEAD.
C            = 0, STORE POINTS HAVING COORDINATES IN XPOINT
C              AND  YPOINT ARRAYS FOR PLOTTING, AND CONNECT
C              THESE WITH  LINES  FORMED  FROM  NONDOMINANT
C              ASTERISKS.   IF SOME OTHER CHARACTER ALREADY
C              IS IN PLOT, OR IS LATER  ADDED  TO  PLOT  AT
C              LOCATIONS   ALONG   LINE,  THEN  THIS  OTHER
C              CHARACTER IS SEEN INSTEAD OF ASTERISK.
C            = 1 THRU 26, CONNECT POINTS WITH LINES  FORMED
C              OF ALPHABETIC LETTER WHICH HAS KONECT AS ITS
C              SERIAL NUMBER IN ALPHABET.
C            = 27, SAME AS KONECT=0, EXCEPT THAT  ASTERISKS
C              ARE  DOMINANT OVER ALL OTHER CHARACTERS.  IF
C              SOME OTHER CHARACTER ALREADY IS IN PLOT,  OR
C              IS  LATER  ADDED  TO PLOT AT LOCATIONS ALONG
C              LINE, THEN IT IS ASTERISK WHICH IS SEEN.
C     XPOINT = THE ARRAY OF X (HORIZONTAL)  COORDINATES  OF
C              THE DATA POINTS TO BE PLOTTED.
C     YPOINT = THE ARRAY OF Y (VERTICAL) COORDINATES OF THE
C              DATA POINTS TO BE PLOTTED.
C     MINSUB = THE SUBSCRIPT IN XPOINT AND YPOINT ARRAYS OF
C              THE  COORDINATES  OF  THE  FIRST POINT TO BE
C              PLOTTED
C     MAXSUB = THE SUBSCRIPT IN XPOINT AND YPOINT ARRAYS OF
C              THE  COORDINATES  OF  THE  FINAL POINT TO BE
C              PLOTTED
C     XLEFT  = THE HORIZONTAL DATA COORDINATE TO BE  PLACED
C              AT  THE  LEFT  EDGE  OF  THE PLOT.  ONLY THE
C              PORTION  OF  THE  CURVE  INSIDE  THE  WINDOW
C              DEFINED  BY XLEFT, YLOWER, XRIGHT AND YUPPER
C              WILL BE  SHOWN  IN  THE  PLOT.   IF  A  LINE
C              SEGMENT  CROSSES  THE WINDOW, THE PORTION OF
C              THE LINE SEGMENT WHICH IS OUTSIDE THE WINDOW
C              WILL   NOT   BE   REPRESENTED.    THE   DATA
C              COORDINATES CAN EITHER INCREASE OR  DECREASE
C              FROM  LEFT  TO  RIGHT OR FROM BOTTOM TO TOP.
C              IF MULTIPLE CURVES ARE BEING SUPERIMPOSED ON
C              A  SINGLE PLOT, THE CURVES NEED NOT ALL HAVE
C              THE SAME DATA  COORDINATE  LIMITS,  HOWEVER,
C              THE  SCALE  NUMBERS  ON THE PLOT ITSELF WILL
C              CORRESPOND TO THE DATA COORDINATE LIMITS  OF
C              THE FINAL CURVE.
C     YLOWER = THE VERTICAL DATA COORDINATE TO BE PLACED AT
C              THE LOWER EDGE OF THE PLOT
C     XRIGHT = THE HORIZONTAL DATA COORDINATE TO BE  PLACED
C              AT THE RIGHT EDGE OF THE PLOT
C     YUPPER = THE VERTICAL DATA COORDINATE TO BE PLACED AT
C              THE UPPER EDGE OF THE PLOT
C
C     THE FOLLOWING ARGUMENTS ARE  IGNORED UNLESS A PLOT IS
C     GENERATED BY THE CURRENT CALL TO DAPLAT
C
C     IGRID  = 0, IF THE PLOT IS GENERATED,  THE PLOT  WILL
C              SHOW  AN  INTERNAL GRID.  THIS INTERNAL GRID
C              WILL  BE  RULED  VERTICALLY   EVERY   MSHWID
C              CHARACTERS  ACROSS THE WIDTH OF THE PLOT AND
C              WILL  BE  RULED  HORIZONTALLY  EVERY  MSHHIH
C              LINES ACROSS THE HEIGHT OF THE PLOT.
C            = 1, IF THE PLOT IS GENERATED,  THE PLOT  WILL
C              SHOW  THE  INTERSECTIONS  OF THE LINES OF AN
C              INTERNAL GRID, BUT WILL NOT SHOW GRID  LINES
C              THEMSELVES.   THE  INTERNAL  GRID  WOULD, IF
C              SHOWN,  HAVE  VERTICAL  LINES  EVERY  MSHWID
C              CHARACTERS  ACROSS THE WIDTH OF THE PLOT AND
C              HORIZONTAL LINES EVERY MSHHIH  LINES  ACROSS
C              THE HEIGHT OF THE PLOT.
C            = 2, IF THE PLOT  IS GENERATED,  THE PLOT WILL
C              NOT   SHOW   AN   INTERNAL  GRID.   HOWEVER,
C              REGARDLESS OF  THE  VALUE  OF  IGRID,  SCALE
C              NUMBERS  WILL BE PRINTED ALONG THE SCALES AT
C              THE  INTERVALS  INDICATED  BY   MSHWID   AND
C              MSHHIH.
C     IEDGE  = PLACE NUMBERS BOTH TO LEFT OF AND BELOW PLOT
C              TO IDENTIFY COORDINATE RANGES.
C            = 1, PLACE NUMBERS TO LEFT OF PLOT, BUT DO NOT
C              PLACE NUMBERS BELOW PLOT.
C            = 2, PLACE NUMBERS BELOW PLOT, BUT NOT TO LEFT
C              OF  PLOT.   UNLESS  PREVENTED  BY  VALUE  OF
C              MARGIN,  THE   DISTANCE   BETWEEN   CARRIAGE
C              CONTROL  CHARACTER IN COLUMN 1 AND LEFT EDGE
C              OF PLOT WILL BE JUST LARGE ENOUGH  TO  ALLOW
C              SCALE  NUMBER IMMEDIATELY BELOW LEFT EDGE OF
C              PLOT.
C            = 3, DO NOT PLACE NUMBERS EITHER TO LEFT OF OR
C              BELOW  PLOT.   UNLESS  PREVENTED BY VALUE OF
C              MARGIN, NO CHARACTERS  WILL  APPEAR  BETWEEN
C              CARRIAGE  CONTROL  CHARACTER IN COLUMN 1 AND
C              LEFT EDGE OF PLOT.
C     MARGIN = MINIMUM   NUMBER   OF   CHARACTERS   BETWEEN
C              CARRIAGE  CONTROL  CHARACTER  IN COLUMN 1 OF
C              OUTPUT AND LEFT EDGE OF PLOT.   THIS  MARGIN
C              INCLUDES  LEFT  SCALE  NUMBERS AND SPACES TO
C              THEIR LEFT.
C     MSHWID = WIDTH OF  THE GRID  DIVISIONS  STATED AS THE
C              NUMBER OF COLUMNS OF CHARACTERS.   MSHWID=10
C              WOULD GIVE THE  VERTICAL GRID LINES EVERY 10
C              CHARACTERS  ACROSS  THE  WIDTH  OF THE  PLOT
C              AREA.
C            = 0, USE THE LAST NONZERO  VALUE SPECIFIED FOR
C              MSHWID AS  THE GRID  DIVISION  WIDTH, OR USE
C              THE VALUE  10 IF A  NONZERO VALUE  OF MSHWID
C              HAS NOT BEEN SPECIFIED BY A PREVIOUS CALL TO
C              THIS ROUTINE.
C     MSHHIH = HEIGHT OF  THE GRID DIVISIONS  STATED AS THE
C              NUMBER OF  LINES.   MSHHIH=5 WOULD  GIVE THE
C              HORIZONTAL GRID  LINES EVERY 5  LINES ACROSS
C              THE HEIGHT OF THE PLOT AREA.
C            = 0, USE THE LAST  NONZERO VALUE SPECIFIED FOR
C              MSHHIH AS  THE GRID DIVISION  HEIGHT, OR USE
C              THE VALUE  5 IF A  NONZERO VALUE  OF  MSHHIH
C              HAS NOT BEEN SPECIFIED BY A PREVIOUS CALL TO
C              THIS ROUTINE.
C     LTROFF = DISTANCE  STATED  AS  NUMBER  OF  CHARACTERS
C              BETWEEN  LEFT  EDGE  OF  PLOT AND LEFT SCALE
C              LINE.  IF LTROFF=0,  THEN  LEFT  SCALE  LINE
C              WILL BE AT LEFT EDGE OF PLOT.
C     LINOFF = DISTANCE STATED AS NUMBER OF  LINES  BETWEEN
C              LOWER  EDGE  OF THE PLOT AND THE LOWER SCALE
C              LINE.  IF LINOFF=0, THEN  LOWER  SCALE  LINE
C              WILL BE AT LOWER EDGE OF PLOT.
C     LINPRT = -1, THE PLOT IS NOT  TO INCLUDE ANY CARRIAGE
C              CONTROL CHARACTER AT LEFT END OF EACH LINE.
C            = 0, THE PLOT WILL BE VIEWED  BY THE USER ON A
C              TERMINAL,  EITHER TYPED DIRECTLY  WITH IDISK
C              BEING  GIVEN THE  TERMINAL  UNIT  NUMBER, OR
C              TYPED  BY THE  USER AFTER  THIS ROUTINE  HAS
C              WRITTEN  THE PLOT  INTO A  FILE ON  THE UNIT
C              THE NUMBER OF  WHICH IS CONTAINED  IN IDISK.
C              A BLANK  OR SPACE  WILL BE USED  AS CARRIAGE
C              CONTROL  CHARACTER  TO GIVE  SINGLE SPACING.
C            = 1,  THE PLOT  WILL BE  PRINTED  ON THE  LINE
C              PRINTER  BY THE USER  AFTER THE  PROGRAM HAS
C              WRITTEN THE  PLOT INTO A FILE.   AN ASTERISK
C              WILL BE USED  AS CARRIAGE  CONTROL CHARACTER
C              TO GIVE SINGLE  SPACING WITH  SUPPRESSION OF
C              SKIPPING EXTRA LINES AT THE PAGE BOUNDARIES.
C              ON THE PDP-10,  AN ASTERISK AS  THE CARRIAGE
C              CONTROL CHARACTER GIVES  OVERPRINTING ON THE
C              TERMINAL AS OPPOSED TO SINGLE SPACING.
C     IDISK  = THE UNIT NUMBER OF THE DEVICE ONTO WHICH THE
C              PLOTS  ARE TO BE WRITTEN.  THIS ROUTINE WILL
C              ONLY  GENERATE  THE   PLOT.    IT   IS   THE
C              RESPONSIBLITY OF THE CALLING PROGRAM TO OPEN
C              THE OUTPUT FILE AND TO WRITE  THE  CAPTIONS,
C              THE FORM FEEDS AND/OR  THE SEPARATING LINES.
C              IDISK SHOULD  ALWAYS BE  GIVEN  A LEGAL UNIT
C              NUMBER SINCE DAPLAT WILL GENERATE THE STORED
C              PLOT, IF ANY,  USING THE NEW  VALUE OF IDISK
C              BEFORE STORING THE NEW CURVE IF THE NEW PLOT
C              SIZE  DIFFERS  FROM THAT  USED TO  STORE THE
C              PREVIOUS CURVES EVEN IF IPLOT=-1.
C
C     FOLLOWING ARGUMENT IS USED BOTH FOR INPUT AND OUTPUT.
C
C     IRESET = SHOULD BE INPUT GREATER  THAN ZERO THE FIRST
C              TIME THIS ROUTINE IS CALLED.  IRESET IS THEN
C              RETURNED SET TO ZERO  AND SHOULD RETAIN THIS
C              VALUE  FOR  ALL  SUBSEQUENT  CALLS  TO  THIS
C              ROUTINE.
C            = 0, CHARACTER TEMPLATE AND PLOT STORAGE  HAVE
C              ALREADY BEEN INITIALIZED.
C            = 1, INITIALIZE CHARACTER TEMPLATE AND ALL  OF
C              PLOT STORAGE.
C            = 2, INITIALIZE  CHARACTER  TEMPLATE  AND  ALL
C              EXCEPT FIRST 3 LOCATIONS IN PLOT STORAGE.
C            = 3, INITIALIZE CHARACTER TEMPLATE.
C            = 4, INITIALIZE ALL OF PLOT STORAGE.
C            = 5, INITIALIZE ALL  OF  PLOT  STORAGE  EXCEPT
C              FIRST 3 LOCATIONS.
C
C     THE FOLLOWING ARGUMENTS ARE RETURNED AS OUTPUT
C
C     LTRERR = RETURNED  CONTAINING NUMBER  OF POINTS WHICH
C              WERE OUTSIDE THE CURRENT PLOT.
C     LINERR = RETURNED CONTAINING  NUMBER OF LINE SEGMENTS
C              WHICH WERE  COMPLETELY  OUTSIDE  THE CURRENT
C              PLOT.   ALSO CONTAINS  NUMBER OF POINTS IN A
C              PIN MAP  WHICH WERE  NOT SHOWN  DUE TO THERE
C              BEING NO EMPTY  LOCATION WITHIN  THE ALLOWED
C              DISTANCE.
C
C
C     AS AN  EXAMPLE  OF THE  USAGE  OF THIS  ROUTINE,  THE
C     FOLLOWING PROGRAM WAS USED TO GENERATE THE PLOT SHOWN
C     BELOW THE PROGRAM (ALONG WITH 2 NOT SHOWN).
C
C      DIMENSION XPOINT(10),YPOINT(10)
C      DATA XPOINT/0. ,1. ,2. ,3. ,4. ,0. ,1. ,2. ,3. ,4. /
C      DATA YPOINT/1. ,1.5,2.5,2.5,1.5,2. ,2.3,3. ,2.5,2. /
C      DATA IRESET,IDISK/1,1/
C      DO 2 JGRID=1,3
C      IGRID=JGRID-1
C      WRITE(IDISK,1)IGRID
C    1 FORMAT(7H IGRID=,I2)
CC
CC  IPLOT=-1 MAXWID=41 MAXHIH=16 LETTER=1  KONECT=2
CC MINSUB=1  MAXSUB=5   XLEFT=0  YLOWER=.5 XRIGHT=4
CC YUPPER=3.5 IEDGE=0  MARGIN=0  MSHWID=0  MSHHIH=0LTROFF=0
CC LINOFF=0  LINPRT=1
C      CALL DAPLAT(-1,41,16,1,2,
C     1XPOINT,YPOINT,1,5,0.,.5,4.,
C     23.5,IGRID,0,0,0,0,0,
C     30,1,IDISK,IRESET,LTRERR,LINERR)
CCHANGING IPLOT=0, LETTER=3, KONECT=4, MINSUB=6, MAXSUB=10
C      CALL DAPLAT(0,41,16,3,4,
C     1XPOINT,YPOINT,6,10,0.,.5,4.,
C     23.5,IGRID,0,0,0,0,0,
C     30,1,IDISK,IRESET,LTRERR,LINERR)
C    2 WRITE(IDISK,3)
C    3 FORMAT(//)
C      STOP
C      END
C
C IGRID= 0
C*      3.5 -+---------+---------+---------+---------+
C*           !         !         !         !         !
C*           !         !         !         !         !
C*           !         !        DCDD       !         !
C*           !         !     DDD !  DDDDD  !         !
C*      2.5 -+---------+-DDDD----ABBBBBBB&&&D--------+
C*           !       DDCD      BB!         !B&DD     !
C*           !  DDDDD  !     BB  !         !  BBDDDD !
C*           CDD       !   BB    !         !    BB  DC
C*           !         ! BB      !         !      BB !
C*      1.5 -+--------BAB--------+---------+--------BA
C*           !     BBB !         !         !         !
C*           ! BBBB    !         !         !         !
C*           AB        !         !         !         !
C*           !         !         !         !         !
C*      0.5 -+---------+---------+---------+---------+
C*           !         !         !         !         !
C*           0         1         2         3         4
C
C     AS SUPPLIED, DAPLAT CONTAINS A  STORAGE  ARRAY  LARGE
C     ENOUGH TO HOLD 5151 CHARACTERS, THIS BEING THE NUMBER
C     OF CHARACTERS NEEDED FOR A PLOT OF THE  DEFAULT  SIZE
C     OF  51  LINES  EACH  OF  101  CHARACTERS.   THIS PLOT
C     STORAGE   IS   CONTAINED   IN   THE   LABELED   BLOCK
C     COMMON/FASPA/  WHICH  MUST CONTAIN AT LEAST  20 WORDS
C     MORE THAN THE WORDS  NEEDED  TO  STORE  MAXWID*MAXHIH
C     CHARACTERS, SIX CHARACTERS BEING HELD IN THE RIGHT 30
C     BITS  OF  EACH  WORD.    THE   20   ADDITIONAL  WORDS
C     STORE  INFORMATION  ABOUT PLOT SIZE AND SCALING.  THE
C     LABELED COMMON BLOCK CAN BE MADE LARGER THAN THE  879
C     LOCATIONS  (CALCULATED  AS 20+(((51*101)+5)/6) WORDS)
C     PROVIDED IN THIS ROUTINE IF THE LABELED COMMON  BLOCK
C     IS LOADED FIRST BY THE USER'S PROGRAM, IF THE  USER'S
C     PROGRAM  DEFINES  THE  1ST  3 LOCATIONS IN THIS ARRAY
C     BEFORE THIS ROUTINE IS FIRST CALLED,  AND  IF  IRESET
C     HAS  EITHER OF THE VALUES 2 OR 5 WHEN THIS ROUTINE IS
C     FIRST CALLED.  THE 3 LOCATIONS WHICH MUST BE  DEFINED
C     IN COMMON/FASPA/ ARE DEFINED AS FOLLOW
C     KDMNSN = 15 LESS THAN  THE  NUMBER  OF  LOCATIONS  IN
C              COMMON/FASPA/
C     LRGBYT = NUMBER   OF   DIFFERENT   CHARACTER   CODES,
C              INCLUDING  0  FOR BLANK AND 1 FOR AMPERSAND,
C              THAT MUST BE STORED  IN  EACH  BYTE  OF  THE
C              ARRAY  WHICH  IS DIMENSIONED AT KDMNSN.  THE
C              MASTER ARRAY MUST BE DIMENSIONED TO AT LEAST
C              LRGBYT-1.
C     MAXBYT = NUMBER OF BYTES WHICH CAN  BE  STORED  IN  A
C              SINGLE  COMPUTER  WORD.   (LRGBYT**MAXBYT)-1
C              MUST BE SMALL ENOUGH TO BE REPRESENTED AS  A
C              POSITIVE  NUMBER.   THE ISHIFT ARRAY MUST BE
C              DIMENSIONED TO AT LEAST MAXBYT.
C     IF A PLOT IS REQUESTED WHICH IS LARGER  THAN  CAN  BE
C     HELD IN THE LABELED  COMMON BLOCK, THEN THE EFFECTIVE
C     VALUE OF MAXHIH IS REDUCED SO THAT THE PLOT WILL FIT.
C
C     THE LABELED COMMON BLOCK COMMON/FASPA/  CONTAINS  ALL
C     THE  INFORMATION NECESSARY TO GENERATE THE PLOT, WITH
C     THE EXCEPTION OF THE ARGUMENTS LINPRT AND  IDISK  AND
C     THE  CHARACTER  LIST.   IF  A  LATER EXECUTION OF THE
C     PROGRAM IS TO ADD TO THE CURRENT PLOT,  THE  CONTENTS
C     OF  THE  LABELED  COMMON  BLOCK CAN BE WRITTEN INTO A
C     BINARY FILE, THEN BE RESTORED  WHEN  NEEDED  PROVIDED
C     THAT  DAPLAT  HAS BEEN CALLED WITH A NONZERO VALUE OF
C     IPLOT WHICH WOULD NOT CLEAR THE PLOT STORAGE.
C
C     COMMON USED TO STORE THE INTERMEDIATE PLOTS
      COMMON/FASPA/ KDMNSN,LRGBYT,MAXBYT,JRESET,KONTNT,
     1 KWIDE, KHIGH,XFIRST,YFIRST,XFINAL,YFINAL, MGRID,
     2 MEDGE, MMRGN, IWIDE, IHIGH, IOVER,   IUP,  IERR,
     3  JERR,ISTORE(859)
C
C     COMMON CONTAINING CHARACTERS CORRESPONDING TO VALUES
      COMMON/FASPB/LTRALL(35)
C
C     COMMON CONTAINING DOMINANCE RULES
      COMMON/FASPC/MASTER(29)
C
C     COMMON CONTAINING DESCRIPTION OF BYTE PACKING
      COMMON/FASPD/ISHIFT(22)
C
C     COMMON CONTAINING PRINT BUFFER FOR 1 LINE
      COMMON/FASPE/LTRBUF(146)
C
C     NONARRAY ITEMS IN COMMON/FASPB/
      EQUIVALENCE (JSPACE,LTRALL(1)),(ISTAR ,LTRALL(2)),
     1            (IVRTCL,LTRALL(3)),(IHRZNT,LTRALL(4)),
     2            (ICORNR,LTRALL(5)),(ISPACE,LTRALL(6))
C
C     ARRAYS NOT IN COMMON
      DIMENSION XPOINT(MAXSUB),YPOINT(MAXSUB),LTRBGN(35)
C
C     NUMBER OF CHARACTERS IN COMMON/FASPE/ BUFFER
      DATA MAXBFR/146/
C
C     INITIAL DEFINITION OF CHARACTERS IN COMMON/FASPB/
      DATA LTRBGN/1H ,1H*,1H!,1H-,1H+,1H ,1H&,1H*,1HA,1HB,
     1            1HC,1HD,1HE,1HF,1HG,1HH,1HI,1HJ,1HK,1HL,
     2            1HM,1HN,1HO,1HP,1HQ,1HR,1HS,1HT,1HU,1HV,
     3            1HW,1HX,1HY,1HZ,1H*/
      DATA KSPACE/1H /
C
C     ****************************************
C     *                                      *
C     *  FIND SIZE AND CHECK IF HAS CHANGED  *
C     *                                      *
C     ****************************************
C
      IF(IRESET.NE.0)GO TO 1
      IF(JRESET.EQ.999)GO TO 9
    1 IF(IRESET.NE.3)GO TO 2
      IF(JRESET.EQ.999)GO TO 5
    2 JRESET=999
      IF(IRESET.EQ.2)GO TO 3
      IF(IRESET.EQ.5)GO TO 3
C
C     INITIALIZE FIRST 3 LOCATIONS IN PLOT STORAGE
      KDMNSN=859
      LRGBYT=30
      MAXBYT=6
C
C     INITIALIZE REST OF PLOT STORAGE
    3 IWIDE=10
      IHIGH=5
      KWIDE=MAXBFR-15
      IF(KWIDE.GT.101)KWIDE=101
      KHIGH=51
      KONTNT=0
      DO 4 I=1,KDMNSN
    4 ISTORE(I)=0
      IF(IRESET.GE.4)GO TO 8
C
C     INITIALIZE CHARACTERS AND DOMINANCE RULES
    5 DO 6 I=1,35
    6 LTRALL(I)=LTRBGN(I)
      MASTER(1)=1
      MASTER(2)=-1
      DO 7 I=3,28
    7 MASTER(I)=0
      MASTER(29)=2
    8 IRESET=0
C
C     ESTABLISH THE SHIFTING ARRAY.  MUST DO EACH TIME
C     SINCE NOT HELD IN COMMON AND USER MIGHT HAVE
C     REESTABLISHED COMMON WITHOUT EVER CALLING DAPLAT.
    9 I=1
      J=1
   10 ISHIFT(I)=J
      IF(I.GE.MAXBYT)GO TO 11
      I=I+1
      J=J*LRGBYT
      GO TO 10
C
C     FIND SIZE REQUESTED FOR THIS PLOT
   11 JWIDE=KWIDE
      IF(MAXWID.GT.0)JWIDE=MAXWID
      IF(JWIDE.GT.(MAXBFR-15))JWIDE=MAXBFR-15
      JHIGH=KHIGH
      IF(MAXHIH.GT.0)JHIGH=MAXHIH
      I=(MAXBYT*KDMNSN)/JWIDE
      IF(JHIGH.GT.I)JHIGH=I
C
C     PLOT CURRENT STORAGE IF NEW SIZE REQUESTED
      IPASS=0
      IF(KONTNT.EQ.0)GO TO 12
      IF(JWIDE.NE.KWIDE)GO TO 40
      IF(JHIGH.NE.KHIGH)GO TO 40
      GO TO 13
C
C     ZERO OUT ERROR COUNTS IF PLOT IS EMPTY
   12 IERR=0
      JERR=0
C
C     GET THE VARIOUS ITEMS NEEDED TO STORE CURVE
   13 XFIRST=XLEFT
      XFINAL=XRIGHT
      YFIRST=YLOWER
      YFINAL=YUPPER
      IF(MSHWID.GT.0)IWIDE=MSHWID
      IF(MSHHIH.GT.0)IHIGH=MSHHIH
      IOVER=LTROFF
      IUP=LINOFF
      MGRID=IGRID
      MEDGE=IEDGE
      MMRGN=MARGIN
      KWIDE=JWIDE
      KHIGH=JHIGH
      WIDE=KWIDE-1
      HIGH=KHIGH-1
      LTRPNT=0
      IF(LETTER.GE.0)LTRPNT=LETTER+2
      IF(LTRPNT.GE.LRGBYT)LTRPNT=LRGBYT-1
      LTRLIN=0
      IF(LTRPNT.GT.0)LTRLIN=KONECT+2
      IF(LTRLIN.GE.LRGBYT)LTRLIN=LRGBYT-1
C
C     **********************
C     *                    *
C     *  STORE THE POINTS  *
C     *                    *
C     **********************
C
      IF(MAXSUB.LT.MINSUB)GO TO 39
      XSCALE=WIDE/(XFINAL-XFIRST)
      YSCALE=HIGH/(YFINAL-YFIRST)
      INSERT=LTRPNT
      KONTNT=1
      KRD=MINSUB
      MAXSQR=1
   14 IX=1.5+(XSCALE*(XPOINT(KRD)-XFIRST))
      IY=1.5+HIGH-(YSCALE*(YPOINT(KRD)-YFIRST))
      IF(IPASS.GT.0)GO TO 16
C
C     IF PLOT POINTS, CHECK IF POINT IS INSIDE WINDOW
      IF(IX.LE.0)GO TO 15
      IF(IX.GT.KWIDE)GO TO 15
      IF(IY.LE.0)GO TO 15
      IF(IY.GT.KHIGH)GO TO 15
      IF(KONECT.GE.-1)GO TO 29
      GO TO 22
   15 IERR=IERR+1
      GO TO 38
C
C     IF PLOT LINES, FIND PART OF LINE INSIDE WINDOW
   16 NEWX=IX
      NEWY=IY
      CALL PLTCUT(IPLCUT,IX,IY,LASTX,LASTY,1,1,KWIDE,KHIGH)
      IF(IPLCUT.NE.0)GO TO 17
      JERR=JERR+1
      GO TO 37
C
C     PROVIDE FOR INTEGER ROUNDING ALONG LINE SEGMENT
   17 IF(IY.GE.LASTY)GO TO 18
      I=IX
      IX=LASTX
      LASTX=I
      I=IY
      IY=LASTY
      LASTY=I
   18 MOVEX=IX-LASTX
      MOVEY=IY-LASTY
      LAGX=0
      LAGY=0
      IUSED=0
      IF(MOVEX.NE.0)GO TO 19
      IF(MOVEY.NE.0)GO TO 20
      MULT=0
      GO TO 29
   19 MULT=MOVEX
      IF(MULT.LT.0)MULT=-MULT
      IF(MOVEY.EQ.0)GO TO 21
      LAGX=MOVEY/2
      LAGY=MULT/2
      IF(MULT.GT.MOVEY)GO TO 21
   20 MULT=MOVEY
C
C     GET NEXT POINT ALONG THE LINE SEGMENT
   21 IF(MOVEX.LT.0)IX=LASTX-((LAGX-(IUSED*MOVEX))/MULT)
      IF(MOVEX.GT.0)IX=LASTX+((LAGX+(IUSED*MOVEX))/MULT)
      IY=LASTY+(((IUSED*MOVEY)+LAGY)/MULT)
      GO TO 29
C
C     TEST IF ALREADY WITHIN PROPER SET OF TERRACES
   22 IF(MAXSQR.GT.0)GO TO 23
      IF(KEEPX.NE.IX)GO TO 23
      IF(KEEPY.NE.IY)GO TO 23
      IF(MAXSQR.EQ.0)GO TO 28
      IX=LASTX
      IY=LASTY
      GO TO 25
C
C     PREPARE FOR TERRACE ZERO
   23 MAXSQR=KONECT
      KEEPX=IX
      KEEPY=IY
      MOVEX=0
      MOVEY=1
      MAXPIN=0
      KNTPIN=1
      IF(LETTER.NE.-1)GO TO 24
C
C     IF ERASING, MOVE DIRECTLY TO OUTER TERRACE
      MOVEY=0
      MOVEX=1
      MAXSQR=-1
      MAXPIN=-KONECT-KONECT-2
      KNTPIN=MAXPIN+1
      IX=IX+KONECT+1
      IY=IY-KONECT-1
C
C     TEST IF POINT ON TERRACE IS AVAILABLE FOR USE
   24 KNTPIN=KNTPIN-1
      IF(IX.LE.0)GO TO 25
      IF(IX.GT.KWIDE)GO TO 25
      IF(IY.LE.0)GO TO 25
      IF(IY.LE.KHIGH)GO TO 29
   25 IF(KNTPIN.GT.0)GO TO 26
C
C     TURN AT CORNER OF TERRACE
      I=MOVEX
      MOVEX=MOVEY
      MOVEY=-I
      IF(MOVEX.GT.0)GO TO 27
      KNTPIN=MAXPIN
C
C     TRAVEL ALONG SIDE OF TERRACE
   26 IX=IX+MOVEX
      IY=IY+MOVEY
      GO TO 24
C
C     EXPAND OUT TO NEXT TERRACE
   27 MAXSQR=MAXSQR+1
      IF(MAXSQR.GE.0)GO TO 28
      MAXPIN=MAXPIN+2
      IY=IY+1
      KNTPIN=MAXPIN
      GO TO 24
   28 IF(INSERT.NE.0)JERR=JERR+1
      GO TO 38
C
C     CALCULATE WORD COUNT AND BYTE COUNT IN WORD
   29 IBYTE=IX-1+(KWIDE*(IY-1))
      IWORD=IBYTE/MAXBYT
      IBYTE=IBYTE-(MAXBYT*IWORD)+1
      IWORD=IWORD+1
C
C     GET CURRENT CONTENTS OF BYTE.
      IRIGHT=ISTORE(IWORD)
      IF(IBYTE.GE.MAXBYT)GO TO 30
      ILEFT=IRIGHT/ISHIFT(IBYTE+1)
      IRIGHT=IRIGHT-(ISHIFT(IBYTE+1)*ILEFT)
   30 KOMPAR=IRIGHT/ISHIFT(IBYTE)
      I=INSERT
      IF(KONECT.GE.-1)GO TO 32
C
C     DECIDE CHARACTER TO INSERT ON TERRACE
      IF(INSERT.GT.0)GO TO 31
      IF(KOMPAR.EQ.0)GO TO 25
      GO TO 35
   31 IF(KOMPAR.EQ.0)GO TO 35
      IF(MASTER(KOMPAR).LT.MASTER(INSERT))GO TO 35
      GO TO 25
C
C     DECIDE CHARACTER TO INSERT AT POINT OR LINE SEGMENT
   32 IF(KOMPAR.EQ.INSERT)GO TO 36
      IF(KOMPAR.EQ.0)GO TO 35
      IF(INSERT.EQ.0)GO TO 35
      IF(IPASS.GT.0)GO TO 33
      IF(KOMPAR.EQ.LTRLIN)GO TO 35
      GO TO 34
   33 IF(KOMPAR.EQ.LTRPNT)GO TO 36
   34 IF(MASTER(KOMPAR).GT.MASTER(INSERT))GO TO 36
      IF(MASTER(KOMPAR).EQ.MASTER(INSERT))I=1
C
C     INSERT THE NEW CHARACTER
   35 IRIGHT=IRIGHT-(ISHIFT(IBYTE)*KOMPAR)
      ISTORE(IWORD)=(I*ISHIFT(IBYTE))+IRIGHT
      IF(IBYTE.LT.MAXBYT)ISTORE(IWORD)=
     1ISTORE(IWORD)+(ILEFT*ISHIFT(IBYTE+1))
C
C     IF CLEARING OUT A SET OF TERRACES, RETURN FOR NEXT
      IF(KONECT.GE.-1)GO TO 36
      LASTX=IX
      LASTY=IY
      IF(INSERT.EQ.0)GO TO 25
      GO TO 38
C
C     CHECK IF LINE SEGMENT IS DONE
   36 IF(IPASS.LE.0)GO TO 38
      IUSED=IUSED+1
      IF(IUSED.LE.MULT)GO TO 21
C
C     NEW END OF THIS LINE BECOMES OLD END FOR NEXT LINE
   37 LASTX=NEWX
      LASTY=NEWY
   38 KRD=KRD+1
      IF(KRD.LE.MAXSUB)GO TO 14
C
C     DONE WITH THIS PASS, CHECK IF MUST MAKE LINE SEGMENTS
      IF(IPASS.GT.0)GO TO 39
      IPASS=1
      IF(KONECT.LT.0)GO TO 39
      LASTX=1.5+(XSCALE*(XPOINT(MINSUB)-XFIRST))
      LASTY=1.5+HIGH-(YSCALE*(YPOINT(MINSUB)-YFIRST))
      INSERT=LTRLIN
      KRD=MINSUB
      GO TO 38
C
C     ************************
C     *                      *
C     *  CONSTRUCT THE PLOT  *
C     *                      *
C     ************************
C
   39 LTRERR=IERR
      LINERR=JERR
      IF(IPLOT.LT.0)GO TO 93
      IF(KONTNT.EQ.0)GO TO 93
      IPASS=1
      IF(IPLOT.GT.0)GO TO 41
C
C     MARK THAT PLOT AREA IS EMPTY
   40 KONTNT=0
C
C     GET SWITCHES SET BY IGRID
C     JGRID  = ONES DIGIT
C     KGRID  = TENS DIGIT
C     LGRID  = HUNDREDS DIGIT
   41 LGRID=MGRID
      IF(LGRID.LT.0)LGRID=-LGRID-1
      KGRID=LGRID/10
      JGRID=LGRID-10*KGRID
      LGRID=LGRID/100
      KGRID=KGRID-10*LGRID
C
C     GET SWITCHES SET BY IEDGE
C     JEDGE  = ONES DIGIT
C     KEDGE  = TENS DIGIT
C     LEDGE  = HUNDREDS DIGIT
      LEDGE=MEDGE
      IF(LEDGE.LT.0)LEDGE=-LEDGE-1
      KEDGE=LEDGE/10
      JEDGE=LEDGE-10*KEDGE
      LEDGE=LEDGE/100
      KEDGE=KEDGE-10*LEDGE
C
C     DETERMINE LOCATIONS OF LEFT AND RIGHT PLOT EDGES
      IWIDTH=10
      IF(IWIDTH.GT.IWIDE)IWIDTH=IWIDE
      JWIDTH=IWIDTH/2
      IF(JEDGE.LE.1)GO TO 42
      IFIRST=1
      IF(JEDGE.EQ.2)IFIRST=JWIDTH+1
      GO TO 43
   42 IFIRST=12
   43 IF(IFIRST.LE.MMRGN)IFIRST=MMRGN+1
C     THIS LINE PROTECT AGAINST OVERRUN OF BUFFER
C     TEST IS AGAINST LENGTH OF BUFFER MINUS 4 CHARACTERS
C     WHICH COULD APPEAR RIGHT OF PLOT IN SCALE NUMBERS
      IF(IFIRST.GT.(MAXBFR-3-KWIDE))IFIRST=MAXBFR-3-KWIDE
      LEAVE=IFIRST-3
      IFINAL=IFIRST+KWIDE-1
C
C     DETERMINE LOCATIONS OF LEFT AND RIGHT GRID LINES
      IF(IWIDE.GT.KWIDE)GO TO 48
      LOSSX=IOVER
      IF(LOSSX.LE.-KWIDE)GO TO 48
      IF(LOSSX.GE.KWIDE)GO TO 48
   44 IF(LOSSX.GE.0)GO TO 45
      LOSSX=LOSSX+IWIDE
      GO TO 44
   45 IF(LOSSX.LT.IWIDE)GO TO 46
      LOSSX=LOSSX-IWIDE
      GO TO 45
   46 LTRLFT=IFIRST+LOSSX
      LTRRIT=LTRLFT
   47 LTRRIT=LTRRIT+IWIDE
      IF(LTRRIT.LE.IFINAL)GO TO 47
      LTRRIT=LTRRIT-IWIDE
      GO TO 49
   48 LTRLFT=IFIRST-1
      LTRRIT=IFINAL+1
      LOSSX=KWIDE
      IF(JEDGE.EQ.0)JEDGE=1
      IF(JEDGE.EQ.2)JEDGE=3
   49 IF(IHIGH.GT.KHIGH)GO TO 54
      LOSSY=IUP
      IF(LOSSY.LE.-KHIGH)GO TO 54
      IF(LOSSY.GE.KHIGH)GO TO 54
   50 IF(LOSSY.GE.0)GO TO 51
      LOSSY=LOSSY+IHIGH
      GO TO 50
   51 IF(LOSSY.LT.IHIGH)GO TO 52
      LOSSY=LOSSY-IHIGH
      GO TO 51
   52 LINLOW=KHIGH-LOSSY
      LOSSY=LINLOW-1
   53 LOSSY=LOSSY-IHIGH
      IF(LOSSY.GE.0)GO TO 53
      LOSSY=IHIGH+LOSSY
      LINHIH=LOSSY+1
      GO TO 55
   54 LINHIH=0
      LINLOW=KHIGH+1
      LOSSY=KHIGH
C
C     RESET LIMITS WHICH PREVENT CERTAIN BORDER LINES
   55 IF(JGRID.EQ.0)GO TO 56
      IF(KGRID.LE.1)GO TO 57
   56 LTRLFT=IFIRST
      IF(KEDGE.GT.1)LTRLFT=LTRLFT-1
   57 IF(JGRID.EQ.0)GO TO 58
      IF(KGRID.EQ.0)GO TO 59
      IF(KGRID.EQ.2)GO TO 59
   58 LTRRIT=IFINAL
      IF(KEDGE.EQ.0)GO TO 59
      IF(KEDGE.NE.2)LTRRIT=LTRRIT+1
   59 IF(JGRID.EQ.0)GO TO 60
      IF(LGRID.LE.1)GO TO 61
   60 LINLOW=KHIGH
      IF(LEDGE.GT.1)LINLOW=LINLOW+1
   61 IF(JGRID.EQ.0)GO TO 62
      IF(LGRID.EQ.0)GO TO 63
      IF(LGRID.EQ.2)GO TO 63
   62 LINHIH=1
      IF(LEDGE.EQ.0)GO TO 63
      IF(LEDGE.NE.2)LINHIH=0
   63 JGRID=JGRID-1
C
C     FLOATING POINT WIDTH OF PLOT
      WIDE=KWIDE-1
      HIGH=KHIGH-1
C
C     DEFINE HEIGHT OF REGION CONSIDERED TO CONTAIN ZERO
      IF(KHIGH.LE.1)GO TO 64
      ZERO=0.25*((YFINAL-YFIRST)/HIGH)
      IF(ZERO.LT.0.0)ZERO=-ZERO
C
C     DEFINE VALUE IN CASE PLOT IS ONLY 1 LINE HIGH
   64 VALUE=YFINAL
C
C     SET CARRIAGE CONTROL CHARACTER
      KONTRL=JSPACE
      IF(LINPRT.GT.0)KONTRL=ISTAR
C
C     DEFINE THE STARTING INDEXES
C     KNTLIN = CURRENT LINE NUMBER
C     KNTWRD = SUBSCRIPT IN STORAGE ARRAY OF WORD BEING
C              UNPACKED
C     KNTBYT = BYTE COUNT IN THE WORD BEING UNPACKED
C     LOSSX AND LOSSY ARE USED TO PLACE GRIDS ON PLOT
C     LOSSX  = FROM NOW IS INITIAL VALUE OF COLUMN COUNT
C              RELATIVE TO NEXT COLUMN TO BEAR GRID LINE
C     LOSSY  = FROM NOW IS VALUE OF LINE COUNT RELATIVE
C              TO NEXT LINE TO BEAR A GRID LINE.
      KNTLIN=1
      KNTWRD=0
      KNTBYT=MAXBYT
C
C     HIDDEN SWITCH FOR TIME SERIES PLOT CONSTRUCTION
C
C     IEDGE.LT.0 DO NOT PLOT  BOTTOM LINE OF PLOT.  DO  NOT
C                PLOT  SCALE NUMBERS   BELOW PLOT.   BOTTOM
C                LINE IS ROLLED  INTO  TOP LINE AND REST OF
C                PLOT STORAGE IS LEFT EMPTY.
C
C     IKNTBY = BYTE INTO WHICH  TO SAVE NEXT  UNPACKED BYTE
C              IF ROLLING LAST LINE INTO FIRST
C     IKNTWR = WORD INTO WHICH  TO SAVE NEXT  UNPACKED BYTE
C              IF ROLLING LAST LINE INTO FIRST
C
      IF(MGRID.GE.0)GO TO 65
      IKNTWR=0
      IKNTBY=MAXBYT
      KONTNT=0
C
C     CONSTANTS RESET AT START OF EACH LINE
   65 KNTLTR=IFIRST
      KNTCLM=LOSSX
      IF(LOSSY.NE.0)GO TO 67
      IF(JEDGE.GT.1)GO TO 67
C
C     CONSTRUCT SCALE NUMBER ON LINE WHICH CAN BE GRID
      IF(KNTLIN.LE.1)GO TO 66
      VALUE=(YFINAL*(FLOAT(KHIGH-KNTLIN)/HIGH))+
     1(YFIRST*(FLOAT(KNTLIN-1)/HIGH))
      IF(VALUE.GE.ZERO)GO TO 66
      IF(VALUE.GT.(-ZERO))VALUE=0.0
   66 CALL DARITE(VALUE,1,0,0,1,-3,0,LEAVE,-2,7,
     15,5,0,0,4,0,0,-1,0,MAXBFR,LTRBUF,I,KERR)
      IUSED=LEAVE+2
      LTRBUF(LEAVE+1)=KSPACE
      LTRBUF(IUSED)=IHRZNT
      GO TO 69
C
C     FILL SPACE TO LEFT WITH SPACES IF NO SCALE NUMBER
   67 IUSED=1
      I=0
   68 I=I+1
      IF(I.GE.IFIRST)GO TO 69
      LTRBUF(I)=KSPACE
      GO TO 68
C
C     UNPACK NEXT BYTE
   69 KNTBYT=KNTBYT+1
      IF(KNTBYT.LE.MAXBYT)GO TO 70
      KNTWRD=KNTWRD+1
      KNTBYT=1
      IVALUE=ISTORE(KNTWRD)
      IF(KONTNT.EQ.0)ISTORE(KNTWRD)=0
   70 JVALUE=IVALUE
      IVALUE=IVALUE/LRGBYT
      JVALUE=JVALUE-(LRGBYT*IVALUE)
C
C     IF ROLLING LAST LINE INTO FIRST, SAVE BYTE
      IF(MGRID.GE.0)GO TO 72
      IF(KNTLIN.LT.KHIGH)GO TO 72
      IKNTBY=IKNTBY+1
      IF(IKNTBY.LE.MAXBYT)GO TO 71
      IKNTBY=1
      IKNTWR=IKNTWR+1
   71 ISTORE(IKNTWR)=ISTORE(IKNTWR)+(JVALUE*ISHIFT(IKNTBY))
C
C     DECIDE WHAT CHARACTER TO PLACE INTO OUTPUT BUFFER
   72 IF(JVALUE.GT.0)GO TO 79
      IF(KNTLIN.EQ.LINLOW)GO TO 74
      IF(KNTLIN.EQ.LINHIH)GO TO 74
      IF(LOSSY.EQ.0)GO TO 75
      IF(KNTLTR.EQ.LTRLFT)GO TO 73
      IF(KNTLTR.EQ.LTRRIT)GO TO 73
      IF(JGRID.GE.0)GO TO 81
      IF(KNTCLM.GT.0)GO TO 81
   73 LTRBUF(KNTLTR)=IVRTCL
      GO TO 80
   74 IF(KNTLTR.EQ.LTRLFT)GO TO 78
      IF(KNTLTR.EQ.LTRRIT)GO TO 78
      GO TO 76
   75 IF(KNTLTR.EQ.LTRLFT)GO TO 78
      IF(KNTLTR.EQ.LTRRIT)GO TO 78
      IF(JGRID.GE.0)GO TO 77
   76 IF(KNTCLM.LE.0)GO TO 78
      LTRBUF(KNTLTR)=IHRZNT
      GO TO 80
   77 IF(JGRID.GT.0)GO TO 81
      IF(KNTCLM.GT.0)GO TO 81
   78 LTRBUF(KNTLTR)=ICORNR
      GO TO 80
   79 LTRBUF(KNTLTR)=LTRALL(JVALUE+6)
   80 IUSED=KNTLTR
      GO TO 82
   81 LTRBUF(KNTLTR)=ISPACE
   82 IF(KNTCLM.LE.0)KNTCLM=IWIDE
      KNTCLM=KNTCLM-1
      KNTLTR=KNTLTR+1
      IF(KNTLTR.LE.IFINAL)GO TO 69
C
C     OUTPUT THE COMPLETED LINE
      KNTLIN=KNTLIN+1
      IF(KNTLIN.LE.KHIGH)GO TO 83
      IF(MGRID.GE.0)GO TO 83
      KONTNT=1
      GO TO 92
   83 IF(LINPRT.LT.0)WRITE(IDISK,84)(LTRBUF(I),I=1,IUSED)
      IF(LINPRT.GE.0)WRITE(IDISK,84)KONTRL,
     1(LTRBUF(I),I=1,IUSED)
   84 FORMAT(147A1)
      IF(LOSSY.LE.0)LOSSY=IHIGH
      LOSSY=LOSSY-1
      IF(KNTLIN.LE.KHIGH)GO TO 65
C
C     PRINT GRID LINE EXTENSIONS BELOW PLOT
      IF(JEDGE.EQ.1)GO TO 92
      IF(JEDGE.GE.3)GO TO 92
      IF(IWIDE.GT.KWIDE)GO TO 92
      IFIRST=IFIRST+LOSSX
      KNTLTR=0
      I=IFIRST
   85 KNTLTR=KNTLTR+1
      IF(KNTLTR.GE.I)GO TO 86
      LTRBUF(KNTLTR)=KSPACE
      GO TO 85
   86 LTRBUF(KNTLTR)=IVRTCL
      I=I+IWIDE
      IF(I.LE.IFINAL)GO TO 85
      IF(LINPRT.LT.0)WRITE(IDISK,84)(LTRBUF(I),I=1,KNTLTR)
      IF(LINPRT.GE.0)WRITE(IDISK,84)KONTRL,
     1(LTRBUF(I),I=1,KNTLTR)
C
C     PRINT SCALE NUMBERS BELOW GRID LINE EXTENSIONS
      LERR=-1
      MINSIG=5
      IF(MINSIG.GT.(IWIDTH-2))MINSIG=IWIDTH-2
      IF(MINSIG.LE.0)MINSIG=1
      IF(KWIDE.LE.1)GO TO 87
      ZERO=0.25*((XFINAL-XFIRST)/WIDE)
      IF(ZERO.LT.0.0)ZERO=-ZERO
   87 KIND=LERR
      KNTLTR=IFIRST-JWIDTH-1
      I=LOSSX+1
      VALUE=XFIRST
   88 NEED=KNTLTR+IWIDE
      IF(I.LE.1)GO TO 89
      VALUE=(XFIRST*(FLOAT(KWIDE-I)/WIDE))+
     1(XFINAL*(FLOAT(I-1)/WIDE))
      IF(VALUE.GE.ZERO)GO TO 89
      IF(VALUE.GT.(-ZERO))VALUE=0.0
   89 CALL DARITE(VALUE,0,0,KIND,1,-3,0,IWIDTH,-2,-2,
     1MINSIG,5,0,0,4,0,0,-1,KNTLTR,MAXBFR,LTRBUF,KNTOUT,
     2KERR)
      KNTLTR=KNTOUT
      IF(KERR.GT.0)LERR=1
      I=I+IWIDE
      IF(I.GT.KWIDE)GO TO 91
   90 IF(NEED.LE.KNTLTR)GO TO 88
      KNTLTR=KNTLTR+1
      LTRBUF(KNTLTR)=KSPACE
      GO TO 90
   91 IF(LINPRT.LT.0)WRITE(IDISK,84)(LTRBUF(I),I=1,KNTLTR)
      IF(LINPRT.GE.0)WRITE(IDISK,84)KONTRL,
     1(LTRBUF(I),I=1,KNTLTR)
      IF(KIND.NE.LERR)GO TO 87
   92 IF(IPASS.LE.0)GO TO 12
   93 RETURN
C581314532331!&
      END