home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / program / fortran77_210 / library / f77 / graphdemo < prev    next >
Encoding:
Text File  |  1992-01-04  |  15.1 KB  |  471 lines

  1.       PROGRAM GRAPHDEMO
  2. C  original for BBC Master Scientific from C.Johnson 
  3. C  modified by K.M.Crennell  for Archimedes  Dec 91
  4. C ********************* CopyRight 'Fortran Friends' 1992 ****************
  5. C  If you want to distribute any of this code in your own programs, please
  6. C  acknowledge the 'Fortran Friends' PD library and send us a copy.
  7. C ************************************************************************
  8. C
  9. C  libraries needed  Graphics, Utils 
  10. C
  11. C  demo of X,Y graph drawing routine GRAPH
  12.       PARAMETER (MAXPTS=100)
  13.       REAL X(MAXPTS),Y(MAXPTS)
  14.       CHARACTER C*1,TEX*80
  15. C                 screen constants set in subroutine INIT
  16.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  17.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  18.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  19.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  20. C
  21. C                    read in data from file, N = no of X,Y points read
  22.       CALL GETDAT(X,Y,N,MAXPTS)
  23. C               set window in which to draw graph
  24.       CALL GWIND(100,300,956,956)
  25. C                 initialisation call to GRAPH to find the scale factor
  26. C                 neded to plot the X,Y points on this screen
  27.       CALL GRAPH(X,Y,N,0,IER)
  28.         IF(IER.NE.0)GOTO80                                   
  29. C                 ask to plot the points joined by a line between them
  30. C                 in a different colour
  31.       CALL GCOL(0,15)
  32.       CALL GRAPH(X,Y,N,1,IER)
  33.         IF(IER.NE.0)GOTO80                                
  34. C                 ask to plot the points as square markers
  35.       CALL GRAPH(X,Y,N,2,IER)
  36.         IF(IER.NE.0)GOTO80                                
  37. C      
  38.       TEX='Press <Spacebar> to exit, or S to save graph :- '
  39.       CALL WOG(IX0+336,IY1-64,TEX)
  40.       C=CHAR(IGET())
  41.       IF (C.EQ.'S')  CALL SCRNSV
  42.       CALL VDU(12)
  43.       IF(IER.EQ.0)STOP
  44.    80 WRITE(*,*) '*** Bad value for IOPT (',IER,') ***'
  45.       STOP 'Fatal error! Program terminated.'
  46.       END
  47. C
  48.       SUBROUTINE GETDAT(X,Y,N,MAXPTS)
  49. C                     reads X,Y data, returns N no of points read,
  50. C                     MAXPTS = maximum no allowed.
  51.       REAL X(*),Y(*)
  52.       CHARACTER FNAME*30
  53.       WRITE(*,*) '  Fortran Graph plotter V1.0'
  54.       WRITE(*,*) ' ----------------------------'
  55.       WRITE(*,*)
  56.       WRITE(*,*) '  Data file name ='
  57.       READ(*,9000) FNAME
  58.  9000 FORMAT(A)
  59. C      FNAME='GraphData'
  60.       OPEN(UNIT=1,FILE=FNAME)
  61.       N=1
  62.    20 READ(1,*,END=80) X(N),Y(N)
  63.       N=N+1
  64.       IF(N.LE.MAXPTS)GOTO20
  65.    80 N=N-1
  66.       RETURN
  67.       END
  68. C                      start of utilities **********************
  69. C
  70.       SUBROUTINE AXIS(Z1,Z2,I)
  71. C  The axis is not drawn here, just the tick lines and numbers.              C    minimum Z1 and Max Z2    I=1 Xaxis, =2 Y axis
  72. C                     
  73.       IF (Z1.GT.Z2) THEN
  74. C                        allow for user having got it backwards???
  75.         T=Z1
  76.         Z1=Z2
  77.         Z2=T
  78.       END IF
  79.       M=0
  80.       A=0.0
  81.       N=0
  82.       B=0.0
  83.       IF (Z1.NE.0.0) M=NINT(LOG10(ABS(Z1)))
  84.       IF (Z2.NE.0.0) N=NINT(LOG10(ABS(Z2)))
  85. C            find the power of 10 for the min & max numbers
  86.       IF (M.GT.N) THEN
  87.         N1=M
  88.       ELSE
  89.         N1=N
  90.       END IF
  91.       A=Z1*10.0**(-N1)
  92.       B=Z2*10.0**(-N1)
  93.       IF (ABS(B-A).LT.0.2) THEN
  94.         A1=A
  95.         B1=B
  96.       ELSE
  97.         A1=ROUND(A,1)
  98.         B1=ROUND(B,1)
  99.       END IF
  100.       IF(I.EQ.1)THEN
  101. C                  write out the tickmarks and associated numbers for X axis
  102.         CALL XTICKS(A1,B1,N1)
  103.       ELSE                                                                  
  104. C                 tickmarks and numbers for Y axis
  105.         CALL YTICKS(A1,B1,N1)
  106.       ENDIF
  107.       RETURN
  108.       END
  109.       SUBROUTINE DELTA(RANGE,NTICKS,D,NM)
  110. C            calculates the value of D which makes the NTICKS tick marks
  111. C evenly spaced within the distance RANGE and at 'nice' values 1,2, or 5
  112. C ALSO returns the number of minor tickmarks, NM, plotted within D 
  113.       REAL DT(3)
  114. C            LOG10(1) log10(2)  Log10(5)
  115.       DATA DT/    0  ,0.301030, 0.69897/
  116. C                         DXT =Minimum distance between ticks in X axis
  117.       DXT=RANGE/FLOAT(NTICKS)
  118.       X=LOG10(DXT)
  119.       IDX=INT(X)
  120.       DDX=X-IDX 
  121. C              IDX  exponent of DXT  DDX = mantissa
  122. C    DXT=10**(IDX+DDX)      where 0 < DDX < 1   want next biggest 'nice' no.
  123.       IF(DDX.LT.0.)THEN
  124.         DDX=DDX+1.
  125.         IDX=IDX-1
  126.       ENDIF                                 
  127.       IF(DDX.GT.DT(1).AND.DDX.LT.DT(2))DX=2
  128.       IF(DDX.GT.DT(2).AND.DDX.LT.DT(3))DX=5
  129.       IF(DDX.GE.DT(3))DX=10
  130.       D=DX*10.**IDX
  131. C               get number of minor tickmarks to return
  132.       NM=1
  133.       IF(DX.EQ.2.)NM=3
  134.       IF(DX.EQ.5.)NM=4
  135.       RETURN
  136.       END
  137. C
  138.       SUBROUTINE DRAWLN(X,Y,N)
  139. C              draw line through the X,Y points
  140.       REAL X(*),Y(*)
  141.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  142.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  143.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  144.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  145. C
  146.       CALL MOVE(ISCRN(X(1),0,1),ISCRN(Y(1),0,2))
  147.       DO 10 I=2,N
  148.    10 CALL DRAW(ISCRN(X(I),0,1),ISCRN(Y(I),0,2))
  149.       RETURN
  150.       END
  151. C
  152.       SUBROUTINE DRPNTS(X,Y,N)
  153. C        draws a filled square, size KSQ, in background colour,KOLB, 
  154. C        outlined in foreground colour KOLF at each of the N points in X,Y
  155.       REAL X(*),Y(*)
  156.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  157.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  158.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  159.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  160.       L=KSQ/2
  161.       N0=0
  162.       DO 10 I=1,N
  163.        IXP=ISCRN(X(I),N0,1)
  164.        IYP=ISCRN(Y(I),N0,2)
  165.        CALL GCOL(0,KOLB)
  166.        CALL RECTAN(IXP-L,IYP-L,IXP+L,IYP+L,.TRUE.)
  167.        CALL GCOL(0,KOLF)
  168.        CALL RECTAN(IXP-L,IYP-L,IXP+L,IYP+L,.FALSE.)
  169.    10 CONTINUE
  170.       RETURN
  171.       END
  172. C
  173.       SUBROUTINE GRAPH(X,Y,N,IOPT,IER)
  174.       REAL X(*),Y(*)
  175.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  176.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  177.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  178.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  179. C IOPT=0  =>  Does scaling, draws frame and axes
  180. C
  181. C IOPT=1  =>  Draws line through X and Y values.
  182. C
  183. C IOPT=2  =>  Draws points through X and Y data using squares.
  184. C
  185.       IER=0
  186. C                      error returns zero if OK
  187.       IF(IOPT.LT.0.OR.IOPT.GT.2)THEN
  188.         IER=IOPT
  189.         RETURN
  190.       ENDIF 
  191.       GOTO (100,200,300),IOPT+1
  192. C
  193.   100 CONTINUE
  194.       CALL SCALE(X,Y,N)              
  195. C             scale the user points to fit screen and set up constants
  196.       CALL GCOL(0,KOLF)
  197. C                       Outline the drawing area along the axes
  198.       CALL RECTAN(IXL,IYL,IXR,IYR,.FALSE.)
  199. C                       draw the axes 
  200.       CALL AXIS(XMIN,XMAX,1)
  201.       CALL AXIS(YMIN,YMAX,2)
  202.       RETURN
  203. C                       draw a line through the points
  204.   200 CALL DRAWLN(X,Y,N)
  205.       RETURN
  206. C                       draw the points with marker, no line
  207.   300 CALL DRPNTS(X,Y,N)
  208.       RETURN
  209.       END
  210.       SUBROUTINE INIT
  211. C                  CALLED FROM SCALE to initialise screen constants
  212.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  213.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  214.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  215.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  216. C
  217. C            (IX0,IY0) to (IX1,IY1)   screen (or window) size (rasters)
  218. C      IX0=0
  219. C      IY0=0
  220. C      IX1=1280
  221. C      IY1=960
  222. C                get the graphics window size
  223.       IX0=ISHFT(MVDUVAR(128),MODEVAR(-1,4))
  224.       IX1=ISHFT(MVDUVAR(130),MODEVAR(-1,4))
  225.       IY0=ISHFT(MVDUVAR(129),MODEVAR(-1,5))
  226.       IY1=ISHFT(MVDUVAR(131),MODEVAR(-1,5))
  227.       CALL CLG
  228. C                   background and foreground colours
  229.       KOLB=0
  230.       KOLF=7
  231. C                         screen co-ordinates must be divisible by 4
  232. C      MASKX=?IFFFFFFFE
  233. C      MASKY=?IFFFFFFFE
  234.       MASKX=ISHFT(-1,MODEVAR(-1,4))
  235.       MASKY=ISHFT(-1,MODEVAR(-1,5))
  236. C             (IXL,IYL) to (IXR,IYR)  graph drawing area (rasters)
  237.       IXL=IX0+160
  238.       IXR=IX1-100
  239.       IYL=IY0+128
  240.       IYR=IY1-100
  241. C                   side of square marker (rasters)
  242.       KSQ=16
  243. C              position of numbers on X axis relative to tick line
  244.       IUXAXT=  40
  245.       IUYAXT=  IYL-32
  246. C                  and on Y axis
  247.       IUXAYT=  IX0+48
  248.       IUYAYT=  12
  249. C                  amounts to left for short and long Y tick marks
  250.       LYTS= 16
  251.       LYTL= 28                                                  
  252. C             amount to right where Y marks stop
  253.       LYR=  8
  254. C            amounts below X axis for short and long tickmarks 
  255.       LXTS= 16
  256.       LXTL= 28                                                
  257. C              amount above X axis where all marks stop
  258.       LXHI = 8
  259. C               position of X axis text centre of IXl,IXR
  260.       IXAXT= IX0+(IXR-IXL) *0.5
  261.       IYAXT= IYL-64
  262. C              position of Y axis text relative to IXL,IYR
  263.       IXAYT= 80
  264.       IYAYT= 64
  265. C               relative position of exponent same for X and Y
  266.       ISUPX= +16
  267.       ISUPY= +16
  268.       RETURN
  269.       END
  270. C
  271.       FUNCTION ISCRN(Z,N,I)
  272. C converts user variable Z into a screen variable, N= power of 10
  273. C      I=1 for X, =2 for Y 
  274.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  275.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  276.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  277.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  278. C                    MASKX,MAXY are MODE dependent, set by routine SCALE
  279.       XY=Z
  280.       IF(N.NE.0)XY=XY*(10.0**N)
  281.       IF(I.EQ.1) ISCRN=IAND(IXL+INT((XY-XMIN)*SCALEX),MASKX)
  282.       IF(I.EQ.2) ISCRN=IAND(IYL+INT((XY-YMIN)*SCALEY),MASKY)
  283.       RETURN
  284.       END
  285. C
  286.       SUBROUTINE OUTINT(IX,IY,N)
  287. C             writes out an integer on screen
  288.       CHARACTER *10 WORK
  289.       WRITE(WORK,101)N
  290.   101 FORMAT(I4)
  291.       CALL WOG(IX,IY,WORK) 
  292.       RETURN
  293.       END
  294. C
  295.       SUBROUTINE OUTNUM(IX,IY,X)
  296. C                          outputs a floating point number to the screen
  297.       CHARACTER * 10 WORK
  298. C                       is there a format to write out leading zeros?
  299.       IF(X.GE.1.0)THEN
  300.         WRITE(WORK,101)X
  301.       ELSE
  302.         IF(X.GE.0.0)THEN
  303.           WRITE(WORK,102)X
  304.         ELSE
  305.           IF(X.GT.-1.0)THEN
  306.             WRITE(WORK,104)-X
  307.           ELSE
  308.             WRITE(WORK,103)-X   
  309.           ENDIF
  310.         ENDIF
  311.       ENDIF
  312.       CALL WOG(IX,IY,WORK)
  313.       RETURN              
  314.   101 FORMAT(1X,    F4.2)
  315.   102 FORMAT(1X,'0',F3.2)
  316.   103 FORMAT(       F4.2)
  317.   104 FORMAT(  '-0',F3.2)
  318.       END
  319. C
  320.       FUNCTION ROUND(X,IC)
  321.       T=10.0*ABS(X)+FLOAT(IC)-0.5
  322.       ROUND=SIGN(1.0,X)*FLOAT(INT(T))*0.1
  323.       RETURN
  324.       END
  325. C
  326.       SUBROUTINE SCALE(X,Y,N)
  327.       REAL X(*),Y(*)
  328.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  329.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  330.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  331.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  332. C                         set up constants for scaling to screen
  333.       CALL INIT
  334. C                          find Max and min in user data
  335.       XMIN=9999999.999
  336.       XMAX=-XMIN
  337.       YMIN=XMIN
  338.       YMAX=-YMIN
  339.       DO 10 I=1,N
  340.         Z=X(I)
  341.        IF (Z.LT.XMIN) XMIN=X(I)
  342.        IF (Z.GT.XMAX) XMAX=X(I)
  343.        Z=Y(I)
  344.        IF (Z.LT.YMIN) YMIN=Y(I)
  345.        IF (Z.GT.YMAX) YMAX=Y(I)
  346.    10 CONTINUE
  347.       Z=(XMIN+XMAX)*0.5
  348.       ZC=(XMAX-XMIN)*0.5
  349.       XMIN=Z-1.05*ZC
  350.       XMAX=Z+1.05*ZC
  351.       Z=(YMIN+YMAX)*0.5
  352.       ZC=(YMAX-YMIN)*0.5
  353.       YMIN=Z-1.05*ZC
  354.       YMAX=Z+1.05*ZC
  355.       SCALEX=FLOAT(IXR-IXL)/(XMAX-XMIN)
  356.       SCALEY=FLOAT(IYR-IYL)/(YMAX-YMIN)
  357.       RETURN
  358.       END
  359. C
  360.       SUBROUTINE SCRNSV
  361. C              saves the screen somehow for later printing, Drawfile?
  362.       RETURN
  363.       END
  364. C
  365.       CHARACTER*1 FUNCTION UPCASE(CHR)
  366. C                   converts the character in CHR to upper case
  367.       CHARACTER CHR*1
  368.       UPCASE=CHR
  369.       IF (CHR.GE.'a')  UPCASE=CHAR(ICHAR(CHR)-32)
  370.       RETURN
  371.       END
  372. C
  373.       SUBROUTINE XTICKS(X1,X2,N)
  374. C        puts tick marks and numbers on the X axis between minimum at X1 and
  375. C         max at X2. N=exponent of the X1 and X2          
  376.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  377.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  378.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  379.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  380. C             try 8 ticklines
  381.       NT=8
  382. C          decide on spacing assume X2 > X1
  383. C          DELTA finds a 'nice' one, returned in D
  384. C          also returns NMIN no of minor tickmarks to be inserted within D
  385.       CALL DELTA(X2-X1,NT,D,NMIN)
  386. C                   find NP, how many to do
  387.       NP=2+INT((X2-X1)/D)
  388.       X=X1-D
  389. C                for -ve values start at next higher point?
  390. C      IF(X1.LT.0)X=X+D
  391.       IYP=IYL-LXTL
  392.       IYQ=IYL+LXHI
  393. C                  Y values for major and minor tick lines
  394.       MYP=IYL-LXTS
  395.       MYQ=IYL+LXHI
  396. C           CX is spacing of the minor tickmarks
  397.       CX=D/FLOAT(NMIN+1)
  398.       DO 20 I=1,NP
  399.         X=X+D         
  400.         IF(X.GT.X2)GOTO20
  401. C                     output the numbers as XTEMP rounded
  402.         XTEMP=SIGN(1.,X)*INT(100.*ABS(X)+0.5)*0.01
  403.         IXP=ISCRN(X,N,1)
  404.         CALL OUTNUM(IXP-IUXAXT,IUYAXT,XTEMP)
  405. C                      output the major ticklines
  406.         CALL LINE(IXP,IYP,IXP,IYQ)
  407. C                      now the minor ticklines
  408.         DO 10 J=1,NMIN
  409.          IXP=ISCRN(X+J*CX,N,1)
  410.          IF(IXP.GT.IXR)GOTO20
  411.          CALL LINE(IXP,MYP,IXP,MYQ)
  412.    10   CONTINUE 
  413.    20 CONTINUE
  414.       CALL WOG(IXAXT,IYAXT,'X*10')
  415.       I=IXAXT+ISUPX
  416.       IF(N.LT.0)I=I+16
  417.       IF(N.NE.1)CALL OUTINT(I,IYAXT+ISUPY,N)
  418.       RETURN
  419.       END
  420. C
  421.       SUBROUTINE YTICKS(Y1,Y2,N)
  422. C                plots ticklines and number for the Y axis
  423. C                between minimum at Y1 and Max at Y2
  424.       COMMON /GRAF/ IX0,IY0,IX1,IY1,IXL,IYL,IXR,IYR,
  425.      1 IUXAXT,IUYAXT,IUXAYT,IUYAYT,IXAXT,IYAXT,IXAYT,IYAYT,KSQ,
  426.      2 LXHI,LYR,LXTS,LXTL,LYTS,LYTL,ISUPX,ISUPY,
  427.      3 KOLB,KOLF,XMIN,YMIN,XMAX,YMAX,SCALEX,SCALEY,MASKX,MASKY
  428. C             try 16 ticklines
  429.       NT=16
  430. C          decide on spacing assume Y2 > Y1
  431. C          DELTA finds a 'nice' one, returned in D
  432. C          also returns NMIN no of minor tickmarks to be inserted within D
  433.       CALL DELTA(Y2-Y1,NT,D,NMIN)
  434. C                   find NP, how many to do
  435.       NP=2+INT((Y2-Y1)/D)
  436.       Y=Y1-D
  437. C      IF(Y1.LT.0)Y=Y+D   need this???
  438.       IXP=IXL-LYTL
  439.       IXQ=IXL+LYR
  440. C                  Y values for major and minor tick lines
  441.       MXP=IXL-LYTS
  442.       MXQ=IXL+LYR
  443. C           CY is spacing of the minor tickmarks
  444.       CY=D/FLOAT(NMIN+1)
  445.       DO 20 I=1,NP
  446.         Y=Y+D    
  447. C                     output the numbers as XTEMP rounded
  448.         YTEMP=SIGN(1.,Y)*INT(100.*ABS(Y)+0.5)*0.01
  449.         IYP=ISCRN(Y,N,2)
  450.         CALL OUTNUM(IUXAYT,IYP+IUYAYT,YTEMP)
  451. C                      output the major ticklines
  452.         CALL LINE(IXP,IYP,IXQ,IYP)
  453. C                      now the minor ticklines
  454.         DO 10 J=1,NMIN
  455.          IYP=ISCRN(Y+J*CY,N,2)
  456.          IF(IYP.GT.IYR)GOTO20
  457.          CALL LINE(MXP,IYP,MXQ,IYP)
  458.    10   CONTINUE 
  459.    20 CONTINUE
  460.  
  461. C                              label Y axix units
  462.       IYP=IYR+IYAYT
  463.       IXP=IXL-IXAYT
  464.       CALL WOG(IXP,IYP,'Y*10') 
  465.       I=IXP+ISUPX
  466.       IF(N.LT.0)I=I+16
  467.       IF(N.NE.1)CALL OUTINT(I,IYP+ISUPY,N)
  468.       RETURN
  469.       END
  470.