home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / decus / RB117 / plots.for < prev    next >
Text File  |  1995-05-28  |  15KB  |  558 lines

  1. C
  2. C
  3. C
  4. $STORAGE:2
  5. C
  6. C
  7. C
  8. C=======================================================================
  9. C
  10. C       These routine are from the PRO-350 library, and include
  11. C       all necessary to create screen plots
  12. C
  13. C=======================================================================
  14. C
  15. C
  16. C
  17.       SUBROUTINE PLTSCR(UNIT,TITLE,TLEN,TATTR,SUBT1,SUBT2)
  18. CC
  19. CC
  20. CC    Created on  :  June 16, 1987
  21. CC    Last Updated:  July 29, 1987
  22. CC    Written by  :  Bruce W. Roeckel
  23. CC
  24. CC    Description :  This routine will draw a bar chart, using the VT100
  25. CC                   graphic character set.  The screen is cleared from
  26. CC                   line six and the plot is drawn using the rest of the
  27. CC                   screen space.  The cursor is left at 'home' after
  28. CC                   everything is done.
  29. CC
  30. CC                   UNIT is the unit# of an opened file were the data
  31. CC                   resides.  If an error occurs during processing,
  32. CC                   this variable will be set to -99.  The format the
  33. CC                   data in the file should be in is:
  34. CC
  35. CC                           Format of data is: F12,F12,1X,A1,A1
  36. CC                                               ^   ^      ^  ^
  37. CC                                               |   |      |  |
  38. CC                                  Data Point 1 '   |      |  |
  39. CC                                  Data Point 2 ----'      |  |
  40. CC                                  Horiz Axis Char's ------'--'
  41. CC
  42. CC                   TITLE is a 40 character variable that defines the
  43. CC                   plots title.
  44. CC
  45. CC                   TLEN is the number of characters that make up the
  46. CC                   titles actual length passed.
  47. CC
  48. CC                   TATTR is a code indicating the character attributes
  49. CC                   to use when drawing the title.
  50. CC
  51. CC
  52. CC                                0 = Normal Characters
  53. CC                                1 = inverse video
  54. CC                                2 = bold
  55. CC                                3 = blink
  56. CC                                4 = inverse video, bold
  57. CC                                5 = inverse video, blink
  58. CC                                6 = bold, blink
  59. CC                                7 = inverse video, bold, blink
  60. CC
  61. CC
  62. CC                   SUBT1 is the subtitle, or description, of data point
  63. CC                   number 1.  It is 8 characters max.
  64. CC
  65. CC                   SUBT2 is the subtitle, or description, of data point
  66. CC                   number 2.  It is 8 characters max.
  67. CC
  68. CC
  69. CC    Update #    Name       Date          Comments
  70. CC    --------  ---------  --------  ----------------------------------
  71. CC      001     Roeckel    07/29/87  Added Average Line to Plot
  72. CC
  73. CC
  74.       IMPLICIT INTEGER (A-Z)
  75.  
  76.       CHARACTER*1 TLC,TRC,VLINE(80),BLNK(80)
  77.       CHARACTER RELOC*11,FMT1*40,TITLE*40,SUBT1*8,SUBT2*8
  78.  
  79.       REAL PDATA(68),MIN,MAX,AVE,INC
  80.       CHARACTER*1 H1(34),H2(34)
  81. C
  82. C         READ DATA FROM FILE, CHECK FOR ERROR CONDITION
  83. C
  84.       CALL PLTDAT(UNIT,PDATA,H1,H2,IDATA,MIN,MAX,AVE,INC,OLAY)
  85.       IF(UNIT.LE.0) GOTO 900
  86. C
  87. C         ALL DATA READ IN O.K., SO GO AHEAD AND
  88. C         MOVE LINE DRAWING CHARACTER SET INTO "G1", AND PRELOAD DATA
  89. C
  90.       LUN=0
  91.       CALL GCHAR(LUN)
  92.  
  93.       DO 50 K=1,80
  94.       BLNK(K)=' '
  95.       VLINE(K)='q'
  96.    50 CONTINUE
  97. C
  98. C         BASED ON HOW MUCH DATA WAS READ IN, FIQURE OUT HOW WIDE THE
  99. C         BARS SHOULD BE, AS WELL AS HOW FAR APART FROM ONE ANOTHER
  100. C
  101.       IF(IDATA.GT.22) THEN
  102.          IWIDE=1
  103.          ISKIP=2
  104.          ITICK=0
  105.       ELSEIF(IDATA.GT.11) THEN
  106.          IWIDE=2
  107.          ISKIP=3
  108.          ITICK=1
  109.       ELSE
  110.          IWIDE=3
  111.          ISKIP=6
  112.          ITICK=1
  113.       ENDIF
  114. C
  115. C         LETS SHOW SOME SCREEN ACTIVITY AND DRAW GRAPH BOUNDARY
  116. C
  117.       HEIGHT=17
  118.       WIDTH=72
  119.       HORZ=6
  120.       VERT=6
  121.       BXATTR=0
  122.       IF(TATTR.LT.0 .OR. TATTR.GT.7) THEN
  123.          TATT2=10
  124.       ELSE
  125.          TATT2=TATTR+10
  126.       ENDIF
  127.       CALL BOLD
  128.       CALL BOX(HEIGHT,WIDTH,HORZ,VERT,TITLE,TLEN,TATT2,BXATTR)
  129.       CALL UPTOP(1,6)
  130. C
  131. C         ADD THE VERTICAL SCALE NUMBERS AND VERTICAL REFERENCE LINES
  132. C
  133.       I=INT(MIN)
  134.       CALL GPHON(LUN)
  135.       CALL BOLD
  136.  
  137.       DO 100 IV=20,8,-2
  138.       CALL LOCATE(1,IV,RELOC)
  139.       WRITE(*,'(A11,I4,1X,A1)') RELOC,I,117
  140.       I = I + INT(INC*2.0)
  141.   100 CONTINUE
  142.       CALL OFF
  143.  
  144.       DO 150 IV=20,8,-2
  145.       CALL LOCATE(7,IV,RELOC)
  146.       WRITE(*,'(A11,70A1)') RELOC,(VLINE(L),L=1,70)
  147.   150 CONTINUE
  148.  
  149.       IV=22-NINT(AVE)
  150.       CALL LOCATE(7,IV,RELOC)
  151.       CALL BOLD
  152.       WRITE(*,'(A11,69A1,A3)') RELOC,(VLINE(L),L=1,69),'AVE'
  153.       CALL OFF
  154.       CALL GPHOFF(LUN)
  155. C
  156. C         BASED UPON HOW MUCH DATA WAS ENTERED AND HOW WIDE EACH BAR
  157. C         WILL BE, CENTER THE GRAPH IN THE MIDDLE OF THE BOX.
  158. C
  159.       HORZ = 8 + ((68 - (ISKIP*IDATA))/2)
  160. C
  161. C         START DISPLAYING EACH DATA POINT ............................
  162. C         THE FIRST 34 ENTRIES IN THE ARRAY 'PDATA' ARE THE OVERLAY
  163. C         DATAPOINTS AND WILL BE DISPLAYED USING A HOLLOW BAR.
  164. C         THE REMAINING 34 ENTRIES (35-68) ARE THE BASE POINTS
  165. C         AND THEY WILL BE DISPLAYED AS A SOLID BAR.
  166. C
  167. C         IF OVERLAY DATA WAS FOUND, THEN DRAW THAT STUFF FIRST
  168. C
  169.       IF(OLAY.EQ.1) THEN
  170.  
  171.          IH=HORZ-1
  172.          CALL BOLD
  173.          CALL GPHON(LUN)
  174.          WRITE(FMT1,'(A8,I2.2,A5)') '(A11,A1,',IWIDE,'X,A1)'
  175.  
  176.          DO 600 K=1,IDATA
  177.          HEIGHT=NINT(PDATA(K))
  178.          IF(HEIGHT.LE.0) THEN
  179.             OLDTOP=0
  180.             IH=IH+ISKIP
  181.             GOTO 600
  182.          ENDIF
  183.          IV=22-HEIGHT
  184. C
  185. C          ... BASED UPON THE WIDTH AND SEPERATION OF EACH BAR,
  186. C              DEFINE THE GRAPHICS CHARACTERS TO BE USED
  187. C
  188.          IF(ISKIP.LT.4 .AND. K.GT.1) THEN
  189.             IF(NINT(PDATA(K-1)).EQ.NINT(PDATA(K))) THEN
  190.                TLC='w'
  191.             ELSEIF(NINT(PDATA(K-1)).GT.NINT(PDATA(K))) THEN
  192.                TLC='t'
  193.             ELSE
  194.                TLC='l'
  195.             ENDIF
  196.          ELSE
  197.             TLC='l'
  198.          ENDIF
  199.  
  200.          IF(ISKIP.LT.4 .AND. K.LT.IDATA) THEN
  201.             IF(NINT(PDATA(K+1)).EQ.NINT(PDATA(K))) THEN
  202.                TRC='w'
  203.             ELSEIF(NINT(PDATA(K+1)).GT.NINT(PDATA(K))) THEN
  204.                TRC='u'
  205.             ELSE
  206.                TRC='k'
  207.             ENDIF
  208.          ELSE
  209.             TRC='k'
  210.          ENDIF
  211. C
  212. C          ... STARTING AT THE LEFT HAND CORNER, DRAW THE TOP
  213. C
  214.          CALL LOCATE(IH,IV,RELOC)
  215.          WRITE(*,300) RELOC,TLC,(VLINE(L),L=1,IWIDE),TRC
  216.   300    FORMAT(A11,80A1,$)
  217. C
  218. C          ... NOW START DOWN THE SIDES
  219. C
  220.          DO 400 I=1,HEIGHT-1
  221.          CALL LOCATE(IH,IV+I,RELOC)
  222.          IF(ISKIP.LT.4 .AND. K.GT.1) THEN
  223.             IF(NINT(PDATA(K-1)).LT.NINT(PDATA(K))
  224.      A      .AND. (IV+I).EQ.OLDTOP) THEN
  225.                WRITE(*,FMT1) RELOC,'u','x'
  226.             ELSE
  227.                WRITE(*,FMT1) RELOC,'x','x'
  228.             ENDIF
  229.          ELSE
  230.             WRITE(*,FMT1) RELOC,'x','x'
  231.          ENDIF
  232.   400    CONTINUE
  233. C
  234. C        .... AND FINALLY DRAW THE BOTTOM
  235. C
  236.          CALL LOCATE(IH,IV+HEIGHT,RELOC)
  237.          WRITE(*,300) RELOC,'v',(VLINE(L),L=1,IWIDE),'v'
  238.  
  239.          OLDTOP=IV
  240.          IH=IH+ISKIP
  241.   600    CONTINUE
  242.  
  243.          CALL GPHOFF(LUN)
  244.          CALL OFF
  245.  
  246.       ENDIF
  247. C
  248. C           NOW GO AHEAD AND DRAW THE SOLID BAR INFO
  249. C
  250.       CALL UPTOP(1,6)
  251.       IV=0
  252.       IH=HORZ
  253.       WRITE(FMT1,'(A11,I2.2,A9)') '(A11,A1,A4,',IWIDE,'A1,A1,A2)'
  254.  
  255.       DO 750 K=35,IDATA+34
  256.       HEIGHT=NINT(PDATA(K))
  257.       IF(HEIGHT.LE.0) THEN
  258.           IH=IH+ISKIP
  259.           GOTO 750
  260.       ENDIF
  261.       IV=22-HEIGHT
  262.  
  263.          DO 700 I=1,HEIGHT
  264.          CALL LOCATE(IH,IV+I-1,RELOC)
  265.          WRITE(*,FMT1) RELOC,155,'1;7m',(BLNK(L),L=1,IWIDE),155,'0m'
  266.   700    CONTINUE
  267.  
  268.       IH=IH+ISKIP
  269.   750 CONTINUE
  270.       CALL UPTOP(1,6)
  271. C
  272. C         NOW DRAW THE HORIZONTAL LABELS
  273. C
  274.       IH=HORZ+ITICK
  275.       CALL GPHON(LUN)
  276.       CALL BOLD
  277.  
  278.       DO 800 I=1,IDATA
  279.       CALL LOCATE(IH,22,RELOC)
  280.       WRITE(*,'(A11,A1)') RELOC,'w'
  281.       IH=IH+ISKIP
  282.   800 CONTINUE
  283.       CALL GPHOFF(LUN)
  284.  
  285.       IH=HORZ+ITICK
  286.       DO 850 I=1,IDATA
  287.       CALL LOCATE(IH-1,23,RELOC)
  288.       WRITE(*,'(A11,2A1)') RELOC,H1(I),H2(I)
  289.       IH=IH+ISKIP
  290.   850 CONTINUE
  291.       CALL OFF
  292. C
  293. C          NOW DRAW THE REFERENCE KEY, USING THE POINT SUBTITLES.
  294. C
  295.       CALL PLTKEY(PDATA,IDATA,HORZ,OLAY,ISKIP,SUBT1,SUBT2)
  296.       CALL UPTOP(1,6)
  297.  
  298.   900 CONTINUE
  299.       RETURN
  300.       END
  301. C
  302. C
  303. C
  304.       SUBROUTINE PLTKEY(PDATA,IDATA,FIRST,OLAY,SKIP,SUBT1,SUBT2)
  305. CC
  306. CC        Plotting Subroutine
  307. CC
  308. CC           This routine will locate a clear spot in the
  309. CC           plot area and draw the reference 'key'
  310. CC
  311. CC
  312.       IMPLICIT INTEGER (A-Z)
  313.       REAL PDATA(68),PONE,PTWO
  314.       CHARACTER TITLE*40,RELOC*11
  315.       CHARACTER*8 SUBT1,SUBT2
  316. C
  317. C        FIND A 4X16 AREA OF THE PLOT TO DRAW THE KEY SO
  318. C        AS NOT TO DISTURB ANY DATA
  319. C
  320. C        .... FIRST, LOAD VARIABLES BASED ON WERE FIRST BAR WAS PLOTTED
  321. C
  322.       I=1
  323.       HORZ=8
  324.       VERT=9
  325.       LNUM=FIRST-8
  326. C
  327. C        .... IF THE BARS ARE LESS THEN HALF WAY UP THE SCALE
  328. C             THEN WE COULD PLACE THE KEY ABOVE THEM
  329. C
  330.   100 CONTINUE
  331.       PONE=PDATA(I)
  332.       PTWO=PDATA(I+34)
  333.       IF(OLAY.EQ.0) PONE=PTWO
  334.       IF(PONE.LT.7.0 .AND. PTWO.LT.7.0) THEN
  335.          IF(LNUM.LE.0) HORZ=FIRST + (I-1)*SKIP
  336.          LNUM=LNUM+SKIP
  337.          IF(LNUM.GE.16) GOTO 200
  338.       ELSE
  339.          LNUM=0
  340.       ENDIF
  341.       I=I+1
  342.       IF(I.LE.IDATA) GOTO 100
  343. C
  344. C        .... IF WE HAVENT FOUND A SPOT AFTER SEARCHING ALL POINTS
  345. C             THEN LETS FIND A SPOT TO DRAW OVER THE BARS
  346. C
  347.       I=1
  348.       HORZ=8
  349.       VERT=17
  350.       LNUM=FIRST-8
  351. C
  352. C        .... IF THE DATA IS MORE THAN HALF WAY UP THE PLOT,
  353. C             THEN WE CAN DRAW THE KEY OVER THE BOTTOM OF THE BARS
  354. C
  355.   150 CONTINUE
  356.       PONE=PDATA(I)
  357.       PTWO=PDATA(I+34)
  358.       IF(OLAY.EQ.0) PONE=PTWO
  359.       IF(PONE.GT.7.0 .AND. PTWO.GT.7.0) THEN
  360.          IF(LNUM.LE.0) HORZ=FIRST + (I-1)*SKIP
  361.          LNUM=LNUM+SKIP
  362.          IF(LNUM.GE.16) GOTO 200
  363.       ELSE
  364.          LNUM=0
  365.       ENDIF
  366.       I=I+1
  367.       IF(I.LE.IDATA) GOTO 150
  368. C
  369. C        IF WE FELL THROUGH TO THIS SPOT, THAT MEANS WE COULD NOT
  370. C        FIND A GOOD PLACE.  DEFAULT TO THE LOWER RIGHT CORNER
  371. C
  372.        HORZ=60
  373.        VERT=17
  374. C
  375. C        NOW DRAW THE BOX FOR THE KEY
  376. C
  377.   200 CONTINUE
  378.       IF(HORZ.GT.60 .OR. HORZ.LT.8) HORZ=60
  379.       IF(VERT.GT.17 .OR. VERT.LT.8) VERT=17
  380.       HEIGHT=4
  381.       WIDTH=16
  382.       TITLE='Key'
  383.       TLEN=5
  384.       TATTR=2
  385.       BATTR=0
  386.       CALL BOLD
  387.       CALL BOX(HEIGHT,WIDTH,HORZ,VERT,TITLE,TLEN,TATTR,BATTR)
  388. C
  389. C        CLEAR OUT THE CENTER OF THE BOX
  390. C
  391.       LUN=0
  392.       CALL LOCATE(HORZ+1,VERT+1,RELOC)
  393.       WRITE(LUN,'(A11,A14)') RELOC,'              '
  394.       CALL LOCATE(HORZ+1,VERT+2,RELOC)
  395.       WRITE(LUN,'(A11,A14)') RELOC,'              '
  396. C
  397. C       DRAW THE GRAPH SYMBOLS AND LABELS INSIDE THE BOX
  398. C
  399.       IF(OLAY.EQ.1) THEN
  400.          CALL LOCATE(HORZ+2,VERT+1,RELOC)
  401.          CALL BOLD
  402.          CALL GPHON(LUN)
  403.             WRITE(LUN,'(A11,A3,\)') RELOC,'lqk'
  404.          CALL GPHOFF(LUN)
  405.          CALL OFF
  406.          CALL LOCATE(HORZ+6,VERT+1,RELOC)
  407.          WRITE(LUN,'(A11,A8,\)') RELOC,SUBT1
  408.       ENDIF
  409.  
  410.       CALL LOCATE(HORZ+3,VERT+2,RELOC)
  411.       WRITE(LUN,500) RELOC,155,'1;7m',' ',155,'0m',SUBT2
  412.   500 FORMAT(A11,A1,A4,A1,A1,A2,2X,A8,\)
  413.  
  414.       RETURN
  415.       END
  416. C
  417. C
  418. C
  419.       SUBROUTINE PLTDAT(UNIT,PDATA,H1,H2,IDATA,MIN,MAX,AVE,INC,OLAY)
  420. CC
  421. CC         Ploting Subroutine
  422. CC
  423. CC            This routine reads in the data from the file and
  424. CC            determines the minimum, maximum and average values.
  425. CC            In addition, the scale increment is also calculated.
  426. CC
  427. CC            UNIT ---- Unit # of opened file
  428. CC            PDATA --- Array (real, dim of 68) of data read in
  429. CC            H1,H2 --- Horizontal Scale Labels (char*1, DIM 34)
  430. CC            IDATA --- # of data points read in
  431. CC            MIN ----- Minimum value of all data points
  432. CC            MAX ----- Maximum value of all data points
  433. CC            AVE ----- Average of all data points
  434. CC            INC ----- Vertical Scale increment
  435. CC            OLAY ---- Switch indicating if overlay data was found
  436. CC
  437.       IMPLICIT INTEGER (A-Z)
  438.       CHARACTER*1 H1(34),H2(34)
  439.       REAL PDATA(68),MIN,MAX,AVE,INC,TTL,VALINC(20)
  440.  
  441.       DATA VALINC/1.0,2.0,5.0,10.0,15.0,20.0,25.0,50.0,75.0,100.0,
  442.      A            150.0,200.0,250.0,300.0,350.0,400.0,450.0,500.0,
  443.      A            550.0,600.0/
  444.  
  445. C   *************************   START PROCESSING   ********************
  446. C
  447. C         READ IN DATA, ABORT IF ERROR OCCURS
  448. C
  449.       I=0
  450.       OLAY=0
  451.       REWIND UNIT
  452.   100 CONTINUE
  453.          I=I+1
  454.          IF(I.GT.34) GOTO 200
  455.          READ(UNIT,150,END=200,ERR=175) PDATA(I),PDATA(I+34),
  456.      A                                  H1(I),H2(I)
  457.   150    FORMAT(F12.0,F12.0,1X,A1,A1)
  458.          IF(PDATA(I).GT.0.0) OLAY=1
  459.       GOTO 100
  460. C
  461. C          IF READ ERROR OCCURS, RETURN WITH FLAG SET
  462. C
  463.   175 CONTINUE
  464.       UNIT=-99
  465.       GOTO 900
  466. C
  467. C         IF NO READ ERROR THEN CHECK FOR DATA BOUNDS, RETURN IF ERROR
  468. C
  469.   200 CONTINUE
  470.       IDATA=I-1
  471.       IF(IDATA.LE.0) THEN
  472.          UNIT=-99
  473.          GOTO 900
  474.       ENDIF
  475. C
  476. C         FIND THE AVERAGE, MINIMUM AND MAXIMUM VALUES OF THE DATA
  477. C
  478.       TTL=0.0
  479.       AVE=0.0
  480.       MAX=0.0
  481.       MIN=9999.0
  482.  
  483.       DO 300 I=1,IDATA
  484.       TTL=TTL+PDATA(I)+PDATA(I+34)
  485.       IF(PDATA(I).GT.MAX) MAX=PDATA(I)
  486.       IF(PDATA(I+34).GT.MAX) MAX=PDATA(I+34)
  487.       IF(PDATA(I).NE.0.0 .AND. PDATA(I).LT.MIN) MIN=PDATA(I)
  488.       IF(PDATA(I+34).NE.0.0 .AND. PDATA(I+34).LT.MIN) MIN=PDATA(I+34)
  489.   300 CONTINUE
  490.       IF(OLAY.EQ.1) THEN
  491.          AVE=TTL/REAL(IDATA*2)
  492.       ELSE
  493.          AVE=TTL/REAL(IDATA)
  494.       ENDIF
  495. C
  496. C          CHECK FOR DATA VALIDITY
  497. C
  498.       IF((MAX.LE.0.0) .OR. (MIN.GE.9999.0)) THEN
  499.          UNIT=-99
  500.          GOTO 900
  501.       ENDIF
  502. C
  503. C          CALCULATE THE VERTICAL INCREMENTS BY DIVIDING THE MAXIMUM VALUE
  504. C          BY 12 (THE NUMBER OF AVAILABLE TICKS) AND THEN MOVING TO THE NEXT
  505. C          HIGHEST WHOLE NUMBER (I.E. CHECK FOR REMAINDER) I KNOW THERE MUST
  506. C          BE A SIMPLER WAY TO DO THIS, BUT THIS WORKS.
  507. C
  508.       INC = (MAX-MIN) / 12.0
  509.       TTL = INC - INT(INC)
  510.       IF(TTL.GT.0) THEN
  511.          INC = INT(INC) + 1.0
  512.       ELSE
  513.          INC = INT(INC)
  514.       ENDIF
  515. C
  516. C         FIND THE CLOSEST 'VALID' INCREMENT IN TABLE
  517. C         IF VALID INCREMENTS ARE NOT BIG ENOUGH, CALCULATE ONE
  518. C
  519.       DO 400 I=1,20
  520.       IF(INC.LE.VALINC(I)) THEN
  521.          INC = VALINC(I)
  522.          GOTO 500
  523.       ENDIF
  524.   400 CONTINUE
  525.  
  526.   450 CONTINUE
  527.       IF(MAX.GT.(12.0*INC)) THEN
  528.          INC = INC + 50.0
  529.          GOTO 450
  530.       ENDIF
  531. C
  532. C          SCALE DOWN THE DATA TO FIT THE BOUNDS OF THE SCREEN
  533. C          SINCE I WILL MAKE THE MINIMUM VALUE BE THE FIRST
  534. C          VERTICAL TICK MARK, ADD TWO TO ALL VALUES
  535. C
  536.   500 CONTINUE
  537.       MAX=((MAX-MIN)/INC) + 2.0
  538.       AVE=((AVE-MIN)/INC) + 2.0
  539. C
  540.       DO 600 J=1,IDATA
  541.       IF(PDATA(J).GE.MIN) THEN
  542.          PDATA(J) = ((PDATA(J)-MIN) / INC) + 2.0
  543.       ELSE
  544.          PDATA(J)=0.0
  545.       ENDIF
  546.       IF(PDATA(J+34).GE.MIN) THEN
  547.          PDATA(J+34) = ((PDATA(J+34)-MIN) / INC) + 2.0
  548.       ELSE
  549.          PDATA(J+34)=0.0
  550.       ENDIF
  551.   600 CONTINUE
  552. C
  553. C        THAT ALL FOR NOW FOLKS !!!
  554. C
  555.   900 CONTINUE
  556.       RETURN
  557.       END
  558.