Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-05 - decus/20-0141/dabelt.for
There are 2 other files named dabelt.for in the archive. Click here to see a list.
      SUBROUTINE DABELT(KOLUMN,INTRVL,JSTIFY,LINE  ,ILEFT ,
     1    IRIGHT,LFTCOL,MAXBFR,IBUFFR,MAXLIN,MAXPRT,MAXUSD)
C     RENBR(/IDENTIFY COLUMN NUMBERS)
C
C     DONALD BARTH, CHEM. DEPT., HARVARD UNIVERSITY
C     JAN 2, 1970 / LOGICAL IF VERSION JUL 26, 1975
C
C     WHEN A PROGRAM NEEDS TO DISPLAY TO THE USER A LINE OF
C     CHARACTERS  IN  WHICH  THE CHARACTERS ARE ORIENTED BY
C     COLUMNS, A BAND OF NUMBERS  IDENTIFYING  THE  COLUMNS
C     CAN  BE  PRINTED,  EITHER  ABOVE  OR  BELOW  THE MAIN
C     DISPLAY, BY CALLING THE DABELT  ROUTINE  TO  GENERATE
C     EACH LINE OF THE REPRESENTATION OF THE COLUMN NUMBERS
C     IN A BUFFER ARRAY WHICH THE CALLING PROGRAM CAN  THEN
C     PRINT  WITH  A  MULTIPLE  OF AN A1 FORMAT.  DABELT IS
C     CALLED AS MANY  TIMES  AS  THERE  ARE  LINES  IN  THE
C     REPRESENTATION  OF  THE  COLUMN  NUMBERS, THE CALLING
C     PROGRAM PRINTING THE RETURNED CHARACTERS BEFORE AGAIN
C     ASKING DABELT TO GENERATE THE NEXT LINE.
C
C     NUMBERS CAN BE GENERATED WITH  EACH  LINE  CONTAINING
C     DIGITS  CORRESPONDING  TO  SAME  POWER  OF  10  AS IN
C     FOLLOWING EXAMPLE
C
C                5432109876543210123456789012345
C                111111---------          111111
C                ------
C
C     OR  WITH  EACH  LINE  CONTAINING   DIGITS   OF   SAME
C     SIGNIFICANCE AS IN FOLLOWING EXAMPLE.
C
C                ---------------0123456789111111
C                111111987654321          012345
C                543210
C
C     NUMBERS  CAN  DECREASE  FROM  LEFT  TO  RIGHT  AS  IN
C     FOLLOWING EXAMPLE
C
C                5432109876543210123456789012345
C                111111          ---------111111
C                                         ------
C
C     AND  CAN  HAVE  ANY  DESIRED  SPACING  AND  INCREMENT
C     BETWEEN ADJACENT NUMBERS AS IN FOLLOWING EXAMPLE.
C
C         - - 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2
C         2 1   0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0
C         0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
C         0 0                     0 0 0 0 0 0 0 0 0 0 0
C
C     FOLLOWING ARE INPUT ARGUMENTS LEFT UNCHANGED.
C
C     KOLUMN = NUMBER OF COLUMNS  TO  BE  USED  FOR  SINGLE
C              NUMBER.   IF  KOLUMN IS GREATER THAN 1, THEN
C              KOLUMN-1 COLUMNS OF SPACES WILL BE  INSERTED
C              BETWEEN   NUMBERS.   NO  EXTRA  SPACES  WILL
C              APPEAR TO RIGHT  OF  RIGHT  NUMBER  EVEN  IF
C              KOLUMN  IS  GREATER THAN 1.  EFFECTIVE VALUE
C              OF KOLUMN IS 1 IF KOLUMN IS INPUT LESS  THAN
C              OR EQUAL TO ZERO.
C
C     INTRVL = DIFFERENCE BETWEEN  ADJACENT  NUMBERS  WHICH
C              ARE  TO  BE REPRESENTED IN IBUFFR ARRAY.  IF
C              SIGN OF INTRVL  IS  WRONG  TO  PROCEED  FROM
C              ILEFT  TO  IRIGHT,  THEN  SIGN  OF EFFECTIVE
C              VALUE OF INTRVL IS REVERSED,  BUT  SIGN  AND
C              VALUE   OF   ARGUMENT  SUPPLIED  BY  CALLING
C              PROGRAM ARE LEFT UNCHANGED.  EFFECTIVE VALUE
C              OF  INTRVL  IS 1 IF INTRVL IS INPUT EQUAL TO
C              ZERO.
C
C     JSTIFY = 0,  EACH   LINE   IS   TO   CONTAIN   DIGITS
C              CORRESPONDING  TO  SAME  POWER  OF  10 AS IN
C              FIRST EXAMPLE AT START OF  DOCUMENTATION  OF
C              THIS  ROUTINE.   LINE  EQUAL  TO  1  SELECTS
C              DIGITS OF LOWEST  SIGNIFICANCE  IN  NUMBERS.
C              LINE  EQUAL  TO  MAXLIN  WILL  SELECT EITHER
C              MINUS SIGN OR DIGITS OF HIGHEST SIGNIFICANCE
C              IF  POSITIVE  IN NUMBER OR NUMBERS REQUIRING
C              MOST CHARACTERS TO REPRESENT.
C            = 1, EACH LINE IS TO CONTAIN  DIGITS  OF  SAME
C              SIGNIFICANCE  AS  IN SECOND EXAMPLE AT START
C              OF  DOCUMENTATION  OF  THIS  ROUTINE.   LINE
C              EQUAL 1 SELECTS EITHER MINUS SIGNS OR DIGITS
C              OF  HIGHEST  SIGNIFICANCE  IF  POSITIVE   IN
C              NUMBERS.   LINE  EQUAL TO MAXLIN WILL SELECT
C              DIGITS OF LOWEST SIGNIFICANCE IN  NUMBER  OR
C              NUMBERS   REQUIRING   MOST   CHARACTERS   TO
C              REPRESENT.
C
C     LINE   = SELECTS  WHICH  LINE  OF  REPRESENTATION  OF
C              NUMBERS  IS TO BE CONSTRUCTED.  LINE EQUAL 1
C              WILL SELECT DIGITS OF LOWEST SIGNIFICANCE IF
C              JSTIFY  IS ZERO, OR MINUS SIGNS OR DIGITS OF
C              HIGHEST SIGNIFICANCE OF POSITIVE NUMBERS  IF
C              JUSTIFY EQUALS 1.  LINE EQUAL TO MAXLIN WILL
C              SELECT MINUS  SIGNS  OR  DIGITS  OF  HIGHEST
C              SIGNIFICANCE   IF   POSITIVE  OF  NUMBER  OR
C              NUMBERS   REQUIRING   MOST   CHARACTERS   TO
C              REPRESENT  IF  JSTIFY  IS ZERO, OR DIGITS OF
C              LOWEST SIGNIFICANCE  OF  NUMBER  OR  NUMBERS
C              REQUIRING  MOST  CHARACTERS  TO REPRESENT IF
C              JSTIFY EQUALS 1.  MAXPRT AND MAXUSD ARE BOTH
C              RETURNED  EQUAL  TO INPUT VALUE OF LFTCOL IF
C              LINE IS INPUT GREATER THAN MAXLIN.
C
C              FOLLOWING EXAMPLES ILLUSTRATE DEFINITION  OF
C              LINE FOR JSTIFY EQUAL TO BOTH ZERO AND ONE.
C
C              KOLUMN= 2, INTRVL=75, JSTIFY= 0, ILEFT=-1052
C              LINE=1   2 7 2 7 2 7 2 7 2 7 2 7 2 7 2 3 8 3
C              LINE=2   5 7 0 2 5 7 0 2 5 7 0 2 5 7 - 7 4 2
C              LINE=3   0 9 9 8 7 6 6 5 4 3 3 2 1 -     1 2
C              LINE=4   1 - - - - - - - - - - - -
C              LINE=5   -
C              LINE=6
C
C              KOLUMN= 2, INTRVL=75, JSTIFY= 1, ILEFT=-1052
C              LINE=1   - - - - - - - - - - - - - - - 7 1 2
C              LINE=2   1 9 9 8 7 6 6 5 4 3 3 2 1 7 2 3 4 2
C              LINE=3   0 7 0 2 5 7 0 2 5 7 0 2 5 7     8 3
C              LINE=4   5 7 2 7 2 7 2 7 2 7 2 7 2
C              LINE=5   2
C              LINE=6
C
C              SINCE EFFECTIVE VALUE OF MAXLIN IS NOT KNOWN
C              PRIOR  TO  FIRST  CALL TO THIS ROUTINE, LINE
C              CAN BE SET TO ZERO TO REPRESENT SAME LINE AS
C              IF LINE WAS INPUT EQUAL TO RETURNED VALUE OF
C              MAXLIN.   LINE  IS  RETURNED  UNCHANGED,  SO
C              CALLING  PROGRAM  WOULD IN THIS CASE HAVE TO
C              SET LINE EQUAL TO RETURNED VALUE OF MAXLIN-1
C              PRIOR TO SECOND CALL TO THIS ROUTINE.
C
C     ILEFT  = THE LEFT OR FIRST NUMBER TO BE REPRESENTED.
C
C     IRIGHT = THE RIGHT OR FINAL LIMIT OF  NUMBERS  TO  BE
C              REPRESENTED.   UNLIKE  ILEFT WHICH IS ALWAYS
C              REPRESENTED, IRIGHT IS REPRESENTED  ONLY  IF
C              BUFFER  IS  LARGE  ENOUGH TO INCLUDE NUMBERS
C              THROUGH IRIGHT PLUS EXTRA SPACES  IF  KOLUMN
C              IS  GREATER  THAN  1, AND IF IRIGHT-ILEFT IS
C              EXACTLY WHOLE NUMBER MULTIPLE OF INTRVL.  IF
C              IRIGHT-ILEFT  IS  NOT  EXACTLY  WHOLE NUMBER
C              MULTIPLE OF INTRVL,  THEN  RIGHTMOST  NUMBER
C              WHICH  COULD  BE  REPRESENTED  IF  BUFFER IS
C              LARGE ENOUGH IS NUMBER WHICH IS NEXT SMALLER
C              WHOLE NUMBER MULTIPLE TO RIGHT OF ILEFT.
C
C     LFTCOL = THE SUBSCRIPT OF IBUFFR  ARRAY  LOCATION  TO
C              IMMEDIATE  LEFT OF LOCATION INTO WHICH IS TO
C              BE   PLACED   DIGIT    OR    SIGN    FORMING
C              REPRESENTATION  UPON  CURRENT  LINE  OF LEFT
C              NUMBER.
C
C     MAXBFR = SUBSCRIPT  OF  HIGHEST  LOCATION  IN  IBUFFR
C              ARRAY    INTO    WHICH    CAN    BE   PLACED
C              REPRESENTATIONS  OF   NUMBERS   FROM   ILEFT
C              THROUGH  IRIGHT.   THIS  WOULD  NORMALLY  BE
C              DIMENSION OF IBUFFR ARRAY.
C
C     FOLLOWING ARGUMENTS ARE USED FOR OUTPUT.  THEIR INPUT
C     VALUES ARE IGNORED.
C
C     IBUFFR = ARRAY IN WHICH NUMBERS ARE TO BE REPRESENTED
C              AND  WHICH  CAN  THEN  BE PRINTED BY CALLING
C              PROGRAM USING MULTIPLE OF A1 FORMAT.
C
C     MAXLIN = RETURNED CONTAINING NUMBER OF  LINES  NEEDED
C              TO  REPRESENT  NUMBERS ILEFT THROUGH IRIGHT.
C              ACTUAL NUMBER OF LINES WHICH  WOULD  INCLUDE
C              PRINTING  CHARACTERS MAY BE LESS SINCE RIGHT
C              NUMBER ACTUALLY DISPLAYED CAN REQUIRE  FEWER
C              CHARACTERS FOR ITS REPRESENTATION THAN WOULD
C              IRIGHT.
C
C     MAXPRT = RETURNED  CONTAINING  SUBSCRIPT   OF   RIGHT
C              LOCATION IN IBUFFR ARRAY CONTAINING PRINTING
C              CHARACTER GENERATED  BY  THIS  ROUTINE.   IF
C              CURRENT  CALL  TO THIS ROUTINE HAS NOT ADDED
C              ANY  PRINTING  CHARACTERS  TO  IBUFFR,  THEN
C              MAXPRT WILL BE RETURNED EQUAL TO LFTCOL.
C
C     MAXUSD = RETURNED  CONTAINING  SUBSCRIPT   OF   RIGHT
C              LOCATION  IN  IBUFFR  ARRAY  CONTAINING  ANY
C              CHARACTER GENERATED  BY  THIS  ROUTINE.   IF
C              LINE  IS  LESS THAN OR EQUAL TO MAXLIN, THEN
C              MAXUSD WILL BE RETURNED EQUAL  TO  VALUE  OF
C              MAXPRT  WHICH  WOULD BE RETURNED IF LINE WAS
C              INPUT  AS  1.   SINCE   RIGHTMOST   PRINTING
C              CHARACTER  GENERATED BY CURRENT CALL TO THIS
C              ROUTINE CAN BE TO LEFT OF THAT GENERATED  IF
C              LINE  IS  1,  ARRAY  LOCATIONS  STARTING  AT
C              IBUFFR(MAXPRT+1) THROUGH IBUFFR(MAXUSD) WILL
C              CONTAIN  SPACES.   IF  LINE  IS GREATER THAN
C              RETURNED VALUE OF  MAXLIN,  THEN  MAXUSD  IS
C              RETURNED EQUAL TO LFTCOL.
C
      DIMENSION IBUFFR(MAXBFR),IDGT(10)
      DATA IDGT/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9/
      DATA ISPACE,IMINUS/1H ,1H-/
