home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / P_FOTRAN.LZH / 68881 / CSDEMO.FOR < prev    next >
Text File  |  1987-12-31  |  5KB  |  188 lines

  1.       PROGRAM csdemo
  2.       
  3. *     Demonstration of get/set FPCR/FPSR procedures supplied with
  4. *     Prospero Fortran for GEM - MC68881 Floating-Point Coprocessor
  5. *     Library.
  6.       
  7. *     This program is intended to be linked with the libraries
  8. *     FIRST8.BIN and F77LIB8.BIN as per the supplied notes.
  9.        
  10. *     Author: A.T.Cook, 27 June 1988
  11.       
  12.       INCLUDE 'csr8'
  13.       
  14.       write (*,*) 'Pro Fortran CSDEMO Demonstration Program'
  15.       write (*,*) '========================================'
  16.       write (*,*) 
  17.       call FPCR_demo
  18.       write (*,*) 
  19.       call FPSR_demo
  20.       END
  21. !
  22. !
  23.       LOGICAL FUNCTION ovfl ()      !Return FPSR_overflow setting
  24.       
  25.       INCLUDE 'csr8'
  26.       INTEGER*4 fpsr, overflow_flag
  27.  
  28.       call getsr8 (fpsr)
  29.       overflow_flag = fpsr .AND. FPSR_overflow
  30.       ovfl = overflow_flag .NE. 0
  31.       END
  32. !         
  33. !
  34.       LOGICAL FUNCTION dz ()        !Return FPSR_divide_by_zero setting
  35.       
  36.       INCLUDE 'csr8'
  37.       INTEGER*4 fpsr, divzero_flag
  38.  
  39.       call getsr8 (fpsr)
  40.       divzero_flag = fpsr .AND. FPSR_divide_by_zero
  41.       dz = divzero_flag .NE. 0
  42.       END
  43. !
  44. !         
  45.       SUBROUTINE clear_ovfl      !Clear FPSR_overflow
  46.       
  47.       INCLUDE 'csr8'
  48.       INTEGER*4 fpsr, overflow_mask
  49.  
  50.       call getsr8 (fpsr)
  51.       overflow_mask = .NOT. FPSR_overflow
  52.       call setsr8 (fpsr .AND. overflow_mask)
  53.       END
  54. !
  55. !         
  56.       SUBROUTINE clear_dz        !Clear FPSR_divide_by_zero
  57.       
  58.       INCLUDE 'csr8'
  59.       INTEGER*4 fpsr, divzero_mask
  60.  
  61.       call getsr8 (fpsr)
  62.       divzero_mask = .NOT. FPSR_divide_by_zero
  63.       call setsr8 (fpsr .AND. divzero_mask)
  64.       END
  65. !
  66. !         
  67.       SUBROUTINE show_FPCR (title)       !Show current FPCR mode
  68. !                                         control byte
  69.       CHARACTER*(*) title
  70.  
  71.       INCLUDE 'csr8'
  72.       INTEGER FPCR_RND, FPCR_PREC
  73.  
  74.       PARAMETER (FPCR_RND  = $30,    !To mask off rounding mode field
  75.      1           FPCR_PREC = $C0)    !To mask off rounding precision
  76.                
  77.       INTEGER*4 fpcr, rounding, precision
  78.       
  79.       write (*,*) title
  80.       call getcr8 (fpcr)
  81.       write (*,100) 'FPCR Rounding Mode: '
  82.  
  83.       rounding = fpcr .AND. FPCR_RND
  84.       IF (rounding .EQ. FPCR_to_nearest) THEN 
  85.          write (*,100) 'to nearest'
  86.          ELSE IF (rounding .EQ. FPCR_toward_zero) THEN 
  87.          write (*,100) 'toward zero'
  88.          ELSE IF (rounding .EQ. FPCR_toward_minus_infinity) THEN 
  89.          write (*,100) 'toward minus infinity'
  90.          ELSE IF (rounding .EQ. FPCR_toward_plus_infinity) THEN 
  91.          write (*,100) 'toward plus infinity'
  92.       ENDIF
  93.       
  94.       write (*,100) ', Rounding precision: '
  95.  
  96.       precision = fpcr .AND. FPCR_PREC
  97.       IF (precision .EQ. FPCR_extended) THEN 
  98.          write (*,101) 'extended'
  99.          ELSE IF (precision .EQ. FPCR_extended) THEN 
  100.          write (*,101) 'extended'
  101.          ELSE IF (precision .EQ. FPCR_single) THEN 
  102.          write (*,101) 'single'
  103.          ELSE IF (precision .EQ. FPCR_double) THEN 
  104.          write (*,101) 'double'
  105.          ELSE
  106.          write (*,101) 'undefined !!!'
  107.       ENDIF
  108.  
  109.   100 FORMAT(1X,A,\)      
  110.   101 FORMAT(1X,A)
  111.       END
  112. !
  113. !         
  114.       SUBROUTINE show_FPSR (title)       !Show current FPSR
  115. !                                         accrued exceptions
  116.       CHARACTER*(*) title
  117.       INTEGER*4 fpsr
  118.       LOGICAL ovfl, dz
  119.  
  120.       INCLUDE 'csr8'
  121.       
  122.       write (*,*) title
  123.       call getsr8 (fpsr)
  124.       write (*,*) 'FPSR accrued exceptions: ',
  125.      1            'OVFL=',ovfl(), ', DZ=',dz()
  126.  
  127.       END
  128.                  
  129.       SUBROUTINE FPCR_demo
  130.       
  131.       INCLUDE 'csr8'
  132.       
  133.       write (*,*) 'Accessing the FPCR'
  134.       write (*,*) '=================='
  135.       write (*,*) 
  136.       
  137.       call show_FPCR ('Initial FPCR settings:-')
  138.               
  139. !     Now set the FPCR to other values and display them
  140.               
  141.       call setcr8 (FPCR_toward_minus_infinity + FPCR_double)
  142.       call show_FPCR ('Should be toward minus infinity and double:-')
  143.               
  144. !     Now set the FPCR back to normal
  145.               
  146.       call setcr8 (0)
  147.       call show_FPCR ('Should be to nearest and extended:-')
  148.               
  149.       END
  150. !
  151. !         
  152.       SUBROUTINE FPSR_demo
  153.       
  154.       INCLUDE 'csr8'
  155.  
  156.       REAL large_real, x, y, z
  157.       PARAMETER (large_real = 1.0E+30)
  158.  
  159.       write (*,*) 'Accessing the FPSR'
  160.       write (*,*) '=================='
  161.       write (*,*) 
  162.       
  163.       call show_FPSR ('Initial FPSR settings:-')
  164.               
  165. !     Now cause an overflow condition and detect it
  166.               
  167.       x = large_real
  168.       y = large_real
  169.       z = x * y
  170.       call show_FPSR ('Should show overflow:-')
  171.               
  172. !     Now cause a divide by zero and detect it, showing that the
  173. !     previous overflow condition is still set because the status
  174. !     is accrued}
  175.                
  176.       y = 0.0
  177.       z = x / y
  178.       call show_FPSR ('Should show overflow and divide by zero:-')
  179.               
  180. !     Now set the FPSR back to normal
  181.               
  182.       call setsr8 (0) !clear the accrued status bits
  183.       call show_FPSR ('Should have no status set:-')
  184.  
  185.       END
  186.          
  187.                                         
  188.