home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug091.ark / PLOT.FOR < prev    next >
Encoding:
Text File  |  1984-04-29  |  3.6 KB  |  143 lines

  1. C*********************************************************************
  2. C
  3. C Written by Victor De Pinto
  4. C Revised Jan. 25, 1982
  5. C
  6.       SUBROUTINE PLOT ( DAT )
  7. C
  8. C     This routine generates absolute moves. Full scale is unity in both
  9. C     x and y axes. It is up to the hardware-dependent draw routine
  10. C     to execute the moves. Point 0,0 is lower left.
  11. C
  12.       LOGICAL QFLG, DRWFLG, LOGFLG
  13.       DIMENSION DAT(2,1024)
  14.       DATA XSCALE / .0009775 /
  15. 1     WRITE (1,100)
  16. 100   FORMAT (' --PLOTTER MENU--  Select function:'/
  17.      X ' 1  PLOT REAL PART OF FILE '/
  18.      X ' 2  PLOT MAGNITUDE OF FILE (LINEAR) '/
  19.      X ' 3  PLOT MAGNITUDE OF FILE (LOGARITHMIC) '/
  20.      X ' 4  PLOT PHASE OF FILE '/
  21.      X ' 5  DRAW BORDER'/
  22.      X ' 6  DRAW GRID LINES'/
  23.      X ' 7  SET PLOTTER TIMING'/
  24.      X ' 8  BACK TO MAIN MENU >> ')
  25.       READ (1,111) J
  26. 111   FORMAT (I2)
  27.       GO TO (500,215,200,450,300,400,350,116),J
  28. 116   RETURN
  29. C
  30. C PLOT THE REAL PARTS OF A FILE.
  31. C
  32. 500   WRITE (1,501)
  33. 501   FORMAT (' This routine adds an offset to the real parts'/
  34.      X        ' of a file, then multiplies by a scale factor.'/
  35.      X        ' Full scale is 1.0'/
  36.      X        ' ENTER OFFSET <CR> SCALE:'/)
  37.       READ (1,506) FSET, SCALE
  38. 506   FORMAT (F10.0)
  39.       CALL READ (DAT)
  40. C First move does not draw.
  41.       DRWFLG = .FALSE.
  42. C Do the plot.
  43.       QFLG = .FALSE.
  44.       DO 520 N=0,1023
  45.       IF ( QFLG ) GO TO 520
  46.       Y = SCALE * ( DAT(1,N+1) + FSET )
  47.       X = N * XSCALE
  48.       CALL DRAW ( X, Y, DRWFLG )
  49.       DRWFLG = .TRUE.
  50.       CALL QCHEK ( QFLG )
  51. 520   CONTINUE
  52.       CALL HOME
  53.       GO TO 1
  54. C
  55. C Logarithmic magnitude plot.
  56. C
  57. 200   LOGFLG = .TRUE.
  58.       WRITE (1,205)
  59. 205   FORMAT (' 0 dB is full scale.'/
  60.      X        ' Enter bottom scale decibels. >> ')
  61.       READ (1,506) BOTDB
  62.       BOTDB = ABS( BOTDB )
  63.       GO TO 216
  64. C
  65. C Linear magnitude plot.
  66. C
  67. 215   LOGFLG = .FALSE.
  68. 216   WRITE (1,220)
  69. 220   FORMAT (' Enter the full scale magnitude. (This will be
  70.      X determined'/
  71.      X ' automatically if a negative number is entered.) >> '/)
  72.       READ (1,506) FSMAG
  73.       CALL READ (DAT)
  74.       IF ( FSMAG ) 250,250,265
  75. C     Determine full scale magnitude.
  76. 250   FSMAG = 0.0
  77.       DO 260 N=1,1024
  78.       T = DAT(1,N)**2 + DAT(2,N)**2
  79.       IF (T .GT. FSMAG) FSMAG = T
  80. 260   CONTINUE
  81.       FSMAG = SQRT( FSMAG )
  82. 265   YSCALE = 1.0 / FSMAG
  83.       DRWFLG = .FALSE.
  84. C Do the plot.
  85.       QFLG = .FALSE.
  86.       DO 280 N = 0,1023
  87.       IF ( QFLG ) GO TO 280
  88.       Y = YSCALE *  SQRT( DAT(1,N+1)**2 + DAT(2,N+1)**2 )
  89.       IF ( .NOT. LOGFLG ) GO TO 275
  90. C Convert to decibels only if log plot.
  91.       IF ( Y ) 267, 267, 270
  92. 267   DB = -600.0
  93.       GO TO 271
  94. 270   DB = 20.0 * ALOG10 (Y)
  95. 271   Y = ( DB + BOTDB ) / BOTDB
  96. C
  97. 275   X = N * XSCALE
  98.       CALL DRAW ( X, Y, DRWFLG )
  99.       DRWFLG = .TRUE.
  100.       CALL QCHEK ( QFLG )
  101. 280   CONTINUE
  102.       CALL HOME
  103.       GO TO 1
  104. C
  105. C Plot the phase of a file
  106. C
  107. 450   CALL READ ( DAT )
  108.       DRWFLG = .FALSE.
  109.       QFLG = .FALSE.
  110.       DO 480 N = 0,1023
  111.       IF ( QFLG ) GO TO 480
  112.       IF (N .EQ. 1) CALL PENDN
  113.       TMP1 = DAT(1,N+1)
  114.       TMP2 = DAT(2,N+1)
  115.       IF (TMP1 .NE. 0.0 .OR. TMP2 .NE. 0.0) GO TO 460
  116.       ANGLE = 0.0
  117.       GO TO 470
  118. 460   ANGLE = ATAN2 ( TMP2, TMP1 )
  119. 470   X = N * XSCALE
  120.       Y = 0.5 + ANGLE / 6.283
  121.       CALL DRAW ( X, Y, DRWFLG )
  122.       DRWFLG = .TRUE.
  123.       CALL QCHEK ( QFLG )
  124. 480   CONTINUE
  125.       CALL HOME
  126.       GO TO 1
  127. C
  128. C DRAW BORDER
  129. C
  130. 300   CALL BORDER
  131.       GO TO 1
  132. C
  133. C SET PLOTTER SPEED
  134. C
  135. 350   CALL SPEED
  136.       GO TO 1
  137. C
  138. C DRAW GRIDLINES
  139. C
  140. 400   CALL GRID
  141.       GO TO 1
  142.                     E N D
  143.