C
C     FIND OUT WHICH DIRECTION TO TRAVEL
      MAXUSD=LFTCOL
      MAXPRT=LFTCOL
      JNCRMT=INTRVL
      IF(JNCRMT.LT.0)JNCRMT=-JNCRMT
      IF(JNCRMT.EQ.0)JNCRMT=1
      IF(ILEFT.GT.IRIGHT)JNCRMT=-JNCRMT
      INCRMT=INTRVL
      IF(INCRMT.LT.0)INCRMT=-INCRMT
      IF(INCRMT.LE.0)INCRMT=1
C
C     FIND LIMITING VALUE OF INTERVAL
      IF(ILEFT.LE.IRIGHT)GO TO 2
      IF(IRIGHT.GE.0)GO TO 1
      ITEST=-10*IRIGHT
      IF(ILEFT.LE.ITEST)GO TO 4
    1 ITEST=ILEFT
      GO TO 4
    2 IF(ILEFT.GE.0)GO TO 3
      ITEST=-10*ILEFT
      IF(IRIGHT.LE.ITEST)GO TO 4
    3 ITEST=IRIGHT
C
C     FIND INTERVAL CORRESPONDING TO LINE NUMBER
    4 IPWR10=1
      MAXLIN=0
    5 MAXLIN=MAXLIN+1
      IF(LINE.EQ.MAXLIN)IUSE=IPWR10
      IPWR10=10*IPWR10
      IF(IPWR10.LE.ITEST)GO TO 5
C
C     DETERMINE IF LINE NUMBER IS IN PROPER RANGE
      IF(LINE.GT.MAXLIN)GO TO 38
C
C     INITIAL CONDITIONS
      ITOTAL=ILEFT
      IPOSN=LFTCOL
      LEVEL=LINE
      IF(LINE.GT.0)GO TO 6
      IUSE=IPWR10/10
      LEVEL=MAXLIN
    6 IF(JSTIFY.GT.0)GO TO 26
C
C     DETERMINE HOW MANY TIMES FIRST DIGIT APPEARS
    7 LIMIT=ITOTAL
      IF(LIMIT.LT.0)LIMIT=-LIMIT
      LIMIT=LIMIT/IUSE
      IF(ILEFT.GT.IRIGHT)GO TO 8
      JUSE=IUSE
      IF(ITOTAL.LT.0)GO TO 10
      LIMIT=(JUSE*LIMIT)+IUSE-1
      GO TO 9
    8 JUSE=-IUSE
      IF(ITOTAL.GT.0)GO TO 10
      LIMIT=(JUSE*LIMIT)-IUSE+1
    9 JDRCTN=1
      GO TO 11
   10 LIMIT=-(JUSE*LIMIT)
      JDRCTN=-1
   11 IADD=1
      IF(IUSE.LE.INCRMT)IADD=INCRMT/IUSE
      IADD=JUSE*IADD
      GO TO 33
C
C     PUT IN DIGITS OR SPACES OR MINUS SIGNS
   12 IF(ILEFT.LE.IRIGHT)GO TO 13
      IF(LIMIT.LT.IRIGHT)LIMIT=IRIGHT
      GO TO 14
   13 IF(LIMIT.GT.IRIGHT)LIMIT=IRIGHT
   14 IF(ILEFT.LE.IRIGHT)GO TO 15
      IF(ITOTAL.GE.LIMIT)GO TO 16
      IF(ITOTAL.LT.IRIGHT)GO TO 38
      GO TO 27
   15 IF(ITOTAL.LE.LIMIT)GO TO 16
      IF(ITOTAL.GT.IRIGHT)GO TO 38
      GO TO 27
   16 IF(IPOSN.GE.MAXBFR)GO TO 38
      IPOSN=IPOSN+1
      IF(JSTIFY.LE.0)GO TO 18
      IF(LEVEL.NE.1)GO TO 17
      IF(ITOTAL.LT.0)GO TO 19
      IF(ITOTAL.EQ.0)INDEX=1
      GO TO 22
   17 IF(IUSE.LE.0)GO TO 21
      GO TO 22
   18 IF(IUSE.EQ.1)GO TO 22
      IF(ITOTAL.GE.0)GO TO 20
      IF(ITOTAL.LE.-IUSE)GO TO 22
      IF(ITOTAL.GT.-(IUSE/10))GO TO 21
   19 IBUFFR(IPOSN)=IMINUS
      GO TO 23
   20 IF(ITOTAL.GE.IUSE)GO TO 22
   21 IBUFFR(IPOSN)=ISPACE
      GO TO 24
   22 IBUFFR(IPOSN)=IDGT(INDEX)
   23 MAXPRT=IPOSN
   24 MAXUSD=IPOSN
      JSPACE=KOLUMN
      ITOTAL=ITOTAL+JNCRMT
   25 IF(IPOSN.GE.MAXBFR)GO TO 38
      JSPACE=JSPACE-1
      IF(JSPACE.LE.0)GO TO 14
      IPOSN=IPOSN+1
      IBUFFR(IPOSN)=ISPACE
      GO TO 25
C
C     FIND NEXT POWER OF 10 IF JSTIFY IS GREATER THAN ZERO
   26 LUSE=10*IUSE
      KUSE=IUSE
      GO TO 28
   27 IF(JSTIFY.LE.0)GO TO 31
   28 ITEST=ITOTAL
      IF(ITEST.LT.0)ITEST=-10*ITEST
      IF(ITEST.LT.KUSE)GO TO 30
      ITEST=ITEST/LUSE
      IUSE=1
   29 IF(IUSE.GT.ITEST)GO TO 7
      IUSE=10*IUSE
      GO TO 29
   30 IUSE=0
      LIMIT=ITOTAL
      GO TO 12
C
C     GET LIMIT IF JSTIFY EQUALS ZERO
   31 LIMIT=LIMIT+IADD
      IF(JDRCTN.GE.0)GO TO 33
      IF(ILEFT.LE.IRIGHT)GO TO 32
      IF(ITOTAL.GT.0)GO TO 35
      IF(IADD.NE.-1)LIMIT=LIMIT+1
      JDRCTN=1
      GO TO 34
   32 IF(ITOTAL.LT.0)GO TO 34
      IF(IADD.NE.1)LIMIT=LIMIT-1
      JDRCTN=1
      GO TO 35
C
C     GET NEXT DIGIT TO DISPLAY
   33 IF(ITOTAL.GE.0)GO TO 35
   34 INDEX=-ITOTAL/IUSE
      GO TO 36
   35 INDEX=ITOTAL/IUSE
   36 IF(INDEX.LE.9)GO TO 37
      I=INDEX/10
      INDEX=INDEX-(10*I)
   37 INDEX=INDEX+1
      GO TO 12
C
C     RETURN TO CALLING PROGRAM
   38 RETURN
C830889848930
      END