        subroutine mdxsub(a_cmd,i_maxbuff,readfunc)

          implicit none

          integer I_WKSPACE
          integer I_MAXCOLS
          integer I_MAXROWS
          integer I_MAXSAMP
          parameter(I_WKSPACE =  100000)
          parameter(I_MAXCOLS =  100000)
          parameter(I_MAXROWS =  100000)
          parameter(I_MAXSAMP =  100000)

          integer I_BMAX
          parameter(I_BMAX=200)     ! Maximum number of buffered commands

          integer I_EMAX
          parameter(I_EMAX=200)     ! Maximum number of buffered expose commands

          integer I_FMAX            ! Maximum number of data files
          parameter(I_FMAX= 6)

          integer I_CMAX            ! Maximum number of data channels
          parameter(I_CMAX=10)

          integer I_DMAX            ! Maximum number of displays
          parameter(I_DMAX=10)

          integer I_KMAX            ! Maximum number of color tables in pulldown menu
          parameter(I_KMAX=20)


c     INPUT VARIABLES:

          integer i_inarg
          character*255 a_inarg(255)


c     Some Useful Local Variables

          character*255 a_value
          character*255 a_title
          character*255 a_sss(I_CMAX)
          character*200 a_nullstr
          character*255 a_label
          character*255 a_command
          character*255 a_fmt
          character*(*) a_cmd

          character*255 a_workdir
          character*255 a_colordir

          character*20  a_colorname(I_KMAX)
          character*255 a_colorfile(I_KMAX)
          integer i_colormax
          integer i_colorset

          integer i
          integer j
          integer ix
          integer iy
          integer ib
          integer ie
          integer i_r
          integer i_c
          integer i_d
          integer ir
          integer ic

          integer i_arg
          integer i_row
          integer i_col
          integer i_typ

          integer i_tmp
          integer i_dat  ! Data file counter
          integer i_set  ! Set Counter
          integer i_chn
          integer i_sss
          integer i_pid
          integer i_opr
          integer i_pfmt
          integer i_pset
          integer i_sset
          integer i_tset

          integer i_loop
          integer i_flip
          integer i_stat
          integer i_dflag
          integer i_value
          integer i_field

          integer i_default

          byte b_buff(4)
          integer i_buff
          equivalence(b_buff,i_buff)

          integer i_endian

          integer i_cnt
          integer i_err
          integer i_flg
          integer i_pos
          integer i_max
          integer i_roff
          integer i_log
          integer i_dec

          real*4 r_data(0:I_MAXCOLS)
          real*4 r_data2(0:I_MAXCOLS)
          integer*4 i_data(0:I_MAXCOLS)
          integer*4 i_data2(0:I_MAXCOLS)
          real*8 r_sqr
          real*8 r_sum
          real*8 r_avg
          real*8 r_std
          real*4 r_zmstrt
          real*4 r_expn
          real*4 r_setmin
          real*4 r_setmax

          real*4 r_dnx(3)
          real*4 r_eux(3)
          real*4 r_loc(3)

          real*4 r_pi
          real*4 r_rtod

          real*4  r_a
          real*4  r_e2

          integer i_smode
          integer i_samps
          integer i_rsamps(I_MAXSAMP)
          integer i_csamps(I_MAXSAMP)
          integer i_tsamps(I_MAXSAMP)
          real*4  r_wsamps(I_MAXSAMP)
          real*4  r_ssamps(I_MAXSAMP)
          real*4  r_vsamps(I_MAXSAMP,I_CMAX)
          real*4  r_row(I_MAXSAMP)
          real*4  r_col(I_MAXSAMP)
          real*4  r_rowlow
          real*4  r_rowhigh
          real*4  r_collow
          real*4  r_colhigh
          real*4  r_path

          real*4 r_wdth
          real*4 r_spce
          real*4 r_dist

          integer ii
          integer jj
          integer iii
          integer i_cc
          integer i_rr
          integer i_clast
          integer i_rlast


c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
          character*200 a_setname(-I_FMAX:I_CMAX) ! Parameter name
          character*200 a_setfile(-I_FMAX:I_CMAX) ! Data filename
          character*200 a_setinfo(-I_FMAX:I_CMAX) ! Header filename
          character*200 a_setproj(-I_FMAX:I_CMAX) ! Projection name
          character*16  a_setvnul(-I_FMAX:I_CMAX) ! Hex string of null value
          integer i_setunit(-I_FMAX:I_CMAX) ! Unit number to read set
          integer i_setrows(-I_FMAX:I_CMAX) ! Number of rows in set
          integer i_setcols(-I_FMAX:I_CMAX) ! Number of columns in set
          integer i_setshdr(-I_FMAX:I_CMAX) ! Number of bytes in set header
          integer i_setstlr(-I_FMAX:I_CMAX) ! Number of bytes in set trailer
          integer i_setrhdr(-I_FMAX:I_CMAX) ! Number of bytes in row header
          integer i_setrtlr(-I_FMAX:I_CMAX) ! Number of bytes in row trailer
          integer i_setchdr(-I_FMAX:I_CMAX) ! Number of bytes in column header
          integer i_setctlr(-I_FMAX:I_CMAX) ! Number of bytes in column trailer
          integer i_setvend(-I_FMAX:I_CMAX) ! Endian flag
          integer i_setvfmt(-I_FMAX:I_CMAX) ! Method to decode columns
          real*4  r_setrmlt(-I_FMAX:I_CMAX) ! Row Scale  for set
          real*4  r_setradr(-I_FMAX:I_CMAX) ! Row Offset for set
          real*4  r_setcmlt(-I_FMAX:I_CMAX) ! Column Scale  for set
          real*4  r_setcadr(-I_FMAX:I_CMAX) ! Column Offset for set
          real*4  r_setvmlt(-I_FMAX:I_CMAX) ! Value Scale  for set
          real*4  r_setvadr(-I_FMAX:I_CMAX) ! Value Offset for set
          real*4  r_setvmin(-I_FMAX:I_CMAX) ! Minimum valid value
          real*4  r_setvmax(-I_FMAX:I_CMAX) ! Maximum valid value
          real*4  r_setvavg(-I_FMAX:I_CMAX) ! Average value in set
          real*4  r_setvstd(-I_FMAX:I_CMAX) ! Standard deviation of values in set
          real*4  r_setpegv(3,-I_FMAX:I_CMAX) ! Set Peg
          byte    b_setvnul(0:16,-I_FMAX:I_CMAX) ! Invalid value
c     end structure

          integer i_dsp
          integer i_dspselect
c     structure / dspinfo / s_dsp
          character*200 a_dspctbl(-I_FMAX:I_CMAX) ! Color table file
          integer i_dspcnt
          integer i_dspchnl         ! Number of sets to display
          integer i_dspaddr(-I_FMAX:I_CMAX) ! Add  auto Scale flag
          integer i_dspmult(-I_FMAX:I_CMAX) ! Mult auto Scale flag
          integer i_dspmixv(-I_FMAX:I_CMAX) ! Method to mix set (add, multiply, max, avg)
          integer i_dspnumt(-I_FMAX:I_CMAX) ! Number of entries in color table
          integer i_dspmode(-I_FMAX:I_CMAX)
          integer i_dspdvdc(-I_FMAX:I_CMAX)
          integer i_dspactv(0:I_DMAX,-I_CMAX:I_CMAX)
          real*4  r_dspredt(0:255,-I_FMAX:I_CMAX) ! Values of red color table
          real*4  r_dspgrnt(0:255,-I_FMAX:I_CMAX) ! Values of green color table
          real*4  r_dspblut(0:255,-I_FMAX:I_CMAX) ! Values of blue color table
          real*4  r_dspcplw(-I_FMAX:I_CMAX) ! Discard if below value
          real*4  r_dspcphi(-I_FMAX:I_CMAX) ! Discard if above value
          real*4  r_dspexpn(-I_FMAX:I_CMAX) ! Exponent to raise data
          real*4  r_dspaddr(-I_FMAX:I_CMAX) ! Shift data by value
          real*4  r_dspwrap(-I_FMAX:I_CMAX) ! Wrap data by value
          real*4  r_dspmult(-I_FMAX:I_CMAX) ! Multiply data by value
          real*4  r_dspvmin(-I_FMAX:I_CMAX) ! Min value to display
          real*4  r_dspvmax(-I_FMAX:I_CMAX) ! Max value to display
          real*4  r_dspval1(-I_FMAX:I_CMAX)
          real*4  r_dspval2(-I_FMAX:I_CMAX)
          real*4  r_dspval3(-I_FMAX:I_CMAX)
c     end structure

c     structure / dspinfo / s_win
          character*200 a_dsptitle(0:I_DMAX) ! Window title
          integer i_winactv(0:I_DMAX)
          integer i_winrows(0:I_DMAX) ! rows offset
          integer i_wincols(0:I_DMAX) ! sample offset
          integer i_wincadr(0:I_DMAX) ! column offset to start of window
          integer i_winradr(0:I_DMAX) ! row offset to start of window
          integer i_winselc(0:I_DMAX) ! Set active flag
          real*4  r_winzoom(0:I_DMAX) ! Zoom factor
c     end structure

          integer i_winx                ! initial window size on screen
          integer i_winy                ! initial window size on screen

          integer i_wxs(6,-10:10)   ! window x size
          integer i_wys(6,-10:10)   ! window y size
          integer i_vxs(6,-10:10)   ! viewport x size
          integer i_vys(6,-10:10)   ! viewport y size
          integer i_vxo(6,-10:10)   ! viewport x offset
          integer i_vyo(6,-10:10)   ! viewport y offset

          integer i_int
          integer i_bpl
          integer i_ncx
          integer i_nrx
          integer i_enrx2
          integer i_ponly
          integer i_indx(0:I_WKSPACE)
          real*4  r_rdat(0:I_WKSPACE)
          real*4  r_gdat(0:I_WKSPACE)
          real*4  r_bdat(0:I_WKSPACE)
c          save r_rdat, r_gdat,r_bdat

          character*255 a_file
          character*120 a_filename
          character*255 a_ptsfile
          character*120 a_label1
          character*120 a_label2
          character*160  a_labels(0:20)
          character*160  a_data(0:20)
          character*160  a_elabl(0:20)
          character*160  a_edata(0:20)
          character*120 a_nullclr
          character*120 a_lcolor
          integer*4     i_nullclr(3)
          integer*4     stat,i_stat32(13),i_err32

          integer*4 i_msgid
          character*160 a_message

          character*200 a_out
          byte b_out(3*I_WKSPACE)
          equivalence(a_out,b_out)

          real*4 r_value
          real*4 r_val(I_WKSPACE)

          integer i_w
          integer i_win
          integer i_evn

          integer i_val
          integer i_key
          integer i_asc

          integer i_act

          integer i_debug

          integer i_done
          integer i_wait
          integer i_cntl
          integer i_shft
          integer i_abort
          integer i_pinit
          integer i_scroll
          integer i_eventmod       ! number of lines read between X window event calls
          integer i_rcenter
          integer i_ccenter
          integer i_cpos
          integer i_rpos
          integer i_cdsp
          integer i_cset

          integer i_qubeset

          integer i_show
          integer i_region
          integer i_start
          integer i_newpoint

          integer i_event(0:10)
          integer i_button

          integer i_ecnt
          integer i_edat(0:10,I_EMAX) ! Expose Buffer data
          integer i_ecmd(0:10)

          integer i_bcnt
          integer i_bdat(0:10,I_BMAX) ! Action Buffer data
          integer i_brow           ! Number of lines in action
          integer i_blks            ! Number of blocks needed to complete action
          integer i_strt
          integer i_stop
          integer i_incr
          integer i_coff

          integer i_close

          integer i_redraw(I_DMAX)
          integer i_cw
          integer i_ch
          integer i_widget
          integer i_menu

          integer i_edsp
          integer i_ewin
          integer i_eevn
          integer i_ecol
          integer i_erow
          integer i_encx
          integer i_enrx

          integer i_lat
          integer i_lon
          integer i_str

          integer i_pcpad
          integer i_prpad

          character*10 a_rowfrmt
          character*10 a_colfrmt

          character*120 a_hdrfile
          integer i_lsize
          integer i_ssize
          real*8 r_peg(3)
          real*8 r_lat
          real*8 r_lon
          character*120 a_type
          real*8 r_str(2)
          real*8 r_spc(2)
          integer i_mbytes
          integer i_dbytes
          real r_mmul
          real r_madd
          real r_dmul
          real r_dadd

          real r_median
          real r_space

          integer i_ewupdate
          integer i_rstat
          byte b_data(0:3)

          character*20  a_tname(5)
          character*1   a_twait(5)
          character*120 a_tcmnd(5)

          character*120 a_clickcmd(6)


c     FUNCTIONS

          integer rdflen
          external rdflen

          character*40 rdflower
          external rdflower

          integer rdfnum
          external rdfnum

          integer initdk
          external initdk

          real*8 rdir
          external rdir

          real*4  wrap            ! Height wrap variables
          external wrap

          integer i_CnvrtFmt
          external i_CnvrtFmt

          integer i_setvbyt
          external i_setvbyt

          character*18 version_mdx
          external version_mdx

          integer version_gx
          external version_gx

#ifdef IO64
          integer*8 i_fbytes
          integer*8 i_maxbuff

          integer*8 readfunc
          external readfunc

          integer*8 i_getfsize
          external i_getfsize

          integer*8 i_eight
          external i_eight

#else
          integer*4 i_fbytes
          integer*4 i_maxbuff

          integer*4 readfunc
          external readfunc

          integer*4 i_getfsize
          external i_getfsize

          integer*4 i_eight
          external i_eight

#endif


c     PROCESSING STEPS:

c
c     Initialize pi and conversions
c
          r_pi = 4.d0*atan(1.0d0)
          r_rtod = 180.0d0/r_pi


c
c     Initialize datum stuff
c
          r_a =  6378137.0
          r_e2 = 0.00669438

c
c     Determine endian ness of machine
c
         b_buff(1) = 0
         b_buff(2) = 0
         b_buff(3) = 0
         b_buff(4) = 1
         if (i_buff .eq. 1) then   ! Big Endian
            i_endian = 1
         else                      ! Little Endian
            i_endian = -1
         end if


c     Note - The order that parameters get set is as follows:
c     1) Internal parameter initialization set at the top of the program
c     2) Parameters read in from the mdx.ini file in the local or home
c     directory
c     3) Parameters on command line prior to any file name specified
c     5) Parameters on command line prior to any specified set
c     6) Parameters read in from the implicit file header for a given
c     set
c     7) Parameters on command line following set specification
c
c     headers can also be explicitly identified on the command line and
c     will
c     be given priority indicated by their location in the command line.


c
c     Initialize set stuff
c

          a_setname(0) = ' '
          a_setfile(0) = ' '
          a_setinfo(0) = ' '
          a_setproj(0) = ' '
          i_setunit(0) = 0
          i_setrows(0) = 1000000
          i_setcols(0) = 0
          i_setshdr(0) = 0
          i_setstlr(0) = 0
          i_setrhdr(0) = 0
          i_setrtlr(0) = 0
          i_setchdr(0) = 0
          i_setctlr(0) = 0
          i_setvend(0) = i_endian
          i_setvfmt(0) = 4          ! REAL*4

          r_setrmlt(0) =  1.0
          r_setradr(0) =  0.0

          r_setcmlt(0) =  1.0
          r_setcadr(0) =  0.0

          r_setvmlt(0) =  1.0d0
          r_setvadr(0) =  0.0d0
          r_setvmin(0) = -1.0d27
          r_setvmax(0) =  1.0d27
          a_setvnul(0) = ' '

          a_filename = ' '

          a_labels(0) = 'Display Parameters'
          a_labels(1) = 'Scale Mode:'
          a_labels(2) = 'SDEV Factor:'
          a_labels(3) = 'Offset:'
          a_labels(4) = 'Exponent:'
          a_labels(5) = 'Min Valid:'
          a_labels(6) = 'Max Valid:'
          a_labels(7) = 'Min Clip:'
          a_labels(8) = 'Max Clip:'
          a_labels(9) = 'Color Table:'
          a_labels(10) = ' '

          a_data(0) = '0'
          a_data(1) = '1'
          a_data(2) = '2'
          a_data(3) = '3'
          a_data(4) = '4'
          a_data(5) = '5'
          a_data(6) = '6'
          a_data(7) = '7'
          a_data(8) = '8'
          a_data(9) = '9'
          a_data(10) = ' '

C
C     rjm: Initialize win column start and rol start
C          This is needed for "-P" print option
C          And, what the heck, initial i_data too.
C
         do i = 0,I_MAXCOLS
           i_data(i) = 0
           i_data2(i) = 0
         end do
         do i = 0,I_DMAX
            i_wincadr(i) = 0
            i_winradr(i) = 0
         end do

c
c     Initialize display stuff
c
          i_done = 0
          i_bcnt = 0
          i_ecnt = 0
          i_wait = 0                ! 0 = wait for event
          i_r = -1

          a_title = ' '
          i_dspchnl = 0             ! Number of channels
          i_winrows(0) = 0          ! Number of rows
          i_wincols(0) = 0          ! Number of columns
          r_winzoom(0) = 1.0        ! Print Zoom factor
          i_winx = 0
          i_winy = 0

          r_dspcplw(0) = -1.e27  ! Clip if below value
          r_dspcphi(0) =  1.e27  ! Clip if above value
          r_dspvmin(0) = -1.e27  ! Discard if below value
          r_dspvmax(0) =  1.e27  ! Discard if above value
          r_dspexpn(0) =  1.     ! raise data to pwr
          r_dspaddr(0) =  0.     ! Shift data by value
          r_dspwrap(0) =  0.     ! Wrap data by value
          r_dspmult(0) =  0.     ! Multiply data by value
          r_dspval1(0) =  2.0    ! Value used in computing auto scale
          r_dspval2(0) = 90.0    ! Value used in computing auto scale
          r_dspval3(0) =  1.0    ! Value used in computing auto scale
          i_dspaddr(0) =  1.     ! Flag to enable auto scale
          i_dspmult(0) =  1.     ! Flag to enable auto scale
          i_dspmixv(0) =  2      ! Method to mix sets (add, multiply, max, avg)
          i_dspmode(0) =  3      ! Autoscale to 90%
          i_dspdvdc(0) =  0
          a_dspctbl(0) = ' '     ! Default color table

          r_winzoom(1) = 1.0        ! Screen Zoom default

          i_menu = 1
          i_close = 1

          do i=1, I_DMAX
            i_dspactv(i,0) = -1
            do j=1,I_CMAX
              i_dspactv(i,-j) = -1
              i_dspactv(i, j) = -1
            end do
            i_redraw(i) = 0
          end do

          do i=0,20
            a_elabl(i) = ' '
            a_edata(i) = ' '
          end do

          a_nullclr='0,0,255'

          a_lcolor='white'

          i_abort=0
          i_debug = 2
          i_eventmod = 10
          i_scroll = 0
          i_pinit = 0
          i_ponly = 0
          i_pfmt = 1
          i_pset = 0
          i_sset = 0
          i_tset = 0
          i_cntl = 0
          i_shft = 0
          i_key = 0

          i_region = 0
          i_act = 0

          i_smode = 1
          r_wdth = 0.
          r_spce = 0.1
          i_samps = 0
          i_show = 0

          i_pcpad = 31
          i_prpad = 50

          i_cdsp = -1
          i_cset = 0

          i_qubeset = 0

          i_ccenter = 0
          i_rcenter = 0
          r_lat = -3*r_pi
          r_lon = -3*r_pi

          i_r = -2
          i_dspselect = 0

          i_ewupdate = 0

          do i=1,5
            a_tname(i)=' '
            a_twait(i)=' '
            a_tcmnd(i)=' '
          end do
          a_tname(1) = 'Plot Location'
          a_tname(2) = 'Plot Profile'

          a_workdir = './'
          a_colordir = './'

          a_ptsfile = ' '

          a_colorname(1) = 'Other'
          a_colorfile(1) = '?'
          a_colorname(2) = 'White'
          a_colorfile(2) = 'white'
          a_colorname(3) = 'Black'
          a_colorfile(3) = 'black'
          a_colorname(4) = 'Bitmap'
          a_colorfile(4) = 'bitmap'
          a_colorname(5) = 'Grey'
          a_colorfile(5) = 'grey'
          a_colorname(6) = 'Red'
          a_colorfile(6) = 'red'
          a_colorname(7) = 'Green'
          a_colorfile(7) = 'green'
          a_colorname(8) = 'Blue'
          a_colorfile(8) = 'blue'
          a_colorname(9) = 'CMY'
          a_colorfile(9) = 'cmy'
          a_colorname(10) = 'BGW'
          a_colorfile(10) = 'bgw'
          i_colormax=10

          do i=1,6
            a_clickcmd(i) = ' '
          end do

c
c     Read in MDX default file
c
          call get_mdxdefaults(a_tname,a_tcmnd,a_twait,a_nullclr,i_pcpad,i_prpad,r_winzoom,
     &          a_workdir,a_colordir,a_colorname,a_colorfile,i_colormax,i_close,a_clickcmd)

c
c     Read in command line
c
          call rdf_getfields(a_cmd,i_inarg,a_inarg)
          if (i_inarg .eq. 0) then
            return
          else
            i_arg = 0
            i_dat = 0
            i_set = 0
            i_chn = 0
            i_tmp = 0
            do while(i_arg .lt. i_inarg)
              i_arg=i_arg + 1
              a_value = a_inarg(i_arg)
              i_int=1
              do i=1,rdflen(a_value)
                if (index("1234567890",a_value(i:i)) .eq. 0) i_int=0
              end do
c              write(6,*) 'i_arg,a_value=',i_arg,' ',a_value(1:60)
              if (a_value .eq. ' ') then
                                ! error
              else if (a_value .eq. '-V') then
                write(6,*) '  '
                write(6,'(1x,a,a18,a)'     ) '   <<  mdx    Version  ',version_mdx(),        '  >>   '
                write(6,'(1x,a,f5.1,13x,a)') '   <<  graphx Version  ',float(version_gx()),'  >>   '
                write(6,*) '  '

              else if (a_value .eq. '-s' .or. a_value .eq. '-samples' .or.
     &              a_value .eq. '-cols' .or. a_value .eq. '-columns') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setcols(i_tmp)
              else if (i_int .eq. 1) then  ! also number of columns
                read(a_value,*) i_setcols(i_tmp)
              else if (a_value .eq. '-l' .or. a_value .eq. '-lines' .or.
     &              a_value .eq. '-rows') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setrows(i_tmp)
              else if (a_value .eq. '-col' .or. a_value .eq. '-c' .or. a_value .eq. '-cpos') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_ccenter
              else if (a_value .eq. '-row' .or. a_value .eq. '-r' .or. a_value .eq. '-rpos') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_rcenter
              else if (a_value .eq. '-lat' .or. a_value .eq. '-latitude') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_lat
                r_lat = r_lat/r_rtod
              else if (a_value .eq. '-lon' .or. a_value .eq. '-longitude') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_lon
                r_lon = r_lon/r_rtod
              else if (a_value .eq. '-shdr' .or. a_value .eq. '-set_hddr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setshdr(i_tmp)
              else if (a_value .eq. '-rhdr' .or. a_value .eq. '-row_hddr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setrhdr(i_tmp)
              else if (a_value .eq. '-chdr' .or. a_value .eq. '-col_hddr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setchdr(i_tmp)
              else if (a_value .eq. '-stlr' .or. a_value .eq. '-set_tail') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setstlr(i_tmp)
              else if (a_value .eq. '-rtlr' .or. a_value .eq. '-row_tail') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setrtlr(i_tmp)
              else if (a_value .eq. '-ctlr' .or. a_value .eq. '-col_tail') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_setctlr(i_tmp)
              else if (a_value .eq. '-vfmt' .or. a_value .eq. '-val_frmt') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                if (i_CnvrtFmt(a_value) .gt. 0) then
                  i_setvfmt(i_tmp) = i_CnvrtFmt(a_value)
                else
                  write(6,*) '*** Warning ***  Could not parse value format for set: ',
     &                a_setname(i_tmp)(1:max(1,rdflen(a_setname(i_tmp)))),
     &                '   ',a_value
                end if
              else if (a_value .eq. '-rmlt' .or. a_value .eq. '-row_mult') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setrmlt(i_tmp)
              else if (a_value .eq. '-radr' .or. a_value .eq. '-row_addr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setradr(i_tmp)
              else if (a_value .eq. '-cmlt' .or. a_value .eq. '-col_mult') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setcmlt(i_tmp)
              else if (a_value .eq. '-cadr' .or. a_value .eq. '-col_addr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setcadr(i_tmp)
              else if (a_value .eq. '-vmlt' .or. a_value .eq. '-val_mult') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setvmlt(i_tmp)
              else if (a_value .eq. '-vadr' .or. a_value .eq. '-val_addr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setvadr(i_tmp)
              else if (a_value .eq. '-plat' .or. a_value .eq. '-set_plat') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setpegv(1,i_tmp)
              else if (a_value .eq. '-plon' .or. a_value .eq. '-set_plon') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setpegv(2,i_tmp)
              else if (a_value .eq. '-phdg' .or. a_value .eq. '-set_phdg') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setpegv(3,i_tmp)
              else if (a_value .eq. '-proj' .or. a_value .eq. '-set_proj') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) a_setproj(i_tmp)
              else if (a_value .eq. '-min' .or. a_value .eq. '-vmin' .or. a_value .eq. '-minval' .or. a_value .eq. '-val_minv')
     &              then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setvmin(i_tmp)
              else if (a_value .eq. '-max' .or. a_value .eq. '-vmax' .or. a_value .eq. '-maxval' .or. a_value .eq. '-val_maxv')
     &              then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_setvmax(i_tmp)
              else if (a_value .eq. '-e' .or. a_value .eq. '-exp')
     &              then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspexpn(i_tmp)
              else if (a_value .eq. '-clpmin' .or. a_value .eq. '-minclp')
     &              then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspcplw(i_tmp)
              else if (a_value .eq. '-clpmax' .or. a_value .eq. '-maxclp')
     &              then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspcphi(i_tmp)
              else if (a_value .eq. '-val_endi') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                if (a_value .eq. 'little_endian' .or. a_value .eq. 'LITTLE_ENDIAN') then
                  i_setvend(i_tmp) = -1
                else if (a_value .eq. 'big_endian' .or. a_value .eq. 'BIG_ENDIAN') then
                  i_setvend(i_tmp) = 1
                else
                  write(6,*) '*** Warning *** Could not parse endian-ness',a_value
                end if
              else if (a_value .eq. '-bs' .or. a_value .eq. '-B' .or. a_value .eq. '-bswap') then
                i_setvend(i_tmp) = -i_setvend(i_tmp)
              else if (a_value .eq. '-LE' .or. a_value .eq. '-le' .or. a_value .eq. '-little') then
                i_setvend(i_tmp) = -1
              else if (a_value .eq. '-BE' .or. a_value .eq. '-be' .or. a_value .eq. '-big') then
                i_setvend(i_tmp) = 1
              else if (a_value .eq. '-D' .or. a_value .eq. '-dc' .or. a_value .eq. '-dvdc' .or.
     &                 a_value .eq. '-dx' .or. a_value .eq. '-dvdx' .or. a_value .eq. '-slope') then
                i_dspdvdc(i_tmp)=1
              else if (a_value .eq. '-d' .or. a_value .eq. '-wrap') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspwrap(i_tmp)
                if (r_dspwrap(i_tmp) .ne. 0.0) then
                  r_dspmult(i_tmp) = r_dspwrap(i_tmp)
                  i_dspmult(i_tmp) = 0
                  i_dspaddr(i_tmp) = 0
                  i_dspmode(i_tmp) = 6
                end if
              else if (a_value .eq. '-a' .or. a_value .eq. '-addr' .or.
     &              a_value .eq. '-add' .or. a_value .eq. '-daddr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspaddr(i_tmp)
                i_dspaddr(i_tmp) = 0
              else if (a_value .eq. '-m' .or. a_value .eq. '-mult' .or. a_value .eq. '-dmult') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspmult(i_tmp)
                i_dspmult(i_tmp) = 0
                i_dspmode(i_tmp) = 1
              else if (a_value .eq. '-f' .or. a_value .eq. '-fact' .or. a_value .eq. '-sdev') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspval1(i_tmp)
                i_dspmult(i_tmp) = 1
                i_dspmode(i_tmp) = 2
              else if (a_value .eq. '-p' .or. a_value .eq. '-percent' .or. a_value .eq. '-%') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspval2(i_tmp)
                i_dspmult(i_tmp) = 1
                i_dspmode(i_tmp) = 3
              else if (a_value .eq. '-cw' .or. a_value .eq. '-cws' .or. a_value .eq. '-charlie') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_dspval3(i_tmp)
                i_dspmult(i_tmp) = 1
                i_dspmode(i_tmp) = 5
              else if (a_value .eq. '-SDEV' ) then
                r_dspval1(i_tmp) = 2
                i_dspmult(i_tmp) = 1
                i_dspaddr(i_tmp) = 1
                i_dspmode(i_tmp) = 2
              else if (a_value .eq. '-PER' ) then
                r_dspval2(i_tmp) = 90
                i_dspmult(i_tmp) = 1
                i_dspmode(i_tmp) = 3
              else if (a_value .eq. '-CW' ) then
                r_dspval3(i_tmp) = 1
                i_dspmult(i_tmp) = 1
                i_dspaddr(i_tmp) = 0
                i_dspmode(i_tmp) = 5
                r_dspaddr(i_tmp) = 0.
              else if (a_value .eq. '-WRAP' ) then
                i_dspmode(i_tmp) = 6
                r_dspwrap(i_tmp) = r_pi
                i_dspaddr(i_tmp) = 0
                r_dspaddr(i_tmp) = 0.
              else if (a_value .eq. '-z' .or. a_value .eq. '-zoom') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_winzoom(1)
                if (r_winzoom(1) .lt. 0.) r_winzoom(1) = abs(1./r_winzoom(1))
              else if (a_value .eq. '-pz' .or. a_value .eq. '-pzoom') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) r_winzoom(0)
                if (r_winzoom(0) .lt. 0.) r_winzoom(0) = abs(1./r_winzoom(0))
              else if (a_value .eq. '-vx' .or. a_value .eq. '-vxsize') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_winx
              else if (a_value .eq. '-vy' .or. a_value .eq. '-vysize') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_winy
              else if (a_value .eq. '-pcpad' .or. a_value .eq. '-pc') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_pcpad
              else if (a_value .eq. '-prpad' .or. a_value .eq. '-pr') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_prpad
              else if (a_value .eq. '-mix') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                if (a_value .eq. '+') then
                  i_dspmixv(i_tmp) = 1
                else if (a_value .eq. 'x' .or. a_value .eq. 'X') then
                  i_dspmixv(i_tmp) = 2
                else
                  read(a_value,*) i_dspmixv(i_tmp)
                end if
              else if (a_value .eq. '-cmap' .or. a_value .eq. '-ctable') then
                i_arg=i_arg+1
                a_dspctbl(i_tmp)=a_inarg(i_arg)
                do i=1,i_colormax
                  if (a_dspctbl(i_tmp) .eq. a_colorname(i)) a_dspctbl(i_tmp)=a_colorfile(i)
                end do
              else if (a_value .eq. '-null') then
                i_arg=i_arg+1
                a_setvnul(i_tmp)=a_inarg(i_arg)
              else if (a_value .eq. '-nc' .or. a_value .eq. '-null_color' .or
     &              . a_value .eq. '-cnull') then
                i_arg=i_arg+1
                a_nullclr = a_inarg(i_arg)
              else if (a_value .eq. '-lc' .or. a_value .eq. '-line_color' .or
     &              . a_value .eq. '-cline') then
                i_arg=i_arg+1
                a_lcolor = a_inarg(i_arg)
              else if (a_value .eq. '-workdir' .or. a_value .eq. '-work_dir') then
                i_arg=i_arg+1
                a_workdir = a_inarg(i_arg)
                i_cnt=rdflen(a_workdir)
                if (a_workdir(i_cnt:i_cnt) .ne. '/') a_workdir=a_workdir(1:i_cnt)//'/'
              else if (a_value .eq. '-colordir' .or. a_value .eq. '-color_dir') then
                i_arg=i_arg+1
                a_colordir = a_inarg(i_arg)
                i_cnt=rdflen(a_colordir)
                if (a_colordir(i_cnt:i_cnt) .ne. '/') a_colordir=a_colordir(1:i_cnt)//'/'
              else if (a_value .eq. '-emod') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_eventmod
                i_eventmod = max(1,min(1000,i_eventmod))
              else if (a_value .eq. '-debug') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                read(a_value,*) i_debug
              else if (a_value .eq. '-points' .or. a_value .eq. '-pts') then
                i_arg=i_arg+1
                a_ptsfile = a_inarg(i_arg)
                i_smode = 0
                i_show = 1
                i_event(0) = 1          ! Display
                i_event(1) = 0          ! Window
                i_event(2) = 12         ! Event
                i_event(3) = 0
                i_event(4) = 0
                i_event(5) = 43
                i_event(6) = -1
c                write(6,*) 'i_bcnt2 =',i_bcnt
                call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
              else if (a_value .eq. '-click' .or. a_value .eq. '-clk') then
                i_arg=i_arg+1
                a_clickcmd(1) = a_inarg(i_arg)
              else if (a_value .eq. '-ON' .or. a_value .eq. '-on') then
                i_dspactv(1,i_tmp) = 1
              else if (a_value .eq. '-OFF' .or. a_value .eq. '-off') then
                i_dspactv(1,i_tmp) = 0
              else if (a_value .eq. '-active') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                do i=1,I_CMAX
                  if (a_value(i:i) .eq. '1') then
                    i_dspactv(1,i) = 1
                  else if (a_value(i:i) .eq. '0') then
                    i_dspactv(1,i) = 0
                  end if
                end do
              else if (a_value .eq. '-P' .or. a_value .eq. '-ponly') then
                i_ponly = 1
              else if (a_value .eq. '-NM' .or. a_value .eq. '-nomenu') then
                i_menu = 0
              else if (a_value .eq. '-M' .or. a_value .eq. '-menu') then
                i_menu = 1
              else if (a_value .eq. '-NC' .or. a_value .eq. '-NOCLOSE') then
                i_close = 0
              else if (a_value .eq. '-C' .or. a_value .eq. '-CLOSE') then
                i_close = 1
              else if (a_value .eq. '-SRTM' .or. a_value .eq. '-srtm' .or. a_value .eq. '-SRTM30') then
                a_setname(-i_dat) = 'SRTM-dte'
                i_setchdr(-i_dat) = 0
                i_setctlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 2
                i_setcols(-i_dat) = 3601
                i_setrows(-i_dat) = 3601
              else if (a_value .eq. '-c8' .or. a_value .eq. '-complex*8') then
                a_setname(-i_dat) = 'C8-Mag C8-Pha'
                i_setchdr(-i_dat) = 0
                i_setctlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 6
              else if (a_value .eq. '-c2' .or. a_value .eq. '-complex*2') then
                a_setname(-i_dat) = 'C2-Mag C2-Pha'
                i_setchdr(-i_dat) = 0
                i_setctlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 10
              else if (a_value .eq. '-c4' .or. a_value .eq. '-complex*4') then
                a_setname(-i_dat) = 'C4-Mag C4-Pha'
                i_setchdr(-i_dat) = 0
                i_setctlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 12
              else if (a_value .eq. '-c8iq' .or. a_value .eq. '-complex*8iq') then
                a_setname(-i_dat) = 'C8-I C8-Q'
                i_setchdr(-i_dat) = 0
                i_setctlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 6
              else if (a_value .eq. '-rmg' ) then
                a_setname(-i_dat) = 'RMG-Mag RMG-Hgt'
                i_setrhdr(-i_dat) = 0
                i_setrtlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 4
              else if (a_value .eq. '-rmgi' ) then
                a_setname(-i_dat) = 'RMG-Mag RMG-Pha'
                i_setrhdr(-i_dat) = 0
                i_setrtlr(-i_dat) = 0
                i_setvfmt(-i_dat) = 4
              else if (a_value .eq. '-b1' .or. a_value .eq. '-byte' .or. a_value .eq. '-b') then
                i_setvfmt(i_tmp) = 0
              else if (a_value .eq. '-i1' .or. a_value .eq. '-integer*1') then
                i_setvfmt(i_tmp) = 1
              else if (a_value .eq. '-i2' .or. a_value .eq. '-integer*2' .or. a_value .eq. '-si2') then
                i_setvfmt(i_tmp) = 2
              else if (a_value .eq. '-i4' .or. a_value .eq. '-integer*4') then
                i_setvfmt(i_tmp) = 3
              else if (a_value .eq. '-r4' .or. a_value .eq. '-real*4') then
                i_setvfmt(i_tmp) = 4
              else if (a_value .eq. '-r8' .or. a_value .eq. '-real*8') then
                i_setvfmt(i_tmp) = 5
              else if (a_value .eq. '-c8mag' .or. a_value .eq. 'cmag') then
                i_setvfmt(i_tmp) = 6
              else if (a_value .eq. '-c8pha' .or. a_value .eq. 'cpha') then
                i_setvfmt(i_tmp) = 7
              else if (a_value .eq. '-b2' .or. a_value .eq. '-byte*2' .or. a_value .eq. '-byte2') then
                i_setvfmt(i_tmp) = 8
              else if (a_value .eq. '-stokes11' .or. a_value .eq. '-compressed_stokes') then
                i_setvfmt(i_tmp) = 9
              else if (a_value .eq. '-c2mag') then
                i_setvfmt(i_tmp) = 10
              else if (a_value .eq. '-c2pha') then
                i_setvfmt(i_tmp) = 11
              else if (a_value .eq. '-c4mag') then
                i_setvfmt(i_tmp) = 12
              else if (a_value .eq. '-c4pha') then
                i_setvfmt(i_tmp) = 13
              else if (a_value .eq. '-r4mag' .or. a_value .eq. '-real*4_mag') then
                i_setvfmt(i_tmp) = 14
              else if (a_value .eq. '-h' .or. a_value .eq. '-hdr') then
                i_arg=i_arg+1
                a_setinfo(i_tmp)=a_inarg(i_arg)
                a_nullstr=' '
                call get_setinfo(            a_nullstr,
     &              a_setinfo(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              r_dspaddr(i_tmp),
     &              r_dspmult(i_tmp),
     &              r_dspwrap(i_tmp),
     &              r_dspexpn(i_tmp),
     &              r_dspcplw(i_tmp),
     &              r_dspcphi(i_tmp),
     &              r_dspval1(i_tmp),
     &              r_dspval2(i_tmp),
     &              r_dspval3(i_tmp),
     &              i_dspmode(i_tmp),
     &              i_dspaddr(i_tmp),
     &              i_dspmult(i_tmp),
     &              i_dspmixv(i_tmp),
     &              i_dspdvdc(i_tmp),
     &              a_dspctbl(i_tmp)   )
                call get_setinfo(            a_setname(i_tmp),
     &              a_setinfo(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              r_dspaddr(i_tmp),
     &              r_dspmult(i_tmp),
     &              r_dspwrap(i_tmp),
     &              r_dspexpn(i_tmp),
     &              r_dspcplw(i_tmp),
     &              r_dspcphi(i_tmp),
     &              r_dspval1(i_tmp),
     &              r_dspval2(i_tmp),
     &              r_dspval3(i_tmp),
     &              i_dspmode(i_tmp),
     &              i_dspaddr(i_tmp),
     &              i_dspmult(i_tmp),
     &              i_dspmixv(i_tmp),
     &              i_dspdvdc(i_tmp),
     &              a_dspctbl(i_tmp)   )
              else if (a_value .eq. '-top' .or. a_value .eq. '-air' .or. a_value .eq. '-maghdr' .or. a_value .eq. '-dtehdr') then
                i_arg=i_arg+1
                a_hdrfile=a_inarg(i_arg)

                i_mbytes=4
                a_type='sch'
                r_mmul=1.0
                r_madd=0.0
                r_dmul=1.0
                r_dadd=0.0
                call read_hdr(a_hdrfile,i_lsize,i_ssize,r_peg,a_type,
     &              r_str,r_spc,i_mbytes,i_dbytes,r_mmul,r_madd,
     &              r_dmul,r_dadd,i_err)

                    a_setinfo(i_tmp) = ' '
                    a_setproj(i_tmp) = a_type
                    i_setunit(i_tmp) = 0
                    i_setrows(i_tmp) = i_lsize
                    i_setcols(i_tmp) = i_ssize
                    i_setshdr(i_tmp) = 0
                    i_setstlr(i_tmp) = 0
                    i_setrhdr(i_tmp) = 0
                    i_setrtlr(i_tmp) = 0
                    i_setchdr(i_tmp) = 0
                    i_setctlr(i_tmp) = 0
                    if (a_value .eq. '-maghdr') then
                      if (i_mbytes .eq. 1) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('BYTE')
                      else if (i_mbytes .eq. 2) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('BYTE*2')
                      else if (i_mbytes .eq. 4) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('REAL*4')
                      else
                        i_setvfmt(i_tmp) = i_CnvrtFmt('REAL*4')
                      end if
                      r_setvmlt(i_tmp) = r_mmul
                      r_setvadr(i_tmp) = r_madd
                    else
                      if (i_dbytes .eq. 1) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('BYTE')
                      else if (i_dbytes .eq. 2) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('BYTE*2')
                      else if (i_dbytes .eq. 4) then
                        i_setvfmt(i_tmp) = i_CnvrtFmt('REAL*4')
                      else
                        i_setvfmt(i_tmp) = i_CnvrtFmt('REAL*4')
                      end if
                      r_setvmlt(i_tmp) = r_dmul
                      r_setvadr(i_tmp) = r_dadd
                    end if
c                    r_setvmin(i_tmp) =
c                    r_setvmax(i_tmp) =
c                    a_setvnul(i_tmp) =
                    r_setrmlt(i_tmp) = r_spc(1)
                    r_setradr(i_tmp) = r_str(1)+r_spc(1)
                    r_setcmlt(i_tmp) = r_spc(2)
                    r_setcadr(i_tmp) = r_str(2)+r_spc(2)
                    r_setpegv(1,i_tmp) = r_peg(1)
                    r_setpegv(2,i_tmp) = r_peg(2)
                    r_setpegv(3,i_tmp) = r_peg(3)

                    if (a_setfile(i_tmp) .ne. ' ') then
                      if(a_setname(i_tmp) .eq. ' ') write(a_setname(i_tmp),'(a,i1)') 'Set_',abs(i_tmp)
                      a_setinfo(i_tmp) = a_setfile(i_tmp)(1:max(1,rdflen(a_setfile(i_tmp))))//'.mdx'
                      call put_setinfo(a_setname(i_tmp),
     &                a_setinfo(i_tmp),
     &                a_setproj(i_tmp),
     &                i_setunit(i_tmp),
     &                i_setrows(i_tmp),
     &                i_setcols(i_tmp),
     &                i_setshdr(i_tmp),
     &                i_setstlr(i_tmp),
     &                i_setrhdr(i_tmp),
     &                i_setrtlr(i_tmp),
     &                i_setchdr(i_tmp),
     &                i_setctlr(i_tmp),
     &                i_setvend(i_tmp),
     &                i_setvfmt(i_tmp),
     &                r_setvmlt(i_tmp),
     &                r_setvadr(i_tmp),
     &                r_setvmin(i_tmp),
     &                r_setvmax(i_tmp),
     &                a_setvnul(i_tmp),
     &                r_setrmlt(i_tmp),
     &                r_setradr(i_tmp),
     &                r_setcmlt(i_tmp),
     &                r_setcadr(i_tmp),
     &                r_setpegv(1,i_tmp)   )
                    end if
              else if (a_value .eq. '-set') then
                i_arg=i_arg+1
                a_value = a_inarg(i_arg)
                i_chn = i_chn + 1
                if (i_dat .gt. 0) then
                  i_set = min(i_set + 1,I_CMAX)
                  i_tmp = i_set
                  call copy_setdata(-i_dat,i_tmp,
     &                          i_setunit,i_setrows,i_setcols,
     &                          a_setname,a_setfile,a_setinfo,a_setproj,
     &                          i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                          r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                          i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

                  call copy_dspdata(-i_dat,i_tmp,
     &                          r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                          r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                          a_dspctbl,i_dspdvdc)

                  i_dspactv(1,i_tmp) = i_dspactv(1,-i_dat)

                  a_setname(i_tmp) = a_value
                  if (a_setinfo(i_tmp) .eq. ' ' ) then
                    a_setinfo(i_tmp)=a_setfile(i_tmp
     &                    )(1:rdflen(a_setfile(i_tmp)))//'.mdx'
                  end if
c     type *,'looking1 at ',a_setinfo(i_tmp),' ',i_tmp
                  call get_setinfo(          a_setname(i_tmp),
     &                 a_setinfo(i_tmp),
     &                 a_setproj(i_tmp),
     &                 i_setunit(i_tmp),
     &                 i_setrows(i_tmp),
     &                 i_setcols(i_tmp),
     &                 i_setshdr(i_tmp),
     &                 i_setstlr(i_tmp),
     &                 i_setrhdr(i_tmp),
     &                 i_setrtlr(i_tmp),
     &                 i_setchdr(i_tmp),
     &                 i_setctlr(i_tmp),
     &                 i_setvend(i_tmp),
     &                 i_setvfmt(i_tmp),
     &                 r_setvmlt(i_tmp),
     &                 r_setvadr(i_tmp),
     &                 r_setvmin(i_tmp),
     &                 r_setvmax(i_tmp),
     &                 a_setvnul(i_tmp),
     &                 r_setrmlt(i_tmp),
     &                 r_setradr(i_tmp),
     &                 r_setcmlt(i_tmp),
     &                 r_setcadr(i_tmp),
     &                 r_setpegv(1,i_tmp),
     &                 r_dspaddr(i_tmp),
     &                 r_dspmult(i_tmp),
     &                 r_dspwrap(i_tmp),
     &                 r_dspexpn(i_tmp),
     &                 r_dspcplw(i_tmp),
     &                 r_dspcphi(i_tmp),
     &                 r_dspval1(i_tmp),
     &                 r_dspval2(i_tmp),
     &                 r_dspval3(i_tmp),
     &                 i_dspmode(i_tmp),
     &                 i_dspaddr(i_tmp),
     &                 i_dspmult(i_tmp),
     &                 i_dspmixv(i_tmp),
     &                 i_dspdvdc(i_tmp),
     &                 a_dspctbl(i_tmp)   )

                else

                  if (i_set .eq. 1) then
                    a_setname(0) = a_value
                  else
                    a_setname(0) =
     &                    a_setname(0)(1:max(1,rdflen(a_setname(0))))//'
     &                    '//a_value
                  end if
                end if
              else if (a_value(1:1) .eq. '-' .and. a_value .ne. '-file') then   ! implicit set name
                a_value = a_value(2:)
                i_chn = i_chn + 1
                if (i_dat .gt. 0) then
                  i_set = min(i_set + 1,I_CMAX)
                  i_tmp = i_set
                  call copy_setdata(-i_dat,i_tmp,
     &                          i_setunit,i_setrows,i_setcols,
     &                          a_setname,a_setfile,a_setinfo,a_setproj,
     &                          i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                          r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                          i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

                  call copy_dspdata(-i_dat,i_tmp,
     &                          r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                          r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                          a_dspctbl,i_dspdvdc)

                  i_dspactv(1,i_tmp) = i_dspactv(1,-i_dat)

                  a_setname(i_tmp) = a_value
                  if (a_setinfo(i_tmp) .eq. ' ' ) then
                    a_setinfo(i_tmp)=a_setfile(i_tmp
     &                    )(1:rdflen(a_setfile(i_tmp)))//'.mdx'
                  end if
                  call get_setinfo(          a_setname(i_tmp),
     &                 a_setinfo(i_tmp),
     &                 a_setproj(i_tmp),
     &                 i_setunit(i_tmp),
     &                 i_setrows(i_tmp),
     &                 i_setcols(i_tmp),
     &                 i_setshdr(i_tmp),
     &                 i_setstlr(i_tmp),
     &                 i_setrhdr(i_tmp),
     &                 i_setrtlr(i_tmp),
     &                 i_setchdr(i_tmp),
     &                 i_setctlr(i_tmp),
     &                 i_setvend(i_tmp),
     &                 i_setvfmt(i_tmp),
     &                 r_setvmlt(i_tmp),
     &                 r_setvadr(i_tmp),
     &                 r_setvmin(i_tmp),
     &                 r_setvmax(i_tmp),
     &                 a_setvnul(i_tmp),
     &                 r_setrmlt(i_tmp),
     &                 r_setradr(i_tmp),
     &                 r_setcmlt(i_tmp),
     &                 r_setcadr(i_tmp),
     &                 r_setpegv(1,i_tmp),
     &                 r_dspaddr(i_tmp),
     &                 r_dspmult(i_tmp),
     &                 r_dspwrap(i_tmp),
     &                 r_dspexpn(i_tmp),
     &                 r_dspcplw(i_tmp),
     &                 r_dspcphi(i_tmp),
     &                 r_dspval1(i_tmp),
     &                 r_dspval2(i_tmp),
     &                 r_dspval3(i_tmp),
     &                 i_dspmode(i_tmp),
     &                 i_dspaddr(i_tmp),
     &                 i_dspmult(i_tmp),
     &                 i_dspmixv(i_tmp),
     &                 i_dspdvdc(i_tmp),
     &                 a_dspctbl(i_tmp)   )

                else

                  if (i_set .eq. 1) then
                    a_setname(0) = a_value
                  else
                    a_setname(0) =
     &                    a_setname(0)(1:max(1,rdflen(a_setname(0))))//'
     &                    '//a_value
                  end if
                end if
              else
                if (a_value .eq. '-file') then
                  i_arg=i_arg+1
                  a_value = a_inarg(i_arg)
                end if
c                write(6,*) 'a_value=',a_value,i_dat,i_chn  !@#$%
                if (i_dat .gt. 0 .and. i_chn .eq. 0) then ! last file had no sets specified
                  if (a_setname(-i_dat) .eq. ' ') then
                    a_label = a_setfile(-i_dat)
                    if (a_label(1:1) .ne. '=') then
                      do  while(max(index(a_label,'/'),index(a_label,'.')) .gt. 0 .and.
     &                         max(index(a_label,'/'),index(a_label,'.')) .lt. rdflen(a_label)-1)
                        a_label = a_label(max(index(a_label,'/'),index(a_label,'.'))+1:)
                      end do
                    end if
                    a_setname(-i_dat) = a_label
                  end if
c                  write(6,*) 'i_dat=',i_dat
c                  write(6,*) 'a_setname=',a_setname(-i_dat)   !@#$%

                  call rdf_getfields(a_setname(-i_dat),i_sss,a_sss)
                  do i_chn=1,i_sss
                    i_set = min(i_set + 1,I_CMAX)
                    i_tmp = i_set
                    call copy_setdata(-i_dat,i_tmp,
     &                          i_setunit,i_setrows,i_setcols,
     &                          a_setname,a_setfile,a_setinfo,a_setproj,
     &                          i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                          r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                          i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

                    call copy_dspdata(-i_dat,i_tmp,
     &                          r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                          r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                          a_dspctbl,i_dspdvdc)
                    a_setname(i_tmp) = a_sss(i_chn)

                    i_dspactv(1,i_tmp) = i_dspactv(1,-i_dat)

                    if (a_setinfo(i_tmp) .eq. ' ' ) then
                      a_setinfo(i_tmp)=a_setfile(i_tmp
     &                       )(1:rdflen(a_setfile(i_tmp)))//'.mdx'
                    end if
c                    write(6,*) 'i_chn=',i_chn,i_tmp   !@#$%
                    call get_setinfo(a_setname(i_tmp),
     &                    a_setinfo(i_tmp),
     &                    a_setproj(i_tmp),
     &                    i_setunit(i_tmp),
     &                    i_setrows(i_tmp),
     &                    i_setcols(i_tmp),
     &                    i_setshdr(i_tmp),
     &                    i_setstlr(i_tmp),
     &                    i_setrhdr(i_tmp),
     &                    i_setrtlr(i_tmp),
     &                    i_setchdr(i_tmp),
     &                    i_setctlr(i_tmp),
     &                    i_setvend(i_tmp),
     &                    i_setvfmt(i_tmp),
     &                    r_setvmlt(i_tmp),
     &                    r_setvadr(i_tmp),
     &                    r_setvmin(i_tmp),
     &                    r_setvmax(i_tmp),
     &                    a_setvnul(i_tmp),
     &                    r_setrmlt(i_tmp),
     &                    r_setradr(i_tmp),
     &                    r_setcmlt(i_tmp),
     &                    r_setcadr(i_tmp),
     &                    r_setpegv(1,i_tmp),
     &                    r_dspaddr(i_tmp),
     &                    r_dspmult(i_tmp),
     &                    r_dspwrap(i_tmp),
     &                    r_dspexpn(i_tmp),
     &                    r_dspcplw(i_tmp),
     &                    r_dspcphi(i_tmp),
     &                    r_dspval1(i_tmp),
     &                    r_dspval2(i_tmp),
     &                    r_dspval3(i_tmp),
     &                    i_dspmode(i_tmp),
     &                    i_dspaddr(i_tmp),
     &                    i_dspmult(i_tmp),
     &                    i_dspmixv(i_tmp),
     &                    i_dspdvdc(i_tmp),
     &                    a_dspctbl(i_tmp)   )

                  end do
                end if
                i_dat = i_dat+1
                i_tmp = -i_dat
                i_chn = 0
c                write(6,*) 'hello=',i_dat,i_tmp,i_chn  !@#$%
                call copy_setdata(0,i_tmp,
     &                           i_setunit,i_setrows,i_setcols,
     &                           a_setname,a_setfile,a_setinfo,a_setproj,
     &                           i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                           r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                           i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

                call copy_dspdata(0,i_tmp,
     &                           r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                           r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                           a_dspctbl,i_dspdvdc)

                i_dspactv(1,i_tmp) = i_dspactv(1,0)

                a_setfile(i_tmp) = a_value

c                write(6,*) 'hello2=',i_dat,i_tmp,i_chn  !@#$%
c                write(6,*) 'hello3=',a_setinfo(i_tmp) !@#$%
                if (a_setinfo(i_tmp) .eq. ' ' .and. a_setfile(i_tmp)(1:1) .ne. '=' .and. a_setfile(i_tmp) .ne. 'internal') then
                  a_setinfo(i_tmp)=a_setfile(i_tmp
     &                 )(1:rdflen(a_setfile(i_tmp)))//'.mdx'
c                  write(6,*) 'openning=',a_setname(i_tmp) !@#$%
                  call get_airsarinfo(         a_setname(i_tmp),  ! Only executes if no header is specified
     &              a_setfile(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              a_dspctbl(i_tmp)   )
c                    write(6,*) 'openning1=',a_setname(i_tmp) !@#$%
                  call get_pdsinfo(            a_setname(i_tmp),  ! Only executes if no header is specified
     &              a_setfile(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              a_dspctbl(i_tmp) , i_debug   )
c                    write(6,*) 'openning2=',a_setname(i_tmp) !@#$%
                  call get_cubinfo(            a_setname(i_tmp),  ! Only executes if no header is specified
     &              a_setfile(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              a_dspctbl(i_tmp) , i_debug   )
                end if
c                write(6,*) 'openning3=',a_setinfo(i_tmp) !@#$%
                call get_setinfo(              a_setname(i_tmp),
     &              a_setinfo(i_tmp),
     &              a_setproj(i_tmp),
     &              i_setunit(i_tmp),
     &              i_setrows(i_tmp),
     &              i_setcols(i_tmp),
     &              i_setshdr(i_tmp),
     &              i_setstlr(i_tmp),
     &              i_setrhdr(i_tmp),
     &              i_setrtlr(i_tmp),
     &              i_setchdr(i_tmp),
     &              i_setctlr(i_tmp),
     &              i_setvend(i_tmp),
     &              i_setvfmt(i_tmp),
     &              r_setvmlt(i_tmp),
     &              r_setvadr(i_tmp),
     &              r_setvmin(i_tmp),
     &              r_setvmax(i_tmp),
     &              a_setvnul(i_tmp),
     &              r_setrmlt(i_tmp),
     &              r_setradr(i_tmp),
     &              r_setcmlt(i_tmp),
     &              r_setcadr(i_tmp),
     &              r_setpegv(1,i_tmp),
     &              r_dspaddr(i_tmp),
     &              r_dspmult(i_tmp),
     &              r_dspwrap(i_tmp),
     &              r_dspexpn(i_tmp),
     &              r_dspcplw(i_tmp),
     &              r_dspcphi(i_tmp),
     &              r_dspval1(i_tmp),
     &              r_dspval2(i_tmp),
     &              r_dspval3(i_tmp),
     &              i_dspmode(i_tmp),
     &              i_dspaddr(i_tmp),
     &              i_dspmult(i_tmp),
     &              i_dspmixv(i_tmp),
     &              i_dspdvdc(i_tmp),
     &              a_dspctbl(i_tmp)   )
c                   write(6,*) 'set name = ',a_setname(i_tmp)
              end if !@#$%

            end do


          end if

          if (i_dat .gt. 0 .and. i_chn .eq. 0) then ! last file had no sets specified
            if (a_setname(-i_dat) .eq. ' ') then
              a_label = a_setfile(-i_dat)
              if (a_label(1:1) .ne. '=') then
                do  while(max(index(a_label,'/'),index(a_label,'.')) .gt. 0 .and.
     &                max(index(a_label,'/'),index(a_label,'.')) .lt. rdflen(a_label)-1)
                  a_label = a_label(max(index(a_label,'/'),index(a_label,'.'))+1:)
                end do
              end if
              a_setname(-i_dat) = a_label
            end if
            if (a_setname(-i_dat) .eq. ' ') then
              write(a_setname(-i_dat),'(a,i2)') 'Set ',i_dat
            end if
            call rdf_getfields(a_setname(-i_dat),i_sss,a_sss)
            do i_chn=1,i_sss
              i_set = min(i_set + 1,I_CMAX)
              i_tmp = i_set
              call copy_setdata(-i_dat,i_tmp,
     &                        i_setunit,i_setrows,i_setcols,
     &                        a_setname,a_setfile,a_setinfo,a_setproj,
     &                        i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                        r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                        i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

              call copy_dspdata(-i_dat,i_tmp,
     &                        r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                        r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                        a_dspctbl,i_dspdvdc)

              i_dspactv(1,i_tmp) = i_dspactv(1,-i_dat)

              a_setname(i_tmp) = a_sss(i_chn)

              if (a_setinfo(i_tmp) .eq. ' ' ) then
                a_setinfo(i_tmp)=a_setfile(i_tmp
     &              )(1:rdflen(a_setfile(i_tmp)))//'.mdx'
              end if
              call get_setinfo(                a_setname(i_tmp),
     &           a_setinfo(i_tmp),
     &           a_setproj(i_tmp),
     &           i_setunit(i_tmp),
     &           i_setrows(i_tmp),
     &           i_setcols(i_tmp),
     &           i_setshdr(i_tmp),
     &           i_setstlr(i_tmp),
     &           i_setrhdr(i_tmp),
     &           i_setrtlr(i_tmp),
     &           i_setchdr(i_tmp),
     &           i_setctlr(i_tmp),
     &           i_setvend(i_tmp),
     &           i_setvfmt(i_tmp),
     &           r_setvmlt(i_tmp),
     &           r_setvadr(i_tmp),
     &           r_setvmin(i_tmp),
     &           r_setvmax(i_tmp),
     &           a_setvnul(i_tmp),
     &           r_setrmlt(i_tmp),
     &           r_setradr(i_tmp),
     &           r_setcmlt(i_tmp),
     &           r_setcadr(i_tmp),
     &           r_setpegv(1,i_tmp),
     &           r_dspaddr(i_tmp),
     &           r_dspmult(i_tmp),
     &           r_dspwrap(i_tmp),
     &           r_dspexpn(i_tmp),
     &           r_dspcplw(i_tmp),
     &           r_dspcphi(i_tmp),
     &           r_dspval1(i_tmp),
     &           r_dspval2(i_tmp),
     &           r_dspval3(i_tmp),
     &           i_dspmode(i_tmp),
     &           i_dspaddr(i_tmp),
     &           i_dspmult(i_tmp),
     &           i_dspmixv(i_tmp),
     *           i_dspdvdc(i_tmp),
     &           a_dspctbl(i_tmp)   )

            end do
          end if

          do i_chn = 1,i_set        ! In order to make the -c8 option work correctly
            if (a_setname(i_chn) .eq. 'C8-Mag') then
              i_setvfmt(i_chn) = 6
            else if (a_setname(i_chn) .eq. 'C8-Pha') then
              i_setvfmt(i_chn) = 7
              r_dspwrap(i_chn) = 2.0d0*r_pi
              i_dspmode(i_chn) = 6
              a_dspctbl(i_chn) = 'cmy'
            else if (a_setname(i_chn) .eq. 'C8-I') then
              i_setvfmt(i_chn) = 4
              i_setchdr(i_chn) = 0
              i_setctlr(i_chn) = 4
            else if (a_setname(i_chn) .eq. 'C8-Q') then
              i_setvfmt(i_chn) = 4
              i_setchdr(i_chn) = 4
              i_setctlr(i_chn) = 0
            else if (a_setname(i_chn) .eq. 'C2-Mag') then
              i_setvfmt(i_chn) = 10
            else if (a_setname(i_chn) .eq. 'C2-Pha') then
              i_setvfmt(i_chn) = 11
              r_dspwrap(i_chn) = 2.0d0*r_pi
              i_dspmode(i_chn) = 6
              a_dspctbl(i_chn) = 'cmy'
            else if (a_setname(i_chn) .eq. 'C4-Mag') then
              i_setvfmt(i_chn) = 12
            else if (a_setname(i_chn) .eq. 'C4-Pha') then
              i_setvfmt(i_chn) = 13
              r_dspwrap(i_chn) = 2.0d0*r_pi
              i_dspmode(i_chn) = 6
              a_dspctbl(i_chn) = 'cmy'
            else if (a_setname(i_chn) .eq. 'SRTM-dte') then
              i_setvfmt(i_chn) = 2
              r_dspwrap(i_chn) = 200.
              r_dspmult(i_chn) = r_dspwrap(i_chn)
              i_dspmult(i_chn) = 0
              i_dspaddr(i_chn) = 0
              i_dspmode(i_chn) = 6
              a_dspctbl(i_chn) = 'cmy'
              i_str=0
              do while (index(a_setfile(i_chn)(i_str+1:),'/') .gt. 0)
                i_str=i_str+index(a_setfile(i_chn)(i_str+1:),'/')
              end do
              read(a_setfile(i_chn)(i_str+1:),'(x,i2.2)') i_lat
              i_lat=i_lat+1.0
              if (a_setfile(i_chn)(i_str+1:i_str+1) .eq. 'S') i_lat=-i_lat
              read(a_setfile(i_chn)(i_str+1:),'(4x,i3.3)') i_lon
              if (a_setfile(i_chn)(i_str+4:i_str+4) .eq. 'W') i_lon=-i_lon
              i_setcols(i_chn) = 3601
              i_setrows(i_chn) = 3601
              i_setvend(i_chn) = 1
              a_setproj(i_chn) = 'eqa'
              r_setcadr(i_chn) = i_lon
              r_setcmlt(i_chn) = 1.0d0/3600
              r_setradr(i_chn) = i_lat
              r_setrmlt(i_chn) = -1.0d0/3600
              r_setvmin(i_chn) = -10000.
            end if
          end do

          do i_chn = 1,i_set        ! In order to make the -rmg option work correctly
            if (a_setname(i_chn) .eq. 'RMG-Mag') then
              i_setrtlr(i_chn) = 4*i_setcols(i_chn)
              i_setvfmt(i_chn) = 4
            else if (a_setname(i_chn) .eq. 'RMG-Hgt') then
              i_setrhdr(i_chn) = 4*i_setcols(i_chn)
              i_setvfmt(i_chn) = 4
              a_dspctbl(i_chn) = 'cmy'
            else if (a_setname(i_chn) .eq. 'RMG-Pha') then
              i_setrhdr(i_chn) = 4*i_setcols(i_chn)
              i_setvfmt(i_chn) = 4
              a_dspctbl(i_chn) = 'cmy'
            end if
          end do

          do i_chn = 1,i_set        ! In order to make QUBE Data work better
            if (a_setname(i_chn) .eq. 'QUBE' .and. i_qubeset .eq. 0) then
              a_dspctbl(i_chn) = 'cmy'
              i_qubeset=1
            else if (a_setname(i_chn) .eq. 'QUBE' .and. i_qubeset .eq. 1) then
              a_dspctbl(i_chn) = 'grey'
              i_dspdvdc(i_chn) = 1
              i_qubeset=0
            end if
          end do

          do i_chn = 1,i_set        !
            if (i_dspdvdc(i_chn) .eq. 1) then
              a_setname(i_chn) = 'd('//a_setname(i_chn)(1:max(1,rdflen(a_setname(i_chn))))//')/dc'
              i_setvfmt(i_chn) = -i_setvfmt(i_chn)
            end if
          end do

          do i_chn = 1,i_set        ! set b_setvnul
            b_setvnul(0,i_chn) = rdflen(a_setvnul(i_chn))/2
            if (i_debug .eq. -5 .or. i_debug .ge. 5) write(6,*) 'i_chn,len,a_setvnul(i_chn) ',i_chn,b_setvnul(0
     &        ,i_chn),'#',a_setvnul(i_chn),'#'
            do i=1,16
              if (i .le. b_setvnul(0,i_chn)) then
                read(a_setvnul(i_chn)(2*i-1:2*i),fmt='(z2.2)')
     &              b_setvnul(i,i_chn)
              else
                b_setvnul(i,i_chn) = 0
              end if
              if (b_setvnul(i,i_chn) .ge. 128) b_setvnul(i,i_chn) = b_setvnul(i,i_chn)-256
              if (i_debug .eq. -10 .or. i_debug .ge. 10) write(6,*) 'b_setvnul = ',i_chn,i,b_setvnul(i,i_chn)
            end do
          end do


          do i_chn = 1,i_set  ! correct sign of utm northing spacing
            if (rdflower(a_setproj(i_chn)) .eq. 'utm') r_setrmlt(i_chn)=-r_setrmlt(i_chn)
          end do

          if (index(a_nullclr,',') .ne. 0) then
            i_val = index(a_nullclr,'(')
            if (i_val .gt. 0) a_nullclr = a_nullclr(i_val+1:)
            i_val = index(a_nullclr,')')
            if (i_val .gt. 2) a_nullclr = a_nullclr(:i_val-1)
            read(a_nullclr,*) i_nullclr
          else
            if (i_debug .ge. 6) write(6,*) 'looking up color: ',a_nullclr
            call init_dsp(a_lcolor,i_debug)
            call get_colorrgb(a_nullclr,i_nullclr)
          end if
          if (i_debug .ge. 5) write(6,*) 'Setting null color: ',i_nullclr

          do i_chn = 1,i_set
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) ' '
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setname = ',a_setname(i_chn)(1:50)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setfile = ',a_setfile(i_chn)(1:50)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setinfo = ',a_setinfo(i_chn)(1:50)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setproj = ',a_setproj(i_chn)(1:50)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setrows = ',i_setrows(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setcols = ',i_setcols(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setshdr = ',i_setshdr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setstlr = ',i_setstlr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setrhdr = ',i_setrhdr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setrtlr = ',i_setrtlr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setchdr = ',i_setchdr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setctlr = ',i_setctlr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setvend = ',i_setvend(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setfrmt = ',i_setvfmt(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setrmlt = ',r_setrmlt(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setradr = ',r_setradr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setcmlt = ',r_setcmlt(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setcadr = ',r_setcadr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setvmlt = ',r_setvmlt(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setvadr = ',r_setvadr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setvmin = ',r_setvmin(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'setvmax = ',r_setvmax(i_chn)

            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspmode = ',i_dspmode(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspaddr = ',r_dspaddr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspmult = ',r_dspmult(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspwrap = ',r_dspwrap(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspexpn = ',r_dspexpn(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspcplw = ',r_dspcplw(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspcphi = ',r_dspcphi(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspval1 = ',r_dspval1(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspval2 = ',r_dspval2(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspval3 = ',r_dspval3(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspmode = ',i_dspmode(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspdvdx = ',i_dspdvdc(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspaddr = ',i_dspaddr(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspmult = ',i_dspmult(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspmixv = ',i_dspmixv(i_chn)
            if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'dspctbl = ',a_dspctbl(i_chn)(1:50)

          end do

          if (i_setcols(1) .eq. 0) then
            write(6,*) 'Number of columns not specified'
            stop ' '
          end if

c     open image files

          do i_chn = 1,i_set

            if (a_setfile(i_chn) .ne. ' ' .and. a_setfile(i_chn)(1:1) .ne. '=') then
              if (a_setfile(i_chn)(1:max(1,rdflen(a_setfile(i_chn)))) .eq. 'internal' .and. i_maxbuff .gt. 0) then
                i_setunit(i_chn) = -i_chn
                i_fbytes = readfunc(1,i_chn,i_eight(0),0,b_data)
                if (i_debug .ge. 3) write(6,*) 'internal buffer size=',i_fbytes
                i_fbytes = min(i_fbytes,i_maxbuff)
              else
                i_setunit(i_chn) = initdk(20+i_chn,a_setfile(i_chn))
                i_fbytes = i_getfsize(i_setunit(i_chn))
                if (i_setunit(i_chn) .le. 0) stop 'set number less than or equal to zero'
              end if
              if (i_fbytes .gt. 0) then
                i_setrows(i_chn) = min(i_eight(i_setrows(i_chn)),(i_fbytes
     &              -i_setshdr(i_chn)-i_setstlr(i_chn))/((i_setvbyt(i_setvfmt(i_chn))
     &              +i_setchdr(i_chn)+i_setctlr(i_chn))*i_setcols(i_chn)+i_setrhdr(i_chn)+i_setrtlr(i_chn)
     &              ))

c                i_setunit(i_chn) = 20+i_chn
c                open(unit=i_setunit(i_chn),file=a_setfile(i_chn),status='old',
c     &            form='unformatted',access='direct',recl=i_setcols(i_chn)*i_setvbyt(i_chn))
                 if (i_debug .eq. 2) write(6,*) 'Opening file: ',a_setfile(i_chn)(1:60)
                 if (i_debug .gt. 2) write(6,*) 'Opening file: ',a_setfile(i_chn)(1:60),' ',i_setrows(i_chn),i_setcols(i_chn)
              else
                write(6,*) 'Error opening: ',a_setfile(i_chn)(1:60),
     &              i_chn,i_fbytes
                stop ' '
              end if

              i_pos = 0
              do while (index(a_setfile(i_chn)(i_pos+1:),'/') .ne. 0)
                i_pos = i_pos + index(a_setfile(i_chn)(i_pos+1:),'/')
              end do
              if (a_filename .eq. ' ') then
                a_filename = a_setfile(i_chn)(i_pos+1:)
              else
                if (a_filename .ne. a_setfile(i_chn)(i_pos+1:)) then ! Only show filename once if same for all channels
                  a_filename=a_filename(1:max(rdflen(a_filename),1))/
     &                 /', '//a_setfile(i_chn)(i_pos+1:)
                end if
              end if


c
c     Compute data stats
c

              if (.false.) then ! disable mean and std calc on raw data file

                if (i_debug .ge. 3) write(6,'(1x,a,i3)') 'Computing set stats for set: ',i_chn
                if (i_debug .ge. 4) write(6,*) 'Number of rows/cols: ',i_setrows(i_chn)
     &           ,i_setcols(i_chn)

                i_err = 0
                i_cnt = 0
                r_sum = 0.
                r_sqr = 0.
                r_setvavg(i_chn) = 0.0
                r_setvstd(i_chn) = 0.0
                do i_row = 0,i_setrows(i_chn)-1,min(max(i_setrows(i_chn)/100,1),20000)
                  do i_col = 0, i_setcols(i_chn)-1, min(max(i_setcols(i_chn)/100,1),20000)
                    !@#$%
                      if (a_setfile(i_chn)(1:1) .ne. '=') then
                        call readdat(i_setunit(i_chn),
     &                          i_setrows(i_chn),
     &                          i_setcols(i_chn),
     &                          i_setshdr(i_chn),
     &                          i_setstlr(i_chn),
     &                          i_setrhdr(i_chn),
     &                          i_setrtlr(i_chn),
     &                          i_setchdr(i_chn),
     &                          i_setctlr(i_chn),
     &                          i_setvend(i_chn)*i_endian,
     &                          i_setvfmt(i_chn),
     &                          r_setvmlt(i_chn),
     &                          r_setvadr(i_chn),
     &                          r_setvmin(i_chn),
     &                          r_setvmax(i_chn),
     &                          b_setvnul(0,i_chn),
     &                          i_row,i_col-1,3,r_data,i_data,readfunc,i_err)
                      else
                        do j=0,2
                          r_data(j)=0
                          i_data(j)=0
                        end do
                        i_opr=1
                        i_flg=0
                        a_value = ' '
                        do i = 2,rdflen(a_setfile(i_chn))+1
                          if (index('+-*/x',a_setfile(i_chn)(i:i)) .gt. 0 .or. a_setfile(i_chn)(i:i) .eq. ' ') then
                            if (a_value .ne. ' ') then
                              read(a_value,*) r_value
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_value
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_value
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_value
                              else if (i_opr .eq. 4) then
                                r_data(1)=r_data(1)/r_value
                              end if
                              a_value = ' '
                            end if
                          end if
                          if(a_setfile(i_chn)(i:i) .eq. '+') then
                            i_opr=1
                          else if (a_setfile(i_chn)(i:i) .eq. '-') then
                            i_opr=2
                          else if (a_setfile(i_chn)(i:i) .eq. 'x') then
                            i_opr=3
                          else if (a_setfile(i_chn)(i:i) .eq. '/') then
                            i_opr=4
                          else if (a_setfile(i_chn)(i:i) .eq. 's' .or. a_setfile(i_chn)(i:i) .eq. 'S') then
                            i_flg=1
                          else if (i_flg .eq. 1) then
                            i_flg = 0
                            i_tmp = max(min((ichar(a_setfile(i_chn)(i:i))-ichar('0')),i_set+1),1)
                            if (i_tmp .gt. i_set) i_tmp=0
                            if (i_tmp .ne. 0) then
                              call readdat(i_setunit(i_tmp),
     &                          i_setrows(i_tmp),
     &                          i_setcols(i_tmp),
     &                          i_setshdr(i_tmp),
     &                          i_setstlr(i_tmp),
     &                          i_setrhdr(i_tmp),
     &                          i_setrtlr(i_tmp),
     &                          i_setchdr(i_tmp),
     &                          i_setctlr(i_tmp),
     &                          i_setvend(i_tmp)*i_endian,
     &                          i_setvfmt(i_tmp),
     &                          r_setvmlt(i_tmp),
     &                          r_setvadr(i_tmp),
     &                          r_setvmin(i_tmp),
     &                          r_setvmax(i_tmp),
     &                          b_setvnul(0,i_tmp),
     &                          i_row,i_col-1,3,r_data2,i_data2,readfunc,i_err)
                              i_data(1)=i_data(1)+i_data2(1)
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_data2(1)
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_data2(1)
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_data2(1)
                              else if (i_opr .eq. 4) then
                                r_data(1)=r_data(1)/r_data2(1)
                              else
                                r_data(1)=r_data(1)+r_data2(1)
                              end if
                            end if
                          else
                            a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(i:i)
                          end if
                        end do
                      end if
                   !@#$%
                    if (i_data(1) .eq. 0) then
                      i_cnt = i_cnt + 1
                      r_val(min(i_cnt,I_WKSPACE)) = r_data(1)
                      r_sum = r_sum + dble(r_data(1))
                      r_sqr = r_sqr + dble(r_data(1))**2
                    end if
                  end do
                end do

                if (i_cnt .gt. 0) then
                  r_setvavg(i_chn) = r_sum/max(i_cnt,1)
                  r_setvstd(i_chn) = sqrt(max(1.d-99,(r_sqr/max(i_cnt,1))
     &              -r_setvavg(i_chn)**2))
                  if (i_debug .ge. 3) write(6,*) 'avg/std = ',r_setvavg(i_chn),r_setvstd(i_chn),i_cnt
c                  call median(0.5,min(i_cnt,I_WKSPACE),r_val,r_median)
                  if (i_debug .ge. 4) write(6,*) 'average = ',r_setvavg(i_chn),i_cnt
                  if (i_debug .ge. 4) write(6,*) 'median  = ',r_median,i_cnt
                end if

              end if

            end if
          enddo


          do i_chn = 1,i_set
              if (a_setfile(i_chn)(1:1) .eq. '=') then
                if (i_setrows(i_chn) .eq. 0) i_setrows(i_chn) = i_setrows(1)
                if (i_setcols(i_chn) .eq. 0) i_setcols(i_chn) = i_setcols(1)
              end if
          end do

c
c     Set up row/column formats
c
          write(a_rowfrmt,'(a,i2.2,a)') '(i',min(10,max(1,int(1+alog10(float(i_setrows(1)))))),')'
          write(a_colfrmt,'(a,i2.2,a)') '(i',min(10,max(1,int(1+alog10(float(i_setcols(1)))))),')'
          if (i_debug .ge. 6) write(6,*) 'row/col fmt = ',a_rowfrmt,' ',a_colfrmt

c
c     Set some Color Table defaults
c
          do i=1,i_set
            a_value = rdflower(a_setname(i))
            if (a_dspctbl(i) .eq. ' ') then
              if (a_value(1:3) .eq. 'set') then
                if (i .eq. 1) a_dspctbl(i) = 'grey'
                if (i .eq. 2) a_dspctbl(i) = 'cmy'
                if (i .eq. 3) a_dspctbl(i) = 'bitmap'
              else if (a_value .eq. 'mag' .or.
     &               a_value .eq. 'rcs' .or.
     &               a_value .eq. 'amp' .or.
     &               a_value .eq. 'amplitude' .or.
     &               a_value .eq. 'magnitude' ) then
                a_dspctbl(i) = 'grey'
              else if (a_value .eq. 'dte' .or.
     &               a_value .eq. 'hgt' .or.
     &               a_value .eq. 'pha' .or.
     &               a_value .eq. 'height' .or.
     &               a_value .eq. 'phase' ) then
                a_dspctbl(i) = 'cmy'
              else if (a_value .eq. 'vv' ) then
                a_dspctbl(i) = 'blue'
              else if (a_value .eq. 'red' ) then
                a_dspctbl(i) = 'red'
              else if (a_value .eq. 'green' ) then
                a_dspctbl(i) = 'green'
              else if (a_value .eq. 'blue' ) then
                a_dspctbl(i) = 'blue'
              else if (a_value .eq. 'hh' ) then
                a_dspctbl(i) = 'green'
              else if (a_value .eq. 'airsar-dem') then
                a_dspctbl(i) = 'cmy'
              else if (a_value .eq. 'airsar-mag') then
                a_dspctbl(i) = 'grey'
              else if (a_value .eq. 'airsar-cor') then
                a_dspctbl(i) = 'grey'
              else if (a_value .eq. 'airsar-m11') then
                a_dspctbl(i) = 'grey'
              else
                a_dspctbl(i) = 'grey'
              end if
            end if
          end do

c
c     Initialize graphics
c
          do i_d=1,I_DMAX
            i_winactv(i_d)=0
          end do
          i_dsp=1
          i_winrows(i_dsp) = min(nint(i_setrows(1)*r_winzoom(i_dsp)),32000)
          i_wincols(i_dsp) = min(nint(i_setcols(1)*r_winzoom(i_dsp)),32000)
          i_winradr(i_dsp) = 0
          i_wincadr(i_dsp) = 0
          if (i_ponly .eq. 0) then
            call create_dsp(a_filename,i_winrows(i_dsp),i_wincols(i_dsp),i_winy,i_winx,
     &         a_setname(1),i_set,i_d,i_menu,a_tname,i_close,a_lcolor,i_debug)
            if (i_debug .ge. 6) write(6,*) 'i_dsp=',i_dsp
            if (i_d .lt. 1 .or. i_d .gt. I_DMAX) stop 'Error creating Display'
            call get_wininfo(i_d,1,i_vxo(i_d,1),i_vyo(i_d,1),i_vxs(i_d,1),
     &        i_vys(i_d,1),i_wxs(i_d,1),i_wys(i_d,1),i_widget)
c     &        i_vys(i_d,1),i_cw,i_ch,i_widget)
            if (i_debug .ge. 6) write(6,*) 'from get_win',i_vxo(i_d,1),i_vyo(i_d,1),i_vxs(i_d,1)
     &       ,i_vys(i_d,1)
            i_winactv(i_d) = 1
            do i=1, I_CMAX
              if (i .le. i_set) then
                if (i_dspactv(i_d,i) .lt. 0) then
                  i_dspactv(i_d,i) = 1
                end if
                call set_button_shadow(i_d,i+1,i_dspactv(i_d,i),i_debug)
c                call get_colortable(a_colordir,a_dspctbl(i),i_dspnumt(i),r_dspredt(0,i),r_dspgrnt(0,i),r_dspblut(0,i),i_debug)
              else
                i_dspactv(i_d,i) = 0
              end if
            end do
          else
            i_vxo(1,1)=0
            i_vyo(1,1)=0
            i_vxs(1,1)=i_wincols(1)
            i_vys(1,1)=i_winrows(1)
          end if
          do i=1,i_set
            call get_colortable(a_colordir,a_dspctbl(i),i_dspnumt(i),r_dspredt(0,i),r_dspgrnt(0,i),r_dspblut(0,i),i_debug)
          end do

c
c     Start Managing Window
c
c
c     Set up to Compute display stats
c

          do i_chn = 1,i_set
            i_event(0) = i_chn
            i_event(1) = 1
            i_event(2) = 11
            i_event(3) = 0
            i_event(4) = 0
            i_event(5) = 0
            i_event(6) = 0
            if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
            call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
          end do

          if (i_ponly .ne. 0) then
            i_event(0) = 0    ! tells data to go to print file instead of screen
            i_event(1) = 1
            i_event(2) = 1
            i_event(3) = (i_vxo(1,1)*r_winzoom(0))/r_winzoom(1)
            i_event(4) = (i_vyo(1,1)*r_winzoom(0))/r_winzoom(1)
            i_event(5) = ((min(i_vxs(1,1)+i_vxo(1,1),i_wincols(1))-i_vxo(1,1))*
     &          r_winzoom(0))/r_winzoom(1)
            i_event(6) = ((min(i_vys(1,1)+i_vyo(1,1),i_winrows(1))-i_vyo(1,1))*
     &          r_winzoom(0))/r_winzoom(1)
            i_event(7) = 0
            i_event(8) = i_event(4)
            i_event(9) = i_event(6)
            do i_chn=1,i_set
              i_dspactv(0,i_chn) = 1
            end do
            call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
            i_dspselect=i_dsp
            if (i_debug .eq. -22 .or. i_debug .ge. 22) write(6,*) 'Printing:',i_event(3),i_event(4),i_event(5),i_event(6)
          else
            if (r_lat .ge. -2.0d0*r_pi .and. r_lon .ge. -2.0d0*r_pi) then
              r_eux(1)=r_lat
              r_eux(2)=r_lon
              r_eux(3)=0.0
c              write(6,*) 'r_eux=',r_eux
              call get_coordinates(a_setproj(1),r_setpegv(1,1),r_dnx,r_eux,2,i_debug,i_err)
c              i_rcenter=((r_dnx(1)-r_setradr(1))/r_setrmlt(1)-i_winradr(1) )*r_winzoom(1)
c              write(6,*) 'r_dnx=',r_dnx
c              write(6,*) 'real center=',((r_dnx(1)-r_setradr(1))/r_setrmlt(1)-i_winradr(1) ),((r_dnx(2)-r_setcadr(1))/r_setcmlt(1)-i_wincadr(1) )
              i_rcenter=((r_dnx(1)-r_setradr(1))/r_setrmlt(1)-i_winradr(1) )
              i_ccenter=((r_dnx(2)-r_setcadr(1))/r_setcmlt(1)-i_wincadr(1) )
            end if
            if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) 'moving scroll to',i_ccenter,i_rcenter
            i_d=1
            if (i_winradr(i_d).ne.max(min(i_rcenter-int((32000/2)/r_winzoom(i_d)),i_setrows(1)-int(32000/r_winzoom(i_d))),0))then
               i_winradr(i_d)=max(min(i_rcenter-int((32000/2)/r_winzoom(i_d)),i_setrows(1)-int(32000/r_winzoom(i_d))),0)
               i_redraw(i_d)=1
            end if
            if (i_wincadr(i_d).ne.max(min(i_ccenter-int((32000/2)/r_winzoom(i_d)),i_setcols(1)-int(32000/r_winzoom(i_d))),0))then
               i_wincadr(i_d)=max(min(i_ccenter-int((32000/2)/r_winzoom(i_d)),i_setcols(1)-int(32000/r_winzoom(i_d))),0)
               i_redraw(i_d)=1
            end if
            if (i_redraw(i_d) .eq. 1) then
               i_redraw(i_d) = 0
               i_event(0) = i_d   ! Redraw window
               i_event(1) = 1
               i_event(2) = 1
               i_event(3) = i_vxo(i_d,1)-5
               i_event(4) = i_vyo(i_d,1)-5
               i_event(5) = i_vxs(i_d,1)
               i_event(6) = i_vys(i_d,1)
               if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
               call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
            end if
            i_cpos = nint((i_ccenter-i_wincadr(i_d))*r_winzoom(i_d)-0.5*i_vxs(i_d,1))
            i_rpos = nint((i_rcenter-i_winradr(i_d))*r_winzoom(i_d)-0.5*i_vys(i_d,1))
            call move_scroll(i_d,1,i_cpos,i_rpos)
          end if
          do while(i_done .eq. 0 .or. i_pinit .ne. 0)
            if (i_ponly .eq. 0) then
              i_event(0) = -1
            else
              i_event(0) = 0
            end if
            do while(i_event(0) .ne. 0 .and. i_done .eq. 0 .and. i_bcnt .lt. I_BMAX)
              call getevent(i_wait,i_event)
              if (i_debug .ge. 4) then
                if (i_event(0) .ne. 0 .and. i_event(2) .ne. 9 .and. i_debug .ge. 5) then
                  write(6,'(1x,a,7i10)')
     &                 'i_event=',i_event(0),i_event(1),i_event(2)
     &                 ,i_event(3),i_event(4),i_event(5),i_event(6)
                end if
              end if

              call buffer_cmd(i_event,i_bdat,i_bcnt,1,I_BMAX,i_abort,i_debug)
              if (i_debug .ge. 6) write(6,*) 'i_bcnt =',i_bcnt

              if (i_wait .eq. 0 .and. (i_bcnt .gt. 0 .or. i_ecnt .gt. 0)) then ! Update wait flag
                i_wait = 1
                iy = 0
                if (i_debug .ge. 7) write(6,*) 'turning wait off',i_wait
     &              ,i_bcnt
              end if
              if (i_wait .eq. 1 .and. (i_bcnt .eq. 0 .and. i_ecnt .eq. 0)) then
                i_wait = 0
                if (i_debug .ge. 7) write(6,*) 'turning wait on',i_wait
              end if
            end do

            if (i_bcnt .gt. 0) then ! Execute oldest action in buffer
              i_dsp = i_bdat(0,1)
              i_win = i_bdat(1,1)
              i_evn = i_bdat(2,1)

              if (i_dsp .lt. 0 .or. i_dsp .gt. I_DMAX) then
                                        ! do nothing
              else if (i_evn .eq. 1) then ! Expose Command
                if (i_win .eq. 1) then ! Window 1
                  i_col = i_bdat(3,1)
                  i_row = i_bdat(4,1)
                  i_ncx = i_bdat(5,1)
                  i_nrx = i_bdat(6,1) ! number of lines in expose event
                  if (i_ecnt .eq. I_EMAX) write(6,*) ' *** Warning *** - Too many expose commands to buffer, Skipping: ',i_col,i_row,i_ncx,i_nrx
                  i_ecnt=min(i_ecnt+1,I_EMAX)
                  do i=0,10
                    i_edat(i,i_ecnt)=i_bdat(i,1)
                  end do
                  i_scroll=0
                  if (i_ecnt .gt. 2) then ! Check if commands can be combined
                    if (i_edat(0,i_ecnt-1) .eq. i_bdat(0,1)) then ! Both events from the same display
                      if (i_edat(4,i_ecnt-1) .eq. i_bdat(4,1) .and.
     &                    i_edat(6,i_ecnt-1) .eq. i_bdat(6,1) ) then   ! Top and bottom edges line up
                        if (i_edat(3,i_ecnt-1)+i_edat(5,i_ecnt-1) .eq. i_bdat(3,1)) then   ! Scoll right
                          i_ecnt=i_ecnt-1
                          i_edat(5,i_ecnt) = i_edat(5,i_ecnt)+i_bdat(5,1)
                          i_scroll=0
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Merge Scroll Right  ',i_edat(3,i_ecnt),i_edat(5,i_ecnt)
                        else if (i_bdat(3,1)+i_bdat(5,1) .eq. i_edat(3,i_ecnt-1)) then ! Scoll left
                          i_ecnt=i_ecnt-1
                          i_edat(3,i_ecnt) = i_bdat(3,1)
                          i_edat(5,i_ecnt) = i_edat(5,i_ecnt)+i_bdat(5,1)
                          i_scroll=0
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Merge Scroll Left  ',i_edat(3,i_ecnt),i_edat(5,i_ecnt)
                        else
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Horizontal Scroll not contiguous',
     &                        i_edat(3,i_ecnt-1)+i_edat(5,i_ecnt-1),i_bdat(3,1),i_bdat(3,1)+i_bdat(5,1),i_edat(3,i_ecnt-1)
                        end if
                      else if (i_edat(3,i_ecnt-1) .eq. i_bdat(3,1) .and.
     &                    i_edat(5,i_ecnt-1) .eq. i_bdat(5,1) ) then   ! Left and right edges line upe
                        if (i_edat(4,i_ecnt-1)+i_edat(6,i_ecnt-1) .eq. i_bdat(4,1)) then   ! Scoll Down
                          i_ecnt=i_ecnt-1
                          i_edat(6,i_ecnt) = i_edat(6,i_ecnt)+i_bdat(6,1)
                          i_scroll=0
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Merge Scroll Down  ',i_edat(4,i_ecnt),i_edat(6,i_ecnt)
                        else if (i_bdat(4,1)+i_bdat(6,1) .eq. i_edat(4,i_ecnt-1)) then ! Scoll up
                          i_ecnt=i_ecnt-1
                          i_edat(4,i_ecnt) = i_bdat(4,1)
                          i_edat(6,i_ecnt) = i_edat(6,i_ecnt)+i_bdat(6,1)
                          i_scroll=1
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Merge Scroll Up  ',i_edat(4,i_ecnt),i_edat(6,i_ecnt)
                        else
                          if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'Vertical Scroll not contiguous',
     &                        i_edat(4,i_ecnt-1)+i_edat(6,i_ecnt-1),i_bdat(4,1),i_bdat(4,1)+i_bdat(6,1),i_edat(4,i_ecnt-1)
                        end if
                      end if
                    end if
                  end if
                  i_edat(7,i_ecnt)=i_scroll
                  i_edat(8,i_ecnt)=i_edat(4,i_ecnt)
                  i_edat(9,i_ecnt)=i_edat(6,i_ecnt)
                  do i=2,i_ecnt
                    i_d=i_edat(0,i)
                    i_w=i_edat(1,i)
                    if (i_d .gt. 0 .and. i_w .eq. 1) then
                      if (i_edat(3,i) .gt. i_vxo(i_d,i_w)+i_vxs(i_d,i_w)) then
                        i_edat(6,i) = -2  ! delete command
                        if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) '** Deleting expose: ',1
                      else if (i_edat(3,i)+i_edat(5,i) .lt. i_vxo(i_d,i_w)) then
                        i_edat(6,i) = -2 ! delete command
                        if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) '** Deleting expose: ',2
                      else if (i_edat(4,i) .gt. i_vyo(i_d,i_w)+i_vys(i_d,i_w)) then
                        i_edat(6,i) = -2  ! delete command
                        if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) '** Deleting expose: ',3
                      else if (i_edat(4,i)+i_edat(6,i) .lt. i_vyo(i_d,i_w)) then
                        i_edat(6,i) = -2 ! delete command
                        if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) '** Deleting expose: ',4
                      else
                        i_max=min(i_edat(3,i)+i_edat(5,i),i_vxo(i_d,i_w)+i_vxs(i_d,i_w)+1)
                        i_edat(3,i) = max(i_edat(3,i),i_vxo(i_d,i_w)-1)
                        i_edat(5,i) = i_max-i_edat(3,i)

c                       write(6,*) '***** ',i,i_edat(4,i),i_edat(6,i),i_vyo(i_d,i_w),i_vys(i_d,i_w)
                        i_max=min(i_edat(4,i)+i_edat(6,i),i_vyo(i_d,i_w)+i_vys(i_d,i_w)+1)
                        i_edat(4,i) = max(i_edat(4,i),i_vyo(i_d,i_w)-1)
                        i_edat(6,i) = i_max-i_edat(4,i)
                        i_edat(8,i)=i_edat(4,i)
                        i_edat(9,i)=i_edat(6,i)
c                       write(6,*) '***** ',i,i_edat(4,i),i_edat(6,i),i_vyo(i_d,i_w),i_vys(i_d,i_w)
                      end if
                    end if
                  end do
                if (i_debug .ge. 7) write(6,*) 'i_ecnt0= ',i_ecnt,
     &              i_bdat(1,i_ecnt),i_bdat(2,i_ecnt),i_bdat(3,i_ecnt),
     &              i_bdat(4,i_ecnt),i_bdat(5,i_ecnt),i_bdat(6,i_ecnt)
                end if
              else if (i_evn .eq. 2) then ! Configure window event
c               if (i_win .eq. 1 .and.. i_bdat(3,1) .lt. i_vxo(i_dsp,i_win)) then ! remember if scrolling up or down
c                 i_scroll = 1
c               else
c                 i_scroll = 0
c               end if
                i_vxo(i_dsp,i_win) = i_bdat(3,1) ! offset of viewport
                i_vyo(i_dsp,i_win) = i_bdat(4,1) ! offset of viewport
                i_wxs(i_dsp,i_win) = i_bdat(5,1) ! size of window
                i_wys(i_dsp,i_win) = i_bdat(6,1) ! size of window
                if (i_win .eq. 1) then
                  if (i_cset .le. 0 .and. i_cdsp .ge. 0) then
                    i_cdsp = -1
                    if (i_debug .ge. 8) write(6,*) '--Setting cdsp = -1'
                  end if
                  if (i_debug .ge. 8) write(6,*) 'i_cdsp,i_cset = ',i_cdsp,i_cset
                  if (i_debug .ge. 6) write(6,*) '** config1 =',i_dsp,i_win,i_bdat(3,1)
     &                 ,i_bdat(4,1),i_bdat(5,1),i_bdat(6,1)
                  if (i_debug .eq. -21 .and. i_win .eq. 1) write(6,*) 'vxo,vyo =',i_vxo(i_dsp,i_win),i_vyo(i_dsp,i_win)
                end if
              else if (i_evn .eq. 3) then ! Configure window event
                i_vxs(i_dsp,i_win) = i_bdat(5,1) ! size of viewport
                i_vys(i_dsp,i_win) = i_bdat(6,1) ! size of viewport
                if (i_win .eq. 1) then
                  if (i_cset .le. 0 .and. i_cdsp .ge. 0) then
                    i_cdsp = -1
                    if (i_debug .ge. 8) write(6,*) '--Setting cdsp = -1'
                  end if
                  if (i_debug .ge. 8) write(6,*) 'i_cdsp,i_cset = ',i_cdsp,i_cset
                  if (i_debug .ge. 6 .or. i_debug .eq. -6) write(6,*) '** config2 =',i_dsp,i_win,i_bdat(3,1),
     &                  i_bdat(4,1),i_bdat(5,1),i_bdat(6,1)
                  if (i_debug .eq. -21 .and. i_win .eq. 1) write(6,*) 'vxs,vys =',i_vxs(i_dsp,i_win),
     &                  i_vys(i_dsp,i_win),i_wxs(i_dsp,i_win),i_wys(i_dsp,i_win)
                end if

              else if (i_evn .eq. 4) then ! Click in window
                i_button = i_bdat(3,1)
                i_col    = i_bdat(4,1)
                i_row    = i_bdat(5,1)
                if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 'press win/button=',i_win,i_button
c                write(6,*) 'click event: ',i_dsp,i_win,i_button
                if (i_win .eq. 0) then
                  ! do nothing
                else if (i_button .eq. 4 .and. i_win .eq. 1) then
                  if (i_key .eq. 0) then ! Scroll Bar up
                    if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*)
     &                    'Scroll up',i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1))))
!                   call move_scroll(i_dsp,1,i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1)))))
                    call move_scroll(i_dsp,1,i_vxo(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1))))
                  else ! Scroll Bar left
!                   call move_scroll(i_dsp,1,min(i_wxs(i_dsp,1),max(0,i_vxo(i_dsp,1)-int(0.2*i_vxs(i_dsp,1)))),i_vyo(i_dsp,1))
                    call move_scroll(i_dsp,1,max(0,i_vxo(i_dsp,1)-int(0.2*i_vxs(i_dsp,1))),i_vyo(i_dsp,1))
                  end if
                else if (i_button .eq. 5 .and. i_win .eq. 1) then
                  if (i_key .eq. 0) then  ! Scroll Bar down
!                   write(6,*) 'xxx ',i_wys(i_dsp,1),i_vyo(i_dsp,1),i_vys(i_dsp,1)
                    if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*)
     &                    'Scroll down',i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1))))
!                   call move_scroll(i_dsp,1,i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1)))))
                    call move_scroll(i_dsp,1,i_vxo(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1))))
                  else ! Scroll Bar right
!                   call move_scroll(i_dsp,1,min(i_wxs(i_dsp,1),max(0,i_vxo(i_dsp,1)+int(0.2*i_vxs(i_dsp,1)))),i_vyo(i_dsp,1))
                    call move_scroll(i_dsp,1,max(0,i_vxo(i_dsp,1)+int(0.2*i_vxs(i_dsp,1))),i_vyo(i_dsp,1))
                  end if
                else if (i_button .eq. 6 .and. i_win .eq. 1) then
                  if (i_key .ne. 0) then ! Scroll Bar up
                    if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*)
     &                    'Scroll up',i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1))))
!                   call move_scroll(i_dsp,1,i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1)))))
                    call move_scroll(i_dsp,1,i_vxo(i_dsp,1),max(0,i_vyo(i_dsp,1)-int(0.2*i_vys(i_dsp,1))))
                  else ! Scroll Bar left
!                   call move_scroll(i_dsp,1,min(i_wxs(i_dsp,1),max(0,i_vxo(i_dsp,1)-int(0.2*i_vxs(i_dsp,1)))),i_vyo(i_dsp,1))
                    call move_scroll(i_dsp,1,max(0,i_vxo(i_dsp,1)-int(0.2*i_vxs(i_dsp,1))),i_vyo(i_dsp,1))
                  end if
                else if (i_button .eq. 7 .and. i_win .eq. 1) then
                  if (i_key .ne. 0) then  ! Scroll Bar down
!                   write(6,*) 'xxx ',i_wys(i_dsp,1),i_vyo(i_dsp,1),i_vys(i_dsp,1)
                    if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*)
     &                    'Scroll down',i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1))))
!                   call move_scroll(i_dsp,1,i_vxo(i_dsp,1),min(i_wys(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1)))))
                    call move_scroll(i_dsp,1,i_vxo(i_dsp,1),max(0,i_vyo(i_dsp,1)+int(0.2*i_vys(i_dsp,1))))
                  else ! Scroll Bar right
!                   call move_scroll(i_dsp,1,min(i_wxs(i_dsp,1),max(0,i_vxo(i_dsp,1)+int(0.2*i_vxs(i_dsp,1)))),i_vyo(i_dsp,1))
                    call move_scroll(i_dsp,1,max(0,i_vxo(i_dsp,1)+int(0.2*i_vxs(i_dsp,1))),i_vyo(i_dsp,1))
                  end if
                else if (i_button .ge. 8) then  !
                  ! do nothing
                else if (i_win .eq. 1) then ! Click in window 1
c                  write(6,*) 'in window 1'
                  i_event(0) = i_dsp
                  i_event(1) = i_win
                  i_event(2) = 13
                  i_event(3) = i_button
                  i_event(4) = i_col
                  i_event(5) = i_row
                  i_event(6) = 1
c                  write(6,*) 'adding event to buffer =',i_bcnt,i_dsp,i_win,4,-i_button
                  call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                else if (i_win .eq. -1) then ! Click in label for window 1
                  if (i_key .eq. 0 .or. a_setproj(1) .eq. ' ' .or.
     &                           r_setrmlt(1) .eq. 0. .or. r_setcmlt(1) .eq. 0.) then
                    if (i_debug .ge. 5) write(6,*) 'i_bdat(3,1)=',i_bdat(3,1)
                    do i=0,20
                      a_elabl(i)=' '
                      a_edata(i)=' '
                    end do
                    a_elabl(1)='Enter Col, Row: '
                    a_edata(1)=' '
c                    do i=1,10
c                      write(86,*) a_elabl(i)
c                      do j=1,160
c                        write(86,*) ichar(a_elabl(i)(j:j)),' ',a_elabl(i)(j:j)
c                      end do
c                    end do
                    call entry_window(0,a_elabl,a_edata)
                    i_dspselect=i_dsp
                    a_elabl(1)=' '
                    a_edata(1)=' '
                  else
                    do i=0,20
                      a_elabl(i)=' '
                      a_edata(i)=' '
                    end do
                    a_elabl(2)='Enter Lat,Lon: '
                    a_edata(2)=' '
                    call entry_window(0,a_elabl,a_edata)
                    i_dspselect=i_dsp
                    a_elabl(2)=' '
                    a_edata(2)=' '
                  end if
                else if (i_win .ge. 2 .and. i_win .le. i_set+1) then  ! Click on set button  ! max(4,min(i_set+1+2*i_close,I_CMAX+2)) ) then ! Click on Buttons
                  if (i_shft .eq. 0) then
                    if (i_button .le. 0) then
                      if (i_debug .ge. 1) write(6,*) 'Button press error',i_button
                    else if (i_button .eq. 1) then
                      if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'i_dsp ',i_dsp
     &                      ,'   Button',i_win-1,' - left click',i_dsp
                      do i_chn=1,i_set
                        if (i_chn .eq. i_win-1) then
                          i_dspactv(i_dsp,i_win-1) = 1
                          call set_button_shadow(i_dsp,i_chn+1,1,i_debug)
                        else
                          i_dspactv(i_dsp,i_chn) = 0
                          call set_button_shadow(i_dsp,i_chn+1,0,i_debug)
                        end if
                      end do
                    else if (i_button .eq. 2) then
                      if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'i_dsp ',i_dsp
     &                      ,'   Button',i_win-1,' - middle click'
     &                      ,i_dsp
                      i_dspactv(i_dsp,i_win-1) = 1-i_dspactv(i_dsp,i_win-1)
                      if (i_dspactv(i_dsp,i_win-1) .eq. 1) then
                        call set_button_shadow(i_dsp,i_win,1,i_debug)
                      else
                        call set_button_shadow(i_dsp,i_win,0,i_debug)
                      end if
                    else if (i_button .eq. 3) then
                      if (i_debug .eq. -4 .or. i_debug .ge. 4) write(6,*) 'i_dsp ',i_dsp
     &                      ,'   Button',i_win-1,' - right click',i_dsp
                      i_chn=i_win-1
                      a_labels(0)=a_setname(i_chn)(1:max(1,rdflen(a_setname(i_chn))))//' Parameters'
                      if (i_dspmode(i_chn) .eq. 1) then
                        a_data(1)='1|Range|SDEV|PER|NORM|CW|Wrap'
                      else if (i_dspmode(i_chn) .eq. 2) then
                        a_data(1)='2|Range|SDEV|PER|NORM|CW|Wrap'
                      else if (i_dspmode(i_chn) .eq. 3) then
                        a_data(1)='3|Range|SDEV|PER|NORM|CW|Wrap'
                      else if (i_dspmode(i_chn) .eq. 4) then
                        a_data(1)='4|Range|SDEV|PER|NORM|CW|Wrap'
                      else if (i_dspmode(i_chn) .eq. 5) then
                        a_data(1)='5|Range|SDEV|PER|NORM|CW|Wrap'
                      else
                        a_data(1)='6|Range|SDEV|PER|NORM|CW|Wrap'
                      end if
c                      write(a_data(1),'(I10)') i_dspmode(i_chn)
                      if (i_dspmode(i_chn) .eq. 1) then
                        a_labels(2)='Range:'
                        write(a_data(2),'(f15.4)') r_dspmult(i_chn)
                        a_labels(3)='Offset:'
                        write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                      else if (i_dspmode(i_chn) .eq. 2) then
                        a_labels(2)='SDEV Factor:'
                        write(a_data(2),'(f15.2)') r_dspval1(i_chn)
                        a_labels(3)='Offset:'
                        write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                      else if (i_dspmode(i_chn) .eq. 3) then
                        a_labels(2)='Percent:'
                        write(a_data(2),'(f15.2)') r_dspval2(i_chn)
                        a_labels(3) = '|'
                        a_data(3)   = ' '
                      else if (i_dspmode(i_chn) .eq. 4) then
                        a_labels(2)=' '
                        write(a_data(2),'(f15.2)') r_dspmult(i_chn)
                        a_labels(3)='|'
                        a_data(3)  =' '
                        write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                      else if (i_dspmode(i_chn) .eq. 5) then
                        a_labels(2)='CW Scale:'
                        write(a_data(2),'(f15.2)') r_dspval3(i_chn)
                        a_labels(3) = '|'
                        a_data(3)   = ' '
                      else
                        a_labels(2)='Wrap:'
                        write(a_data(2),'(f15.4)') r_dspwrap(i_chn)
                        a_labels(3)='Offset:'
                        write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                      end if
                      call encodeval(r_dspexpn(i_chn),a_data(4))
                      call encodeval(r_setvmin(i_chn),a_data(5))
                      call encodeval(r_setvmax(i_chn),a_data(6))
                      call encodeval(r_dspcplw(i_chn),a_data(7))
                      call encodeval(r_dspcphi(i_chn),a_data(8))
c                      write(a_data(4),'(f15.4)') r_dspexpn(i_chn)
c                      write(a_data(5),'(f15.4)') r_setvmin(i_chn)
c                      write(a_data(6),'(f15.4)') r_setvmax(i_chn)
c                      write(a_data(7),'(f15.4)') r_dspcplw(i_chn)
c                      write(a_data(8),'(f15.4)') r_dspcphi(i_chn)
                      i_colorset=0
                      do i=1,i_colormax
                        if (a_dspctbl(i_chn) .eq. a_colorfile(i)) i_colorset=i
                      end do
                      if (i_colorset .gt. 0) then
                        write(a_data(9),'(i2)') i_colorset
                        do i=1,i_colormax
                          a_data(9)=a_data(9)(1:rdflen(a_data(9)))//'|'//a_colorname(i)
                        end do
                        if (a_data(9)(1:1) .eq. ' ') a_data(9)=a_data(9)(2:)
                      else
                        a_data(9)=a_dspctbl(i_chn)
                      end if
                      call entry_window(i_chn,a_labels,a_data)
c                      call entry_window(i_chn,a_labels,a_data)  ! Hack to get around some memory bug
                      if (i_win .eq. 5) then
c                          call mv_getfile(a_filename)
                      end if
                    end if
                    if (i_dsp .gt. 0) then ! Redraw window 1 if event from a display click
                      i_event(0) = i_dsp
                      i_event(1) = 1
                      i_event(2) = 1
                      i_event(3) = i_vxo(i_dsp,1)-5
                      i_event(4) = i_vyo(i_dsp,1)-5
                      i_event(5) = i_vxs(i_dsp,1)
                      i_event(6) = i_vys(i_dsp,1)
                      if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                      call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    end if
                  else ! Create Colorbar
                    i_shft = 0
                    i_chn=i_win-1
                    a_file=a_workdir(1:rdflen(a_workdir))//'colorbar.agr'
                    open(unit=97,file=a_file,status='unknown',form='formatted')
                    do i=0,min(i_dspnumt(i_chn)-1,252)
                      write(97,'(5(a,i3),a)') '@map color ',i+2,' to (',
     &                 int(255*r_dspredt(i,i_chn)),', ',int(255*r_dspgrnt(i,i_chn)),', ',int(255*r_dspblut(i,i_chn)),'), "',i,' "'
                    end do
                    write(97,'(4(a,i3),a)') '@map color ',255,' to (',150,', ',150,', ',150,'), "Grey"'
c                    write(6,*) 'dspmult = ',r_dspmult(i_chn),r_dspmult(i_chn)/5,alog10(r_dspmult(i_chn)/5.)
c                    write(6,*) 'nintlog = ',nint(alog10(r_dspmult(i_chn)/5.))
c                    write(6,*) 'spacing = ',10.**nint(alog10(r_dspmult(i_chn)/5))
                    r_space = 10.**nint(alog10(r_dspmult(i_chn)/5))
                    if (r_space .gt. r_dspmult(i_chn)/4) r_space = r_space/2
                    if (r_space .gt. r_dspmult(i_chn)/4) r_space = r_space/2
                    if (r_space .gt. r_dspmult(i_chn)/4) r_space = r_space/2
                    if (r_space .lt. r_dspmult(i_chn)/8) r_space = r_space*2
                    if (r_space .lt. r_dspmult(i_chn)/8) r_space = r_space*2
                    if (r_space .lt. r_dspmult(i_chn)/8) r_space = r_space*2
c                    write(6,'(a,e15.4)') '@xaxis  tick major ',r_space

                    write(97,'(a)') '@version 50114'
                    write(97,'(a)') '@g0 on'
                    write(97,'(a)') '@with g0'
                    write(97,'(a,e15.4)') '@    world xmin ',r_dspaddr(i_chn)
                    write(97,'(a,e15.4)') '@    world xmax ',r_dspaddr(i_chn)+r_dspmult(i_chn)
                    write(97,'(a,e15.4)') '@xaxis  tick major ',r_space
                    write(97,'(a)') '@view xmin 0.10'
                    write(97,'(a)') '@view xmax 0.55'
                    write(97,'(a)') '@view ymin 0.85'
                    write(97,'(a)') '@view ymax 0.90'
                    write(97,'(a)') '@xaxis  on'
                    write(97,'(a)') '@yaxis  off'
                    write(97,'(a)') '@s0 symbol 2'
                    write(97,'(a)') '@s0 symbol size 0.2'
                    write(97,'(a)') '@s0 symbol fill color 1'
                    write(97,'(a)') '@s0 symbol fill pattern 1'
                    write(97,'(a)') '@s0 symbol linewidth 1.0'
                    write(97,'(a)') '@s0 symbol linestyle 0'
                    write(97,'(a)') '@s0 linestyle 0'
                    write(97,'(a)') '@s0 fill pattern 1'
                    write(97,'(a)') '@s0 line type 0'
                    write(97,'(a)') '@subtitle "Colorbar for '//a_setname(i_chn)(1:rdflen(a_setname(i_chn)))//'"'
                    write(97,'(a)') '@type xycolor'
                    do i=0,499
                      do j=0,100
                          r_value = max(r_dspcplw(i_chn),min(r_dspcphi(i_chn),i*r_dspmult(i_chn)/500+r_dspaddr(i_chn)))     ! Clip data
                          r_value = (r_value-r_dspaddr(i_chn))                              ! Shift data
                          if (i_dspmode(i_chn) .eq. 6) then                                 ! Wrap data
                            r_value = wrap(r_value,r_dspwrap(i_chn))
                          end if
                          r_value = r_value/r_dspmult(i_chn)                                ! Scale data
                          if (r_dspexpn(i_chn) .ne. 1.0) then                               ! Compress data
                            r_value = min(1.0,max(0.0,r_value))**r_dspexpn(i_chn)
                          end if
                          i_value = max(0,min(i_dspnumt(i_chn)-1,int(i_dspnumt(i_chn)*r_value)))
                        write(97,*) i*r_dspmult(i_chn)/500+r_dspaddr(i_chn),j/100.,min(i_value+2,254)
                      end do
                    end do
                    close(97)
                    a_command = 'xmgrace -noask -barebones -geometry 500x200 '//a_file(1:rdflen(a_file))//' &'
                    write(6,*) 'Displaying Colorbar for ',a_setname(i_chn)(1:rdflen(a_setname(i_chn)))
                    call system(a_command)

                  end if
                else if (i_win .eq.  max(4,min(i_set+1+2*i_close,I_CMAX+2)) ) then ! Click on close button
                  if (i_close .eq. 1) call destroy_display(i_dsp) ! Closes Display  change to: i_done = 1 if to quit whole program
                end if


              else if (i_evn .eq. 5) then ! button Release
                if (i_win .eq. 1 ) then ! button Release in window 1
                  i_button = i_bdat(3,1)
                  i_col    = i_bdat(4,1)
                  i_row    = i_bdat(5,1)
                  if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 'release win/button=',i_win,i_button
                  if (i_win .eq. 1 .and. (i_button .eq. 1 .or. i_button .eq. 3)) then
                    i_event(0) = i_dsp
                    i_event(1) = i_win
                    i_event(2) = 13
                    i_event(3) = i_button
                    i_event(4) = i_col
                    i_event(5) = i_row
                    i_event(6) = 3
c                    write(6,*) 'adding event to buffer =',i_bcnt,i_dsp,i_win,4,-i_button
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                end if
                i_button = 0
              else if (i_evn .eq. 6) then ! Key Press
                i_key = i_bdat(3,1)
                i_asc = i_bdat(6,1)
                if (i_debug .eq. -7 .or. i_debug .ge. 7) write(6,*) 'Key Press:   ',i_key,i_asc
                if (i_key .eq. 62 .or. i_asc .eq. 65507) then
                  i_cntl = 1
                else if (i_key .eq. 64 .or. i_asc .eq. 65505) then
                  i_shft = 1
                else if (i_pset .eq. 1) then
                  if (i_asc .eq. ichar('p') .or. i_asc .eq. ichar('P')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=6
                    i_event(5)=1
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('f') .or. i_asc .eq. ichar('F')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=6
                    i_event(5)=2
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('s') .or. i_asc .eq. ichar('S')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=6
                    i_event(5)=3
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                  i_pset = 0
                  i_cntl = 0
                else if (i_sset .eq. 1) then
                  if (i_asc .eq. ichar('p') .or. i_asc .eq. ichar('P')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=5
                    i_event(5)=1
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('l') .or. i_asc .eq. ichar('L')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=5
                    i_event(5)=2
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('r') .or. i_asc .eq. ichar('R')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=5
                    i_event(5)=3
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('c') .or. i_asc .eq. ichar('C')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=5
                    i_event(5)=4
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                  i_sset = 0
                  i_cntl = 0
                else if (i_cntl .eq. 1) then
                  if (i_asc .eq. ichar('a') .or. i_asc .eq. ichar('A')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=1
                    i_event(5)=1
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    i_cntl = 0
                  else if (i_asc .eq. ichar('q') .or. i_asc .eq. ichar('Q')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=1
                    i_event(5)=2
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('d') .or. i_asc .eq. ichar('D')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=2
                    i_event(5)=1
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('k') .or. i_asc .eq. ichar('K')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=2
                    i_event(5)=2
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    i_cntl = 0
                  else if (i_asc .eq. ichar('r') .or. i_asc .eq. ichar('R')) then   ! Resize Display
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=2
                    i_event(5)=3
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('n') .or. i_asc .eq. ichar('N')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=4
                    i_event(5)=1
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('+') .or. i_asc .eq. ichar('=')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=4
                    i_event(5)=2
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('-') .or. i_asc .eq. ichar('_')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=4
                    i_event(5)=3
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('1') .or. i_asc .eq. ichar('!')) .and. i_set .ge. 1) then ! shortcut to open display parameter window 1
                    i_event(0)=i_dsp
                    i_event(1)=2
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('2') .or. i_asc .eq. ichar('@')) .and. i_set .ge. 2) then ! shortcut to open display parameter window 2
                    i_event(0)=i_dsp
                    i_event(1)=3
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('3') .or. i_asc .eq. ichar('#')) .and. i_set .ge. 3) then ! shortcut to open display parameter window 3
                    i_event(0)=i_dsp
                    i_event(1)=4
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('4') .or. i_asc .eq. ichar('$')) .and. i_set .ge. 4) then ! shortcut to open display parameter window 4
                    i_event(0)=i_dsp
                    i_event(1)=5
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('5') .or. i_asc .eq. ichar('%')) .and. i_set .ge. 5) then ! shortcut to open display parameter window 5
                    i_event(0)=i_dsp
                    i_event(1)=6
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if ((i_asc .eq. ichar('6') .or. i_asc .eq. ichar('^')) .and. i_set .ge. 6) then ! shortcut to open display parameter window 6
                    i_event(0)=i_dsp
                    i_event(1)=6
                    i_event(2)=4
                    i_event(3)=3
                    i_event(4)=0
                    i_event(5)=0
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_asc .eq. ichar('z') .or. i_asc .eq. ichar('Z')) then
                    i_event(0)=i_dsp
                    i_event(1)=0
                    i_event(2)=0
                    i_event(3)=0
                    i_event(4)=4
                    i_event(5)=4
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    i_cntl = 0
                  else if (i_asc .eq. ichar('p') .or. i_asc .eq. ichar('P')) then
                    i_pset=1
                    if (i_debug .gt. 9) write(6,*) 'i_pset = ',i_pset,i_key,i_asc
                  else if (i_asc .eq. ichar('s') .or. i_asc .eq. ichar('S')) then  ! select menu set
                    i_sset=1
                    if (i_debug .gt. 9) write(6,*) 'i_sset = ',i_sset,i_key,i_asc
                  else if (i_asc .eq. ichar('t') .or. i_asc .eq. ichar('T')) then  ! tool menu set
                    i_tset=1
                    if (i_debug .gt. 9) write(6,*) 'i_tset = ',i_tset,i_key,i_asc
                  end if
                else if (i_asc .eq. ichar('c') .or. i_asc .eq. ichar('C')) then
                  i_samps=0
                  i_redraw(i_dsp) = 1
                  if (i_redraw(i_dsp) .eq. 1) then
                    i_redraw(i_dsp) = 0
                    i_event(0) = i_dsp   ! Redraw window
                    i_event(1) = 1
                    i_event(2) = 1
                    i_event(3) = i_vxo(i_dsp,1)-5
                    i_event(4) = i_vyo(i_dsp,1)-5
                    i_event(5) = i_vxs(i_dsp,1)
                    i_event(6) = i_vys(i_dsp,1)
                    if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                else if (i_asc .eq. ichar('d') .or. i_asc .eq. ichar('D')) then
                  i_show=1-i_show
                  do i=0,20
                    a_elabl(i)=' '
                    a_edata(i)=' '
                  end do
                  a_elabl(6)='Display: '
                  write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                  a_elabl(7)='Mode: '
                  write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                  call entry_window(0,a_elabl,a_edata)
                  i_dspselect=i_dsp
                  a_elabl(6)=' '
                  a_edata(6)=' '
                  a_elabl(7)=' '
                  a_edata(7)=' '
                  i_event(0) = i_dsp   ! Redraw window
                  i_event(1) = 1
                  i_event(2) = 1
                  i_event(3) = i_vxo(i_dsp,1)-5
                  i_event(4) = i_vyo(i_dsp,1)-5
                  i_event(5) = i_vxs(i_dsp,1)
                  i_event(6) = i_vys(i_dsp,1)
                  if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                  call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                else if (i_asc .eq. ichar('n') .or. i_asc .eq. ichar('N')) then
                  i_smode=0
                  do i=0,20
                    a_elabl(i)=' '
                    a_edata(i)=' '
                  end do
                  a_elabl(6)='Display: '
                  write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                  a_elabl(7)='Mode: '
                  write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                  call entry_window(0,a_elabl,a_edata)
                  i_dspselect=i_dsp
                  a_elabl(6)=' '
                  a_edata(6)=' '
                  a_elabl(7)=' '
                  a_edata(7)=' '
                else if (i_asc .eq. ichar('p') .or. i_asc .eq. ichar('P')) then
                  i_smode=1
                  i_show=1
                  do i=0,20
                    a_elabl(i)=' '
                    a_edata(i)=' '
                  end do
                  a_elabl(6)='Display: '
                  write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                  a_elabl(7)='Mode: '
                  write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                  call entry_window(0,a_elabl,a_edata)
                  i_dspselect=i_dsp
                  a_elabl(6)=' '
                  a_edata(6)=' '
                  a_elabl(7)=' '
                  a_edata(7)=' '
                else if (i_asc .eq. ichar('l') .or. i_asc .eq. ichar('L')) then
                  i_smode=2
                  i_show=1
                  do i=0,20
                    a_elabl(i)=' '
                    a_edata(i)=' '
                  end do
                  a_elabl(6)='Display: '
                  write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                  a_elabl(7)='Mode: '
                  write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                  call entry_window(0,a_elabl,a_edata)
                  i_dspselect=i_dsp
                  a_elabl(6)=' '
                  a_edata(6)=' '
                  a_elabl(7)=' '
                  a_edata(7)=' '
                else if (i_asc .eq. ichar('r') .or. i_asc .eq. ichar('R')) then
                  i_smode=3
                  i_show=1
                  do i=0,20
                    a_elabl(i)=' '
                    a_edata(i)=' '
                  end do
                  a_elabl(6)='Display: '
                  write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                  a_elabl(7)='Mode: '
                  write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                  call entry_window(0,a_elabl,a_edata)
                  i_dspselect=i_dsp
                  a_elabl(6)=' '
                  a_edata(6)=' '
                  a_elabl(7)=' '
                  a_edata(7)=' '
                end if
              else if (i_evn .eq. 7) then ! Key Release
                if (i_bdat(3,1) .eq. 62 .or. i_bdat(6,1) .eq. 65507) i_cntl = 0
                if (i_bdat(3,1) .eq. 64 .or. i_bdat(6,1) .eq. 65505) i_shft = 0
                if (i_debug .eq. -7 .or. i_debug .ge. 7) write(6,*) 'Key Release: ',i_bdat(3,1),i_bdat(6,1)
c                i_cntl = 0
                i_key = 0
                i_asc = 0
              else if (i_evn .eq. 8) then ! Destroy Window event
                if (i_debug .ge. 6) write(6,*) '*** Window Destroyed: ',i_dsp,i_win
                i_winactv(i_dsp) = 0
                do ib = 1,i_bcnt ! Clear out any remaining event in buffer for destroyed window
                  if (i_bdat(0,ib) .eq. i_dsp .and. i_bdat(1,ib) .eq. i_win) then
                    do ie = 0,10
                      i_bdat(ie,ib) = 0
                    end do
                  end if
                end do
                i_done = 1
                do i_d=1,I_DMAX
                  if (i_winactv(i_d) .eq. 1) i_done = 0
                end do
              else if (i_evn .eq. 9) then ! Mouse motion
                i_button = nint(i_bdat(3,1)/256.)
                if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 'button in motion = ',i_bdat(3,1),nint(i_bdat(3,1)/256.)
                if (i_button .eq. 4) then
                  i_button = 3
                end if
                i_col    = i_bdat(4,1)
                i_row    = i_bdat(5,1)
                if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 'motion win/button=',i_win,i_button
                if (i_win .eq. 1 .and. (i_button .eq. 1 .or. i_button .eq. 3)) then
                  i_event(0) = i_dsp
                  i_event(1) = i_win
                  i_event(2) = 13
                  i_event(3) = i_button
                  i_event(4) = i_col
                  i_event(5) = i_row
                  i_event(6) = 2
c                  write(6,*) 'i_bcnt2 =',i_bcnt
                  call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                end if
              else if (i_evn .eq. 10) then ! Entry Window change
                i_chn    = i_bdat(0,1)
                if (i_chn .lt. 0) write(6,*) '*** i_chn Error ***   ',i_chn
                i_field  = i_bdat(4,1)
                i_value  = i_bdat(5,1)
                i_msgid  = i_bdat(6,1)
                call get_message(i_msgid,a_message)
                if (i_chn .gt. 0) then
                  if (i_field .ne. 9) then
                    if (index(a_message,'.') .eq. 0 .and. index(a_message,'*') .eq. 0 .and.
     &                 rdflen(a_message) .gt. 0) a_message=a_message(1:rdflen(a_message))//'.'
                  end if
                  if (i_debug .ge. 6) write(6,*) 'channel=',i_chn,'   field=',i_field,
     &                                           '   ival=',i_value,'  msg=',a_message(1:30)
                  if (i_field .eq. 1) then
                    i_ewupdate=1
                    if (i_value .eq. 1) then                       ! Range Mode
                      i_dspmult(i_chn) = 0
                      i_dspaddr(i_chn) = 0
                      i_dspmode(i_chn)=i_value
                    else if (i_value .eq. 2) then                  ! SDEV Mode
                      if (r_dspval1(i_chn) .eq. 0) r_dspval1(i_chn)=2.0
                      if (i_dspmode(i_chn) .eq. 2) then
                        i_dspaddr(i_chn) = 1
                      end if
                      i_dspmult(i_chn)=1
                      i_dspmode(i_chn)=i_value
                    else if (i_value .eq. 3) then                  ! Percent Mode
                      if (r_dspval2(i_chn) .eq. 0) r_dspval2(i_chn)=90.0
                      i_dspaddr(i_chn)=1
                      i_dspmult(i_chn)=1
                      i_dspmode(i_chn)=i_value
                    else if (i_value .eq. 5) then                  ! CW Mode
                      if (r_dspval3(i_chn) .eq. 0) r_dspval3(i_chn)=1.0
                      r_dspaddr(i_chn)=0
                      i_dspaddr(i_chn)=0
                      i_dspmult(i_chn)=1
                      i_dspmode(i_chn)=i_value
                    else if (i_value .eq. 6) then
                      if (i_dspmode(i_chn) .ne. 6) then
                        r_dspwrap(i_chn) = r_dspmult(i_chn)
                        r_dspaddr(i_chn) = 0
                        i_dspmult(i_chn) = 0
                        i_dspaddr(i_chn) = 0
                      end if
                      i_dspmode(i_chn)=i_value
                    end if
                  else if (i_field .eq. 2) then
                    call decodeval(a_message,r_value,i_err)
c                    read(a_message,*,iostat=i_err) r_value
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
                      if (i_dspmode(i_chn) .eq. 1) then
                        if (r_value .ne. 0.) then
                          r_dspmult(i_chn) = r_value
                          i_dspmult(i_chn) = 0
                        else
                          i_dspmult(i_chn) = 1
                          r_dspval1(i_chn) = 2
                        end if
                      else if (i_dspmode(i_chn) .eq. 2) then
                        if (r_value .ne. 0. ) then
                          r_dspval1(i_chn) = r_value
                          i_dspmult(i_chn) = 1
                        else
                          if (r_dspval1(i_chn) .eq. 0) r_dspval1(i_chn)=2.0
                        end if
                      else if (i_dspmode(i_chn) .eq. 3) then
                        if (r_value .ne. 0.) then
                          r_dspval2(i_chn) = r_value
                          i_dspmult(i_chn) = 1
                        else
                          if (r_dspval2(i_chn) .eq. 0) r_dspval2(i_chn)=90.0
                        end if
                      else if (i_dspmode(i_chn) .eq. 4) then
                         ! undefined
                      else if (i_dspmode(i_chn) .eq. 5) then
                        if (r_value .ne. 0.) then
                          r_dspval3(i_chn) = r_value
                          i_dspmult(i_chn) = 1
                        else
                          if (r_dspval3(i_chn) .eq. 0) r_dspval1(i_chn)=1.0
                        end if
                      else if (i_dspmode(i_chn) .eq. 6) then
                        if (r_value .ne. 0.) r_dspwrap(i_chn) = r_value
                        r_dspmult(i_chn)=r_dspwrap(i_chn)
                      end if
                    end if
                  else if (i_field .eq. 3) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_dspaddr(i_chn)) i_ewupdate = 1
                      r_dspaddr(i_chn) = r_value
                      i_dspaddr(i_chn)=0
                    end if
                  else if (i_field .eq. 4) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_dspexpn(i_chn)) i_ewupdate = 1
                      r_dspexpn(i_chn) = r_value
                    end if
                  else if (i_field .eq. 5) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_setvmin(i_chn)) i_ewupdate = 1
                      r_setvmin(i_chn) = r_value
                    end if
                  else if (i_field .eq. 6) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_setvmax(i_chn)) i_ewupdate = 1
                      r_setvmax(i_chn) =  r_value
                    end if
                  else if (i_field .eq. 7) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_dspcplw(i_chn)) i_ewupdate = 1
                      r_dspcplw(i_chn) = r_value
                    end if
                  else if (i_field .eq. 8) then
                    call decodeval(a_message,r_value,i_err)
                    if (i_err .ne. 0) then
                      i_ewupdate = 1
                    else
c                     if (r_value .ne. r_dspcphi(i_chn)) i_ewupdate = 1
                      r_dspcphi(i_chn) = r_value
                    end if
                  else if (i_field .eq. 9) then
c                    if (a_message .eq. ' ') then
                    if (i_value .ne. 0) then
                      i_colorset = i_value
                      if (i_colorset .gt. 0 .and. i_colorset .le. i_colormax) then
                        if (a_colorfile(i_colorset) .ne. a_dspctbl(i_chn)) i_ewupdate = 1
                        a_dspctbl(i_chn)=a_colorfile(i_colorset)
                        if (i_colorset .eq. 1) a_dspctbl(i_chn)=' '
                        i_colorset = 0
                      end if
                    else
                      if (a_message .eq. ' ') a_message='?'
                      if (a_message .ne. a_dspctbl(i_chn)) i_ewupdate = 1
                      a_dspctbl(i_chn)=a_message
                      if (index(a_dspctbl(i_chn),' - not found.  Using grey') .gt. 1) then
                        a_dspctbl(i_chn)=a_dspctbl(i_chn)(1:index(a_dspctbl(i_chn),' - not found.  Using grey')-1)
                      end if
                    end if
                    call get_colortable(a_colordir,a_dspctbl(i_chn),i_dspnumt(i_chn),
     &                    r_dspredt(0,i_chn),r_dspgrnt(0,i_chn),r_dspblut(0,i_chn),i_debug)
                  end if
c                 if (i_dspmult(i_chn) .eq. 1 .or. i_dspaddr(i_chn) .eq. 1) then
                  if (1 .eq. 1) then
                    i_event(0) = i_chn
                    i_event(1) = 1
                    i_event(2) = 11
                    i_event(3) = 0
                    i_event(4) = 0
                    i_event(5) = 0
                    i_event(6) = 0
                    if (i_debug .ge. 6) write(6,*) 'Going to recompute mean/Std   i_bcnt2 =',i_bcnt
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                  if (1 .eq. i_ewupdate) then        ! Add command to buffer to re-draw entry window
                    i_event(0) = 0
                    i_event(1) = i_chn+1
                    i_event(2) = 4
                    i_event(3) = 3
                    i_event(4) = 0
                    i_event(5) = 0
                    i_event(6) = 0
                    if (i_debug .ge. 6) write(6,*) 'Going to redraw entry window   i_bcnt2 =',i_bcnt
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    i_ewupdate = 0
                  end if
                  do i_d=1,I_DMAX
                    if (i_debug .ge. 6) write(6,*) 'i_winactv=',i_winactv(i_d),i_d
                    if (i_winactv(i_d) .eq. 1) then
                      i_event(0) = i_d
                      i_event(1) = 1
                      i_event(2) = 1
                      i_event(3) = i_vxo(i_d,1)-5
                      i_event(4) = i_vyo(i_d,1)-5
                      i_event(5) = i_vxs(i_d,1)
                      i_event(6) = i_vys(i_d,1)
                      if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                      call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    end if
                  end do
c              write(a_data(1),'(i10)') i_dspmode(i_chn)
c                 if (i_dspmode(i_chn) .eq. 1) then
c                   a_labels(2)='Range:'
c                   write(a_data(2),'(f15.4)') r_dspmult(i_chn)
c              else if (i_dspmode(i_chn) .eq. 2) then
c                   a_labels(2)='SDEV Factor:'
c                    write(a_data(2),'(f15.2)') r_dspval1(i_chn)
c                 else
c                   a_labels(2)='Wrap:'
c                   write(a_data(2),'(f15.4)') r_dspwrap(i_chn)
c              end if
c              write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
c              write(a_data(4),'(f15.4)') r_setvmin(i_chn)
c              write(a_data(5),'(f15.4)') r_setvmax(i_chn)
c              write(a_data(6),'(f15.4)') r_dspcplw(i_chn)
c              write(a_data(7),'(f15.4)') r_dspcphi(i_chn)
c              a_data(8)=a_dspctbl(i_chn)
c                 call entry_window(i_chn,a_labels,a_data)
                 else
                   if (i_field .eq. 1) then
                     read(a_message,*,iostat=i_err) i_col,i_row
                     if (i_err .eq. 0) then
                       i_rcenter=i_row
                       i_ccenter=i_col
                       i_cdsp=i_dspselect
c                      write(6,*) 'i_key=',i_key
                       if (i_debug .ge. 9) write(6,*) 'moving scroll to',i_ccenter,i_rcenter
                       if (i_winactv(i_dspselect) .ne. 0) then
                         if (i_winradr(i_dspselect) .ne.
     &                        max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0) ) then
                           i_winradr(i_dspselect) =
     &                        max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0)
                           i_redraw(i_dspselect)=1
                         end if
                         if (i_wincadr(i_dspselect) .ne.
     &                        max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0) ) then
                           i_wincadr(i_dspselect) =
     &                        max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0)
                           i_redraw(i_dspselect)=1
                         end if
                         if (i_redraw(i_dspselect) .eq. 1) then
                           i_redraw(i_dspselect) = 0
                           i_event(0) = i_dspselect   ! Redraw window
                           i_event(1) = 1
                           i_event(2) = 1
                           i_event(3) = i_vxo(i_dspselect,1)-5
                           i_event(4) = i_vyo(i_dspselect,1)-5
                           i_event(5) = i_vxs(i_dspselect,1)
                           i_event(6) = i_vys(i_dspselect,1)
                           if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                           call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                         end if
                         i_cpos = nint((i_ccenter-i_wincadr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vxs(i_dspselect,1))
                         i_rpos = nint((i_rcenter-i_winradr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vys(i_dspselect,1))
                         call move_scroll(i_dspselect,1,i_cpos,i_rpos)
                       end if
                     end if
                   else if (i_field .eq. 2) then
                     read(a_message,*,iostat=i_err) r_lat,r_lon
                     if (i_err .eq. 0) then
                       r_eux(1)=r_lat/r_rtod
                       r_eux(2)=r_lon/r_rtod
                       r_eux(3)=0.0
                       call get_coordinates(a_setproj(1),r_setpegv(1,1),r_dnx,r_eux,2,i_debug,i_err)
                       i_rcenter=((r_dnx(1)-r_setradr(1))/r_setrmlt(1)-i_winradr(1) )
                       i_ccenter=((r_dnx(2)-r_setcadr(1))/r_setcmlt(1)-i_wincadr(1) )
                       i_cdsp=i_dspselect
c                      write(6,*) 'i_key=',i_key
                       if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) 'moving scroll to',i_ccenter,i_rcenter
                       if (i_winactv(i_dspselect) .ne. 0) then
                         if (i_winradr(i_dspselect) .ne.
     &                        max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0) ) then
                           i_winradr(i_dspselect) =
     &                        max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0)
                           i_redraw(i_dspselect)=1
                         end if
                         if (i_wincadr(i_dspselect) .ne.
     &                        max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0) ) then
                           i_wincadr(i_dspselect) =
     &                        max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                           i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0)
                           i_redraw(i_dspselect)=1
                         end if
                         if (i_redraw(i_dspselect) .eq. 1) then
                           i_redraw(i_dspselect) = 0
                           i_event(0) = i_dspselect   ! Redraw window
                           i_event(1) = 1
                           i_event(2) = 1
                           i_event(3) = i_vxo(i_dspselect,1)-5
                           i_event(4) = i_vyo(i_dspselect,1)-5
                           i_event(5) = i_vxs(i_dspselect,1)
                           i_event(6) = i_vys(i_dspselect,1)
                           if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                           call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                         end if
                         i_cpos = nint((i_ccenter-i_wincadr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vxs(i_dspselect,1))
                         i_rpos = nint((i_rcenter-i_winradr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vys(i_dspselect,1))
                         call move_scroll(i_dspselect,1,i_cpos,i_rpos)
                       end if
                     end if
                   else if (i_field .eq. 3) then
                     read(a_message,*,iostat=i_err) r_winzoom(0)
                     if (r_winzoom(0) .lt. 0) r_winzoom(0) = abs(1./r_winzoom(0))
                   else if (i_field .eq. 4) then
                     if (i_value .eq. 1) then
                       write(6,*) 'Print Format PPM'
                     else if (i_value .eq. 2) then
                       write(6,*) 'Raw RGB Not Supported - Using PPM'
                     else if (i_value .eq. 3) then
                       write(6,*) 'PostScript Not Supported - Using PPM'
                     else
                       write(6,*) 'Print Format Not Supported - Using PPM'
                     end if
                   else if (i_field .eq. 5) then
                     if (i_debug .ge. 8) write(6,*) '--i_cdsp,i_cset = ',i_cdsp,i_cset
                     if (i_cdsp .ne. 0 .and. i_cdsp .ne. i_dspselect) then
                       i_rcenter=nint((i_vyo(i_dspselect,1)+
     &                           0.5*i_vys(i_dspselect,1))/r_winzoom(i_dspselect))+i_winradr(i_dspselect)
                       i_ccenter=nint((i_vxo(i_dspselect,1)+
     &                           0.5*i_vxs(i_dspselect,1))/r_winzoom(i_dspselect))+i_wincadr(i_dspselect)
                     end if
                     if (i_debug .ge. 6) write(6,*) 'Center was at (col,row): ',i_ccenter,i_rcenter
                     read(a_message,*,iostat=i_err) r_winzoom(i_dspselect)
                     if (r_winzoom(i_dspselect) .lt. 0.) r_winzoom(i_dspselect) = abs(1./r_winzoom(i_dspselect))
                     i_winrows(i_dspselect) = min(nint(i_setrows(1)*r_winzoom(i_dspselect)),32000)
                     i_wincols(i_dspselect) = min(nint(i_setcols(1)*r_winzoom(i_dspselect)),32000)
                     call resize_win(i_dspselect,1,i_wincols(i_dspselect),i_winrows(i_dspselect))
                     if (i_winradr(i_dspselect) .ne.
     &                   max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                   i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0)) then
                       i_winradr(i_dspselect) =
     &                   max(min(i_rcenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                   i_setrows(1)-int(32000/r_winzoom(i_dspselect))),0)
                       i_redraw(i_dspselect)=1
                     end if
                     if (i_wincadr(i_dspselect) .ne.
     &                   max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                   i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0)) then
                       i_wincadr(i_dspselect) =
     &                   max(min(i_ccenter-int((32000/2)/r_winzoom(i_dspselect)),
     &                   i_setcols(1)-int(32000/r_winzoom(i_dspselect))),0)
                       i_redraw(i_dspselect)=1
                     end if
                     if (i_redraw(i_dspselect) .eq. 1) then
                       i_redraw(i_dspselect) = 0
                       i_event(0) = i_dspselect   ! Redraw window
                       i_event(1) = 1
                       i_event(2) = 1
                       i_event(3) = i_vxo(i_dspselect,1)-5
                       i_event(4) = i_vyo(i_dspselect,1)-5
                       i_event(5) = i_vxs(i_dspselect,1)
                       i_event(6) = i_vys(i_dspselect,1)
                       if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                       call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                     end if
                     i_cpos = nint((i_ccenter-i_wincadr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vxs(i_dspselect,1))
                     i_rpos = nint((i_rcenter-i_winradr(i_dspselect))*r_winzoom(i_dspselect)-0.5*i_vys(i_dspselect,1))
                     if (i_debug .ge. 9) write(6,*) 'moving scroll to',i_cpos,i_rpos
                     call move_scroll(i_dspselect,1,i_cpos,i_rpos)
                     i_cset = 1
                     i_event(0) = i_dspselect
                     i_event(1) = 1
                     i_event(2) = 1
                     i_event(3) = i_vxo(i_dspselect,1)-5
                     i_event(4) = i_vyo(i_dspselect,1)-5
                     i_event(5) = i_vxs(i_dspselect,1)
                     i_event(6) = i_vys(i_dspselect,1)
                     if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                     call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                     if (r_winzoom(i_dspselect) .ge. 1.0) then
                       write(a_label,'(a,i3,a)') 'ZOOM:',nint(r_winzoom(i_dspselect)),'x'
                     else
                       write(a_label,'(a,i3,a)') 'ZOOM:',-nint(1.0/r_winzoom(i_dspselect)),'x'
                     end if
                     call display_label(i_dspselect,1,a_label,1)
                   else if (i_field .eq. 6) then  ! Sample Display ON/Off
                     if (i_value .eq. 1) then
                       i_show = 0
                     else
                       i_show = 1
                     end if
                     i_event(0) = i_dspselect   ! Redraw window
                     i_event(1) = 1
                     i_event(2) = 1
                     i_event(3) = i_vxo(i_dspselect,1)-5
                     i_event(4) = i_vyo(i_dspselect,1)-5
                     i_event(5) = i_vxs(i_dspselect,1)
                     i_event(6) = i_vys(i_dspselect,1)
                     if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                     call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                   else if (i_field .eq. 7) then  ! Select Mode
                     i_smode = i_value-1
                   else if (i_field .eq. 8) then  ! Sample Display ON/Off
                     if (i_smode .lt. 3) then
                       read(a_message,*,iostat=i_err) r_wdth
                     else
                       read(a_message,*,iostat=i_err) r_spce
                     end if
                   end if
                 end if
              else if (i_evn .eq. 11) then ! Re-scale set
                i_chn    = abs(i_bdat(0,1))
                if (i_debug .ge. 3) write(6,'(1x,a,i3)') 'Computing display stats for set: ',i_chn
                i_err = 0
                i_cnt = 0
                r_sum = 0.
                r_sqr = 0.
                do i_row = 0,i_setrows(i_chn)-1,min(max(i_setrows(i_chn)/100,1),20000)
                  do i_col = 0, i_setcols(i_chn)-1, min(max(i_setcols(i_chn)/100,1),20000)
                      if (a_setfile(i_chn)(1:1) .ne. '=') then
                        call readdat(i_setunit(i_chn),
     &                          i_setrows(i_chn),
     &                          i_setcols(i_chn),
     &                          i_setshdr(i_chn),
     &                          i_setstlr(i_chn),
     &                          i_setrhdr(i_chn),
     &                          i_setrtlr(i_chn),
     &                          i_setchdr(i_chn),
     &                          i_setctlr(i_chn),
     &                          i_setvend(i_chn)*i_endian,
     &                          i_setvfmt(i_chn),
     &                          r_setvmlt(i_chn),
     &                          r_setvadr(i_chn),
     &                          r_setvmin(i_chn),
     &                          r_setvmax(i_chn),
     &                          b_setvnul(0,i_chn),
     &                          i_row,i_col-1,3,r_data,i_data,readfunc,i_err)
                      else
c                       write(6,*) 'i_row,col=',i_row,i_col
                        do j=0,2
                          r_data(j)=0
                          i_data(j)=0
                        end do
                        i_opr=1
                        i_flg=0
                        a_value = ' '
                        do i = 2,rdflen(a_setfile(i_chn))+1
                          if (index('+-*/x',a_setfile(i_chn)(i:i)) .gt. 0 .or. a_setfile(i_chn)(i:i) .eq. ' ') then
                            if (a_value .ne. ' ') then
                              read(a_value,*) r_value
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_value
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_value
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_value
                              else if (i_opr .eq. 4) then
                                r_data(1)=r_data(1)/r_value
                              end if
                              a_value = ' '
                            end if
                          end if
                          if(a_setfile(i_chn)(i:i) .eq. '+') then
                            i_opr=1
                          else if (a_setfile(i_chn)(i:i) .eq. '-') then
                            i_opr=2
                          else if (a_setfile(i_chn)(i:i) .eq. 'x') then
                            i_opr=3
                          else if (a_setfile(i_chn)(i:i) .eq. 's' .or. a_setfile(i_chn)(i:i) .eq. 'S') then
                            i_flg=1
                          else if (i_flg .eq. 1) then
                            i_flg = 0
                            i_tmp = max(min((ichar(a_setfile(i_chn)(i:i))-ichar('0')),i_set+1),1)
                            i_tmp = max(min((ichar(a_setfile(i_chn)(i:i))-48),i_set+1),0)
c                            write(6,*) 'reading ',i_tmp,i_opr,i_data(1)
                            if (i_tmp .gt. i_set) i_tmp=0
                            if (i_tmp .ne. 0) then
                              call readdat(i_setunit(i_tmp),
     &                          i_setrows(i_tmp),
     &                          i_setcols(i_tmp),
     &                          i_setshdr(i_tmp),
     &                          i_setstlr(i_tmp),
     &                          i_setrhdr(i_tmp),
     &                          i_setrtlr(i_tmp),
     &                          i_setchdr(i_tmp),
     &                          i_setctlr(i_tmp),
     &                          i_setvend(i_tmp)*i_endian,
     &                          i_setvfmt(i_tmp),
     &                          r_setvmlt(i_tmp),
     &                          r_setvadr(i_tmp),
     &                          r_setvmin(i_tmp),
     &                          r_setvmax(i_tmp),
     &                          b_setvnul(0,i_tmp),
     &                          i_row,i_col-1,3,r_data2,i_data2,readfunc,i_err)
                              i_data(1)=i_data(1)+i_data2(1)
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_data2(1)
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_data2(1)
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_data2(1)
                              else
                                r_data(1)=r_data(1)+r_data2(1)
                              end if
                            end if
                          else
                            a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(i:i)
                          end if
                        end do
                      end if
                   !@#$%
                    if (i_data(1) .eq. 0) then
                      i_cnt = i_cnt + 1
                      i_c = 1
                      r_data(i_c) = max(r_dspcplw(i_chn),min(r_dspcphi(i_chn ! Clip data
     &                       ),r_data(i_c)))
c                        if (r_dspwrap(i_chn) .ne. 0.0) r_data(i_c) = ! Wrap data
c     &                       wrap(r_data(i_c),r_dspwrap(i_chn))
                      r_val(min(i_cnt,I_WKSPACE)) = r_data(i_c)
                      r_sum = r_sum + dble(r_data(i_c))
                      r_sqr = r_sqr + dble(r_data(i_c))**2.0d0
                    end if
                  end do
                end do
                if (i_debug .ge. 5) write(6,*) 'i_cnt,r_sum,r_sqr = ',i_cnt,r_sum,r_sqr
                if (i_cnt .gt. 0) then
                  r_avg = r_sum/max(i_cnt,1)
                  r_std = sqrt(max(1.d-99,(r_sqr/max(i_cnt,1))-(r_avg)**2))
                  r_setvavg(i_chn)=r_avg
                  r_setvstd(i_chn)=r_std
                  if (i_debug .ge. 4) write(6,*) 'average = ',r_setvavg(i_chn),i_cnt
                  if (i_dspmode(i_chn) .eq. 3) then
                    call median(   (1.-(r_dspval2(i_chn)/100))/2.,min(i_cnt,I_WKSPACE),r_val,r_median)
                    r_dspaddr(i_chn)=r_median
                    call median(1.-(1.-(r_dspval2(i_chn)/100))/2.,min(i_cnt,I_WKSPACE),r_val,r_median)
                    r_dspmult(i_chn)=r_median-r_dspaddr(i_chn)
                    if (i_debug .ge. 4) write(6,*) 'median = ',r_dspaddr(i_chn),r_median,i_cnt
                  else if (i_dspmode(i_chn) .eq. 5) then
                    r_dspaddr(i_chn)=0.
                    r_dspmult(i_chn)=r_avg/(0.7*r_dspval3(i_chn))
                  else
                    if (i_dspaddr(i_chn) .eq. 1) r_dspaddr(i_chn) = r_avg-(r_dspval1(i_chn)*r_std)
                    if (i_dspmult(i_chn) .eq. 1) r_dspmult(i_chn) = 2.*r_dspval1(i_chn)*r_std
                  end if
                else
                  r_dspaddr(i_chn) = 0.0d0
                  r_dspmult(i_chn) = 1.0d0
                end if
                if (i_debug .ge. 3) write(6,*) 'dsp add/mult = ',r_dspaddr(i_chn),r_dspmult(i_chn)
                if (i_bdat(0,1) .lt. 0) then
                  write(a_data(1),'(i10)') i_dspmode(i_chn)
                  if (i_dspmode(i_chn) .eq. 1) then
                    a_labels(2)='Range:'
                    write(a_data(2),'(f15.4)') r_dspmult(i_chn)
                    a_labels(3)='Offset:'
                    write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                  else if (i_dspmode(i_chn) .eq. 2) then
                    a_labels(2)='SDEV Factor:'
                    write(a_data(2),'(f15.2)') r_dspval1(i_chn)
                    a_labels(3)='Offset:'
                    write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                  else if (i_dspmode(i_chn) .eq. 3) then
                    a_labels(2)='Percent:'
                    write(a_data(2),'(f15.2)') r_dspval2(i_chn)
                    a_labels(3) = ' '
                    a_data(3)   = ' '
                  else if (i_dspmode(i_chn) .eq. 4) then
                    a_labels(2)=' '
                    write(a_data(2),'(f15.2)') r_dspmult(i_chn)
                    a_labels(3)=' '
                    write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                  else if (i_dspmode(i_chn) .eq. 5) then
                    a_labels(2)='CW Scale:'
                    write(a_data(2),'(f15.2)') r_dspval3(i_chn)
                    a_labels(3) = ' '
                    a_data(3)   = ' '
                  else
                    a_labels(2)='Wrap:'
                    write(a_data(2),'(f15.4)') r_dspwrap(i_chn)
                    a_labels(3)='Offset:'
                    write(a_data(3),'(f15.4)') r_dspaddr(i_chn)
                  end if
                  call encodeval(r_dspexpn(i_chn),a_data(4))
                  call encodeval(r_setvmin(i_chn),a_data(5))
                  call encodeval(r_setvmax(i_chn),a_data(6))
                  call encodeval(r_dspcplw(i_chn),a_data(7))
                  call encodeval(r_dspcphi(i_chn),a_data(8))
c                  write(a_data(4),'(f15.4)') r_dspexpn(i_chn)
c                  write(a_data(5),'(f15.4)') r_setvmin(i_chn)
c                  write(a_data(6),'(f15.4)') r_setvmax(i_chn)
c                  write(a_data(7),'(f15.4)') r_dspcplw(i_chn)
c                  write(a_data(8),'(f15.4)') r_dspcphi(i_chn)
                  i_colorset=0
                  do i=1,i_colormax
                    if (a_dspctbl(i_chn) .eq. a_colorfile(i)) i_colorset=i
                  end do
                  if (i_colorset .gt. 0) then
                    write(a_data(9),'(i2)') i_colorset
                    do i=1,i_colormax
                      a_data(9)=a_data(9)(1:rdflen(a_data(9)))//'|'//a_colorname(i)
                    end do
                    if (a_data(9)(1:1) .eq. ' ') a_data(9)=a_data(9)(2:)
                  else
                    a_data(9)=a_dspctbl(i_chn)
                  end if
                  call entry_window(i_chn,a_labels,a_data)
                end if
              else if (i_evn .eq. 12) then ! file name
                i_value  = i_bdat(5,1)
                i_msgid  = i_bdat(6,1)
                if (i_msgid .ge. 0) then
                  call get_message(i_msgid,a_message)
                else
                  a_message=a_ptsfile
                  a_ptsfile=' '
                end if
                if (i_debug .eq. -14 .or. i_debug .ge. 14) write(6,*) 'File message = ',i_msgid,i_value,' ',a_message
                if (i_value .eq. 43) then ! import points file
                  open(91,file=a_message,status='old',form='formatted',iostat=i_err)
                  i_samps=0
                  do while(i_err .eq. 0)
                    read(91,'(3i8,5e15.5)',iostat=i_err) i_csamps(i_samps+1),i_rsamps(i_samps+1),i_tsamps(i_samps+1)
                    if (i_err .eq. 0) then
                      i_samps=i_samps+1

                      do i_chn=1,i_set
                        if (1 .eq. 1) then
                          if (a_setfile(i_chn)(1:1) .ne. '=') then
                            call readdat(i_setunit(i_chn),
     &                              i_setrows(i_chn),
     &                              i_setcols(i_chn),
     &                              i_setshdr(i_chn),
     &                              i_setstlr(i_chn),
     &                              i_setrhdr(i_chn),
     &                              i_setrtlr(i_chn),
     &                              i_setchdr(i_chn),
     &                              i_setctlr(i_chn),
     &                              i_setvend(i_chn)*i_endian,
     &                              i_setvfmt(i_chn),
     &                              r_setvmlt(i_chn),
     &                              r_setvadr(i_chn),
     &                              r_setvmin(i_chn),
     &                              r_setvmax(i_chn),
     &                              b_setvnul(0,i_chn),
     &                              i_rr,i_cc-1,3,
     &                              r_data,i_data,readfunc,i_err)
                          else
                            do j=0,2
                              r_data(j)=0
                              i_data(j)=0
                            end do
                            i_opr=1
                            i_flg=0
                            a_value = ' '
                            do iii = 2,rdflen(a_setfile(i_chn))+1
                              if (index('+-*/x',a_setfile(i_chn)(iii:iii)) .gt. 0 .or. a_setfile(i_chn)(iii:iii) .eq. ' ') then
                                if (a_value .ne. ' ') then
                                  read(a_value,*) r_value
                                  if (i_opr .eq. 1) then
                                    r_data(1)=r_data(1)+r_value
                                  else if (i_opr .eq. 2) then
                                    r_data(1)=r_data(1)-r_value
                                    else if (i_opr .eq. 3) then
                                      r_data(1)=r_data(1)*r_value
                                    else if (i_opr .eq. 4) then
                                      r_data(1)=r_data(1)/r_value
                                    end if
                                    a_value = ' '
                                  end if
                                end if
                                if(a_setfile(i_chn)(iii:iii) .eq. '+') then
                                  i_opr=1
                                else if (a_setfile(i_chn)(iii:iii) .eq. '-') then
                                  i_opr=2
                                else if (a_setfile(i_chn)(iii:iii) .eq. 'x') then
                                  i_opr=3
                                else if (a_setfile(i_chn)(iii:iii) .eq. '/') then
                                  i_opr=4
                                else if (a_setfile(i_chn)(iii:iii) .eq. 's' .or. a_setfile(i_chn)(iii:iii) .eq. 'S') then
                                  i_flg=1
                                else if (i_flg .eq. 1) then
                                  i_flg = 0
                                  i_tmp = max(min((ichar(a_setfile(i_chn)(iii:iii))-ichar('0')),i_set+1),1)
                                  if (i_tmp .gt. i_set) i_tmp=0
                                  if (i_tmp .ne. 0) then
                                    call readdat(i_setunit(i_tmp),
     &                                i_setrows(i_tmp),
     &                                i_setcols(i_tmp),
     &                                i_setshdr(i_tmp),
     &                                i_setstlr(i_tmp),
     &                                i_setrhdr(i_tmp),
     &                                i_setrtlr(i_tmp),
     &                                i_setchdr(i_tmp),
     &                                i_setctlr(i_tmp),
     &                                i_setvend(i_tmp)*i_endian,
     &                                i_setvfmt(i_tmp),
     &                                r_setvmlt(i_tmp),
     &                                r_setvadr(i_tmp),
     &                                r_setvmin(i_tmp),
     &                                r_setvmax(i_tmp),
     &                                b_setvnul(0,i_tmp),
     &                                i_rr,i_cc-1,3,
     &                                r_data2,i_data2,readfunc,i_err)
                                      i_data(1)=i_data(1)+i_data2(1)
                                    if (i_opr .eq. 1) then
                                      r_data(1)=r_data(1)+r_data2(1)
                                    else if (i_opr .eq. 2) then
                                      r_data(1)=r_data(1)-r_data2(1)
                                    else if (i_opr .eq. 3) then
                                      r_data(1)=r_data(1)*r_data2(1)
                                    else if (i_opr .eq. 4) then
                                      r_data(1)=r_data(1)/r_data2(1)
                                    else
                                      r_data(1)=r_data(1)+r_data2(1)
                                    end if
                                  end if
                                else
                                  a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(iii:iii)
                              end if
                            end do
                          end if
                        end  if
                        if (i_samps .gt. 0) r_vsamps(i_samps,i_chn)=r_data(1)
                      end do
                    end if

                  end do
                  close(91)
                  if (i_dspselect .eq. 0) then
c                    write(6,*) 'dspselect = ',i_dspselect,'  setting to 1'
                    i_dspselect =1
                  end if
                  i_show=1
                  i_event(0) = i_dspselect   ! Redraw window
                  i_event(1) = 1
                  i_event(2) = 1
                  i_event(3) = i_vxo(i_dspselect,1)-5
                  i_event(4) = i_vyo(i_dspselect,1)-5
                  i_event(5) = i_vxs(i_dspselect,1)
                  i_event(6) = i_vys(i_dspselect,1)
                  if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                  call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                else if (i_value .eq. 44) then
                  open(91,file=a_message,status='unknown',form='formatted',iostat=i_err)
                  if (i_err .eq. 0) then
                    do i=1,i_samps
                      write(91,'(3i8,5e15.5)') i_csamps(i),i_rsamps(i),i_tsamps(i),(r_vsamps(i,i_chn),i_chn=1,i_set)
                    end do
                  end if
                  close(91)
                end if
              else if (i_evn .eq. 13) then ! buffered mouse click event in window 1
                i_button = i_bdat(3,1)
                i_col    = i_bdat(4,1)
                i_row    = i_bdat(5,1)
                i_typ    = i_bdat(6,1)
                if (i_win .eq. 1) then ! Just making sure
                  if (i_button .eq. 0) then
                                        ! do nothing
                  else if (i_button .ne. 2) then ! Left or right click
c                    write(6,*) 'left or right click'
                    i_rcenter=i_row/r_winzoom(i_dsp)+i_winradr(i_dsp)
                    i_ccenter=i_col/r_winzoom(i_dsp)+i_wincadr(i_dsp)
                    if (a_clickcmd(1) .ne. ' ' .and. i_typ .eq. 1) then
                      write(a_command,'(a,4i8,a)') a_clickcmd(1)(1:max(1,rdflen(a_clickcmd(1)))),i_button,i_ccenter,i_rcenter,
     &                    i_typ,' &'
                      if (i_debug .eq. -17 .or. i_debug .ge. 17) write(6,*) 'cmnd:'//a_command(1:70)
                        call system(a_command)
                      end if
                    if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   in event 13  (button/typ): ',i_button,i_typ
                    i_cdsp = i_dsp
                    i_cset = 0
                    a_label1=' '
                    a_label2=' '
                    if (i_smode .ne. 0 .and. i_shft .eq. 0 .and. i_typ .eq. 1 .and. (i_region .eq. 0 .or. i_smode .ne. 3)) then
                      i_samps=0
                      i_redraw(i_dsp)=1
                      if (i_redraw(i_dsp) .eq. 1) then
                        i_redraw(i_dsp) = 0
                        i_event(0) = i_dsp   ! Redraw window
                        i_event(1) = 1
                        i_event(2) = 1
                        i_event(3) = i_vxo(i_dsp,1)-5
                        i_event(4) = i_vyo(i_dsp,1)-5
                        i_event(5) = i_vxs(i_dsp,1)
                        i_event(6) = i_vys(i_dsp,1)
                        if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                        call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                      end if
                    end if

                    if (i_samps .eq. 0) then
                      i_newpoint = 1
                    else
                      if (i_samps .eq. 0 .or. i_typ .ne. 2 .or.
     &                        i_rsamps(i_samps) .ne. i_rcenter .or.
     &                        i_csamps(i_samps) .ne. i_ccenter) then
                        i_newpoint = 1
                      else
                        i_newpoint = 0
                      end if
                    end if
                    if (i_newpoint .eq. 1) then
                      i_start=i_samps+1
                      if (i_smode .eq. 0) then
                        ! do nothing
                      else if (i_smode .eq. 1) then   ! Point
                        if (i_button .eq. 1 .or. i_typ .eq. 3) then
                          i_samps = min(i_samps+1,I_MAXSAMP)
                          i_rsamps(i_samps) = i_rcenter
                          i_csamps(i_samps) = i_ccenter
                          i_tsamps(i_samps) = 1
                          r_wsamps(i_samps) = r_wdth
                          r_ssamps(i_samps) = r_spce
                        end if
                      else if (i_smode .eq. 2) then   ! Line
                        if (i_button .eq. 1 .or. i_typ .ne. 2) then
                          i_samps = min(i_samps+1,I_MAXSAMP)
                          i_rsamps(i_samps) = i_rcenter
                          i_csamps(i_samps) = i_ccenter
                          r_wsamps(i_samps) = r_wdth
                          r_ssamps(i_samps) = r_spce
                          if (i_typ .eq. 1) then
                            i_tsamps(i_samps) = 2
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   starting line: ',i_samps,i_tsamps(i_samps)
                          else
                            i_tsamps(i_samps) = -2
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   continue line: ',i_samps,i_tsamps(i_samps)
                          end if
                        end if
                      else if (i_smode .eq. 3) then   ! Region
c                        write(6,*) 'i_button = ',i_button
                        if (i_region .eq. 0) then
                          if ((i_button .eq. 1 .and. i_typ .eq. 3) .or.
     &                        (i_button .eq. 3 .and. i_typ .eq. 1)  ) then
                            i_samps=min(i_samps+1,I_MAXSAMP)
                            i_rsamps(i_samps)=i_rcenter
                            i_csamps(i_samps)=i_ccenter
                            i_tsamps(i_samps)=+3
                            r_wsamps(i_samps) = r_wdth
                            r_ssamps(i_samps) = r_spce
                            i_region=i_region+1
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   start region: ',i_region
                          end if
                        else if (i_typ .eq. 3) then
                          if (i_button .eq. 1) then
                            i_samps=min(i_samps+1,I_MAXSAMP)
                            i_rsamps(i_samps)=i_rcenter
                            i_csamps(i_samps)=i_ccenter
                            i_tsamps(i_samps)=-3
                            r_wsamps(i_samps) = r_wdth
                            r_ssamps(i_samps) = r_spce
                            i_region=i_region+1
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   add region:   ',i_region
                          else if (i_button .eq. 3) then
                            if (i_region .eq. 1) then
                              i_samps=min(i_samps+1,I_MAXSAMP)
                              i_rsamps(i_samps)=i_rsamps(i_samps-i_region)
                              i_csamps(i_samps)=i_ccenter
                              i_tsamps(i_samps)=-3
                              r_wsamps(i_samps) = r_wdth
                              r_ssamps(i_samps) = r_spce
                              i_region=i_region+1
                              if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   rect 1: ',i_region

                              i_samps=min(i_samps+1,I_MAXSAMP)
                              i_rsamps(i_samps)=i_rcenter
                              i_csamps(i_samps)=i_ccenter
                              i_tsamps(i_samps)=-3
                              r_wsamps(i_samps) = r_wdth
                              r_ssamps(i_samps) = r_spce
                              i_region=i_region+1
                              if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   rect 2: ',i_region

                              i_samps=min(i_samps+1,I_MAXSAMP)
                              i_rsamps(i_samps)=i_rcenter
                              i_csamps(i_samps)=i_csamps(i_samps-i_region)
                              i_tsamps(i_samps)=-3
                              r_wsamps(i_samps) = r_wdth
                              r_ssamps(i_samps) = r_spce
                              i_region=i_region+1
                              if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   rect 3: ',i_region

                              i_samps=min(i_samps+1,I_MAXSAMP)
                              i_rsamps(i_samps)=i_rsamps(i_samps-i_region)
                              i_csamps(i_samps)=i_csamps(i_samps-i_region)
                              i_tsamps(i_samps)=-3
                              r_wsamps(i_samps) = r_wdth
                              r_ssamps(i_samps) = r_spce
                              i_region=i_region+1
                              if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   rect 4: ',i_region
                            else
                              i_samps=min(i_samps+1,I_MAXSAMP)
                              i_rsamps(i_samps)=i_rsamps(i_samps-i_region)
                              i_csamps(i_samps)=i_csamps(i_samps-i_region)
                              i_tsamps(i_samps)=-3
                              r_wsamps(i_samps) = r_wdth
                              r_ssamps(i_samps) = r_spce
                              i_region=i_region+1
                              if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   add region:   ',i_region
                            end if
                            i_region = 0
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   end of region: ',i_region
                          end if
                        end if
c                      end if
                    end if
                    if (i_debug .eq. -20 .or. i_debug .ge. 20 .and. i_samps .gt. 0) write(6,*) 'i_samps=',i_samps,i_tsamps(i_samps),i_button

                    if (i_show .eq. 1) then ! show lines turned on
                        do i=i_start,i_samps
                          if (i_tsamps(i) .eq. 1) then
                            r_row(1)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i))/float(i_winrows(i_dsp))-2/float(i_winrows(i_dsp))
                            r_row(2)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i))/float(i_winrows(i_dsp))+2/float(i_winrows(i_dsp))
                            r_col(1)=r_winzoom(i_dsp)*i_csamps(i)/float(i_wincols(i_dsp))-2/float(i_winrows(i_dsp))
                            r_col(2)=r_winzoom(i_dsp)*i_csamps(i)/float(i_wincols(i_dsp))+2/float(i_winrows(i_dsp))
                            call plot_data(i_dsp,i_win,2,r_col,r_row)
                            r_row(1)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i))/float(i_winrows(i_dsp))+2/float(i_winrows(i_dsp))
                            r_row(2)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i))/float(i_winrows(i_dsp))-2/float(i_winrows(i_dsp))
                            r_col(1)=r_winzoom(i_dsp)*i_csamps(i)/float(i_wincols(i_dsp))-2/float(i_winrows(i_dsp))
                            r_col(2)=r_winzoom(i_dsp)*i_csamps(i)/float(i_wincols(i_dsp))+2/float(i_winrows(i_dsp))
                            call plot_data(i_dsp,i_win,2,r_col,r_row)
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   drawing line: ',i,
     &                           r_col(1),r_row(1),r_col(2),r_row(2)
                          else if (i_tsamps(i) .lt. 0) then
                            r_row(1)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i-1))/float(i_winrows(i_dsp))
                            r_row(2)=r_winzoom(i_dsp)*(i_winrows(i_dsp)/
     &                            r_winzoom(i_dsp)-i_rsamps(i))/float(i_winrows(i_dsp))
                            r_col(1)=r_winzoom(i_dsp)*i_csamps(i-1)/float(i_wincols(i_dsp))
                            r_col(2)=r_winzoom(i_dsp)*i_csamps(i)/float(i_wincols(i_dsp))
                            call plot_data(i_dsp,i_win,2,r_col,r_row)
                            if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) '   drawing line: ',i,
     &                           i_tsamps(i),r_col(1),r_row(1),r_col(2),r_row(2)
                          end if
                        end do
                      end if  ! end i_show

                    end if

                    do i_chn=1,i_set
                    !@#$%
                      if (a_setfile(i_chn)(1:1) .ne. '=') then
                        call readdat(i_setunit(i_chn),
     &                          i_setrows(i_chn),
     &                          i_setcols(i_chn),
     &                          i_setshdr(i_chn),
     &                          i_setstlr(i_chn),
     &                          i_setrhdr(i_chn),
     &                          i_setrtlr(i_chn),
     &                          i_setchdr(i_chn),
     &                          i_setctlr(i_chn),
     &                          i_setvend(i_chn)*i_endian,
     &                          i_setvfmt(i_chn),
     &                          r_setvmlt(i_chn),
     &                          r_setvadr(i_chn),
     &                          r_setvmin(i_chn),
     &                          r_setvmax(i_chn),
     &                          b_setvnul(0,i_chn),
     &                          int((i_row)/r_winzoom(i_dsp))+i_winradr(i_dsp),
     &                          int(i_col/r_winzoom(i_dsp))+i_wincadr(i_dsp)-1,
     &                          3,r_data,i_data,readfunc,i_err)
                      else
                        do j=0,2
                          r_data(j)=0
                          i_data(j)=0
                        end do
                        i_opr=1
                        i_flg=0
                        a_value = ' '
                        do i = 2,rdflen(a_setfile(i_chn))+1
                          if (index('+-*/x',a_setfile(i_chn)(i:i)) .gt. 0 .or. a_setfile(i_chn)(i:i) .eq. ' ') then
                            if (a_value .ne. ' ') then
                              read(a_value,*) r_value
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_value
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_value
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_value
                              else if (i_opr .eq. 4) then
                                r_data(1)=r_data(1)/r_value
                              end if
                              a_value = ' '
                            end if
                          end if
                          if(a_setfile(i_chn)(i:i) .eq. '+') then
                            i_opr=1
                          else if (a_setfile(i_chn)(i:i) .eq. '-') then
                            i_opr=2
                          else if (a_setfile(i_chn)(i:i) .eq. 'x') then
                            i_opr=3
                          else if (a_setfile(i_chn)(i:i) .eq. '/') then
                            i_opr=4
                          else if (a_setfile(i_chn)(i:i) .eq. 's' .or. a_setfile(i_chn)(i:i) .eq. 'S') then
                            i_flg=1
                          else if (i_flg .eq. 1) then
                            i_flg = 0
                            i_tmp = max(min((ichar(a_setfile(i_chn)(i:i))-ichar('0')),i_set+1),1)
                            if (i_tmp .gt. i_set) i_tmp=0
                            if (i_tmp .ne. 0) then
                              call readdat(i_setunit(i_tmp),
     &                          i_setrows(i_tmp),
     &                          i_setcols(i_tmp),
     &                          i_setshdr(i_tmp),
     &                          i_setstlr(i_tmp),
     &                          i_setrhdr(i_tmp),
     &                          i_setrtlr(i_tmp),
     &                          i_setchdr(i_tmp),
     &                          i_setctlr(i_tmp),
     &                          i_setvend(i_tmp)*i_endian,
     &                          i_setvfmt(i_tmp),
     &                          r_setvmlt(i_tmp),
     &                          r_setvadr(i_tmp),
     &                          r_setvmin(i_tmp),
     &                          r_setvmax(i_tmp),
     &                          b_setvnul(0,i_tmp),
     &                          int((i_row)/r_winzoom(i_dsp))+i_winradr(i_dsp),
     &                          int(i_col/r_winzoom(i_dsp))+i_wincadr(i_dsp)-1,
     &                          3,r_data2,i_data2,readfunc,i_err)
                              i_data(1)=i_data(1)+i_data2(1)
                              if (i_opr .eq. 1) then
                                r_data(1)=r_data(1)+r_data2(1)
                              else if (i_opr .eq. 2) then
                                r_data(1)=r_data(1)-r_data2(1)
                              else if (i_opr .eq. 3) then
                                r_data(1)=r_data(1)*r_data2(1)
                              else if (i_opr .eq. 4) then
                                r_data(1)=r_data(1)/r_data2(1)
                              else
                                r_data(1)=r_data(1)+r_data2(1)
                              end if
                            end if
                          else
                            a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(i:i)
                          end if
                        end do
                      end if
                      if(i_samps .gt. 0) r_vsamps(i_samps,i_chn)=r_data(1)

                      if (a_label1 .eq. ' ') then
                        write(a_label,fmt=a_colfrmt,iostat=i_err) int(i_col/r_winzoom(i_dsp))+i_wincadr(i_dsp)
                        a_label1='COL: '//a_label

                        write(a_label,fmt=a_rowfrmt,iostat=i_err) int(i_row/r_winzoom(i_dsp))+i_winradr(i_dsp)
                        a_label1=a_label1(1:rdflen(a_label1))//'   ROW: '//a_label
                      end if

                      if (i_cntl .eq. 1 .and. a_setproj(i_chn) .ne. ' ' .and.
     &                           r_setrmlt(i_chn) .ne. 0. .and. r_setcmlt(i_chn) .ne. 0.) then
                        r_dnx(1) = ((int(i_row/r_winzoom(i_dsp))+i_winradr(i_dsp))*r_setrmlt(i_chn))+r_setradr(i_chn)
                        r_dnx(2) = ((int(i_col/r_winzoom(i_dsp))+i_wincadr(i_dsp))*r_setcmlt(i_chn))+r_setcadr(i_chn)
                        r_dnx(3) = r_data(1)
                        call get_coordinates(a_setproj(i_chn),r_setpegv(1,i_chn),
     &                                         r_dnx,r_eux,1,i_debug,i_err)
                        if (i_err .eq. 0) then
                          r_data(1) = r_eux(3)
                          if (a_label1(1:4) .ne. 'LAT:' .or. rdflower(a_setproj(i_chn)) .ne. 'scx') then

                            if (i_debug .ge. 6) write(6,*) 'i_key = ',i_key
                            if (i_debug .ge. 6) write(6,*) a_setproj(i_chn),r_eux(1)*180.0/r_pi,r_eux(2)*180.0/r_pi
                            write(a_label,'(f10.5)') r_eux(1)*180.0/r_pi
                            a_label1='LAT: '//a_label

                            write(a_label,'(f11.5)',iostat=i_err) r_eux(2)*180.0/r_pi
                            a_label1=a_label1(1:rdflen(a_label1))//'   LON: '//a_label
                          end if
                        end if
                      else if (i_shft .eq. 1 .and.
     &                           r_setrmlt(i_chn) .ne. 0. .and. r_setcmlt(i_chn) .ne. 0.) then
                        r_eux(2) = ((int(i_row/r_winzoom(i_dsp))+i_winradr(i_dsp))*r_setrmlt(i_chn))+r_setradr(i_chn)
                        r_eux(1) = ((int(i_col/r_winzoom(i_dsp))+i_wincadr(i_dsp))*r_setcmlt(i_chn))+r_setcadr(i_chn)
                        r_eux(3) = r_data(1)
                        if (a_label1(1:4) .ne. 'LAT:' ) then

                          if (i_debug .ge. 6) write(6,*) 'i_key = ',i_key
                          if (i_debug .ge. 6) write(6,*) a_setproj(i_chn),r_eux(1),r_eux(2)
                          write(a_label,'(f10.4)') r_eux(1)
                          a_label1='CPS: '//a_label

                          write(a_label,'(f11.4)',iostat=i_err) r_eux(2)
                          a_label1=a_label1(1:rdflen(a_label1))//'   RPS: '//a_label
                        end if

                      end if
                      if (i_data(1) .eq. 0) then ! data valid
                        i_log=nint(alog10(abs(r_data(1))))
                        i_dec=8-nint(alog10(abs(r_setvavg(i_chn))+10*r_setvstd(i_chn)))
                        if (i_debug .gt. 20) write(6,*) 'i_dec=',i_dec
                        if ((i_dec .ge. -2 .and. i_dec .le. 12) .and. abs(i_log) .lt. 8) then
                          write(a_fmt,'(a,i2.2,a)',iostat=i_err) '(f12.',min(10,max(0,i_dec)),')'
                        else
                          a_fmt='(e12.5)'
                        end if
                        write(a_label2(rdflen(a_label2)+1:),fmt=a_fmt,iostat=i_err) r_data(1)
                      else                        ! data invalid
                        i_log=nint(alog10(abs(r_data(1))))
                        i_dec=7-nint(alog10(abs(r_setvavg(i_chn))+10*r_setvstd(i_chn)))
                        if (i_debug .gt. 20) write(6,*) 'i_dec=',i_dec,i_log
                        if (i_dec .ge. -2 .and. i_dec .le. 12 .and. abs(i_log) .eq. 8) then
                          write(a_fmt,'(a,i1,a)',iostat=i_err) '(f12.',min(9,max(0,i_dec)),',a1)'
                        else
                          a_fmt='(e12.4,a1)'
                        end if
                        write(a_label2(rdflen(a_label2)+1:),fmt=a_fmt,iostat=i_err) r_data(1),'*'
                      end if
                    end do
                    if (r_winzoom(i_dsp) .ge. 1.0) then
                      write(a_label,'(a,i3,a)',iostat=i_err) 'ZOOM:',nint(r_winzoom(i_dsp)),'x'
                    else
                      write(a_label,'(a,i3,a)',iostat=i_err) 'ZOOM:',-nint(1.0/r_winzoom(i_dsp)),'x'
                    end if
                    a_label=a_label(1:9)//'  '//a_label1(1:max(1,rdflen(a_label1)))//' '//a_label2
                    call display_label(i_dsp,i_win,a_label,1)
                    if (i_button .eq. 3 .and. i_typ .eq. 3) write(6,*) a_filename(1:max(rdflen(a_filename),1))//'  '//
     &                 a_label1(1:max(1,rdflen(a_label1)))//' '//a_label2(1:max(1,rdflen(a_label2)))
                  else if (i_button .eq. 2)  then ! middle click
                    i_rcenter=i_row/r_winzoom(i_dsp)+i_winradr(i_dsp)
                    i_ccenter=i_col/r_winzoom(i_dsp)+i_wincadr(i_dsp)
                    i_cdsp = i_dsp
                    i_cset = 1
                    if (i_debug .ge. 8) write(6,*) '--i_cdsp,i_cset = ',i_cdsp,i_cset
c                   if (i_debug .ge. 9) write(6,*) 'i_key=',i_key
                    if (i_debug .ge. 9) write(6,*) 'moving scroll to',i_ccenter,i_rcenter
                    do i_d=1,I_DMAX
                      if (i_winactv(i_d) .ne. 0) then
                        if ((i_key .eq. 0 .and. i_d .eq. i_dsp) .or.
     &                        (i_key .ne. 0 .and. i_d .ne. i_dsp)) then
                          if (i_winradr(i_d) .ne. max(min(i_rcenter-int((32000/2)/r_winzoom(i_d)),
     &                           i_setrows(1)-int(32000/r_winzoom(i_d))),0) ) then
                            i_winradr(i_d) =
     &                            max(min(i_rcenter-int((32000/2)/r_winzoom(i_d)),i_setrows(1)-int(32000/r_winzoom(i_d))),0)
                            i_redraw(i_d)=1
                          end if
                          if (i_wincadr(i_d) .ne. max(min(i_ccenter-int((32000/2)/r_winzoom(i_d)),
     &                           i_setcols(1)-int(32000/r_winzoom(i_d))),0) ) then
                            i_wincadr(i_d) =
     &                            max(min(i_ccenter-int((32000/2)/r_winzoom(i_d)),i_setcols(1)-int(32000/r_winzoom(i_d))),0)
                            i_redraw(i_d)=1
                          end if
                          if (i_redraw(i_d) .eq. 1) then
                            i_redraw(i_d) = 0
                            i_event(0) = i_d   ! Redraw window
                            i_event(1) = 1
                            i_event(2) = 1
                            i_event(3) = i_vxo(i_d,1)-5
                            i_event(4) = i_vyo(i_d,1)-5
                            i_event(5) = i_vxs(i_d,1)
                            i_event(6) = i_vys(i_d,1)
                            if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                            call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                          end if
                          i_cpos = nint((i_ccenter-i_wincadr(i_d))*r_winzoom(i_d)-0.5*i_vxs(i_d,1))
                          i_rpos = nint((i_rcenter-i_winradr(i_d))*r_winzoom(i_d)-0.5*i_vys(i_d,1))
                          call move_scroll(i_d,1,i_cpos,i_rpos)
                        end if
                      end if
                    end do
                  end if
                end if

              else if (i_evn .eq. 0) then ! menu select
                i_col = i_bdat(4,1)
                i_row = i_bdat(5,1)
                if (i_debug .ge. 6) write(6,*) 'Menu Item selected:',i_dsp,i_col,i_row
                if (i_col .eq. 0) then
                  if (i_row .eq. 1) then
                    call write_greeting()
                  else if (i_row .eq. 2) then
                    write(6,*) 'Function not implemented yet'
                  end if
                else if (i_col .eq. 1) then
                  if (i_row .eq. 1) then
                    if (i_debug .ge. 2) write(6,*) 'Creating new application'
                    i_arg = 0
                    a_command = 'mdx'
                    do while(i_arg .lt. i_inarg)
                      i_arg=i_arg + 1
                      a_value = a_inarg(i_arg)
                      a_command = a_command(1:rdflen(a_command))//' '//a_value
                    end do
                    a_command=a_command(1:rdflen(a_command))//' &'
                    if (i_debug .ge. 6) write(6,*) 'a_command=',a_command
                    call system(a_command)
                  else if (i_row .eq. 2) then
                    i_done = 1
                  end if
                else if (i_col .eq. 2) then
                  if (i_row .eq. 1) then
                    if (i_debug .ge. 3) write(6,*) 'Creating new display'
                    call create_dsp(a_filename,i_winrows(i_dsp)
     &                    ,i_wincols(i_dsp),i_winy,i_winx,a_setname(1),i_set,i_d
     &                    ,i_menu,a_tname,i_close,a_lcolor,i_debug)
                    if (i_debug .ge. 6) write(6,*) 'i_d =',i_d
                    if (i_d .gt. 0) then
                      i_winactv(i_d) = 1
                      call get_wininfo(i_d,1,i_vxo(i_d,1),i_vyo(i_d,1)
     &                       ,i_vxs(i_d,1),i_vys(i_d,1),i_wxs(i_d,1),i_wys(i_d,1)
c     &                       ,i_vxs(i_d,1),i_vys(i_d,1),i_cw,i_ch
     &                       ,i_widget)
                      if (i_debug .ge. 6) write(6,*) 'from get_win',i_vxo(i_d,1),i_vyo(i_d
     &                       ,1),i_vxs(i_d,1),i_vys(i_d,1)
                      i_winrows(i_d)=i_winrows(i_dsp)
                      i_wincols(i_d)=i_wincols(i_dsp)
                      i_winselc(i_d)=i_winselc(i_dsp)
                      r_winzoom(i_d)=r_winzoom(i_dsp)
                      do i=1, I_CMAX
                        i_dspactv(i_d,i) = i_dspactv(i_dsp,i)
                        if (i .le. i_set) then
                          if (i_dspactv(i_d,i) .eq. 1) then
                            call set_button_shadow(i_d,i+1,1,i_debug)
                          else
                            call set_button_shadow(i_d,i+1,0,i_debug)
                          end if
                        end if
                      end do
                    end if
                  else if (i_row .eq. 2) then
                    call destroy_display(i_dsp)
                  else if (i_row .eq. 3) then  ! Resize Display

                    do i_chn = 1,i_set

                      if (a_setfile(i_chn) .ne. ' ' .and. a_setfile(i_chn)(1:1) .ne. '=') then
                        if (i_setunit(i_chn) .lt. 0) then
                          i_fbytes = readfunc(1,i_chn,i_eight(0),0,b_data)
                          if (i_debug .ge. 3) write(6,*) 'internal buffer size=',i_fbytes
                          i_fbytes = min(i_fbytes,i_maxbuff)
                        else
                          i_fbytes = i_getfsize(i_setunit(i_chn))
c                          write(6,*) 'calling i_getfsize  ',i_fbytes,i_setunit(i_chn)
                        end if
                        if (i_fbytes .gt. 0) then
                          i_setrows(i_chn) = (i_fbytes
     &                      -i_setshdr(i_chn)-i_setstlr(i_chn))/((i_setvbyt(i_setvfmt(i_chn))
     &                      +i_setchdr(i_chn)+i_setctlr(i_chn))*i_setcols(i_chn)+i_setrhdr(i_chn)+i_setrtlr(i_chn))
                        end if
                      end if
                    end do

                    i_winrows(i_dsp) = min(nint(i_setrows(1)*r_winzoom(i_dsp)),32000)
                    i_wincols(i_dsp) = min(nint(i_setcols(1)*r_winzoom(i_dsp)),32000)
                    call resize_win(i_dsp,1,i_wincols(i_dsp),i_winrows(i_dsp))
c                    write(6,*) 'New number of rows = ',i_winrows(i_dsp)
                  end if
                else if (i_col .eq. 3) then ! Set
                  if (i_row .eq. 1) then
                    write(6,*) 'Function not yet implemented'
                  else if (i_row .eq. 2) then
                    write(6,*) 'Function not yet implemented'
                  else if (i_row .eq. 3) then
                    write(6,*) 'Function not yet implemented'
                  end if
                else if (i_col .eq. 4) then ! Zoom
                  if (i_row .le. 3) then
                    if (i_debug .ge. 8) write(6,*) '--i_cdsp,i_cset = ',i_cdsp,i_cset
                    if (i_cdsp .ne. 0 .and. i_cdsp .ne. i_dsp) then
                      i_rcenter=nint((i_vyo(i_dsp,1)+0.5*i_vys(i_dsp,1))/r_winzoom(i_dsp))+i_winradr(i_dsp)
                      i_ccenter=nint((i_vxo(i_dsp,1)+0.5*i_vxs(i_dsp,1))/r_winzoom(i_dsp))+i_wincadr(i_dsp)
                    end if
                    if (i_debug .ge. 6) write(6,*) 'Center was at (col,row): ',i_ccenter,i_rcenter
                    if (i_row .eq. 1) then
                      r_winzoom(i_dsp)=1.
                      if (i_debug .ge. 6) write(6,*) 'Zoom off: ',r_winzoom(i_dsp)
                    else if (i_row .eq. 2) then
                      r_winzoom(i_dsp)=r_winzoom(i_dsp)*2.
                      if (i_debug .ge. 6) write(6,*) 'Zooming in: ',r_winzoom(i_dsp)
                    else if (i_row .eq. 3) then
                      r_winzoom(i_dsp)=r_winzoom(i_dsp)/2.
                      if (i_debug .ge. 6) write(6,*) 'Zooming out: ',r_winzoom(i_dsp)
                    end if
                    i_winrows(i_dsp) = min(nint(i_setrows(1)*r_winzoom(i_dsp)),32000)
                    i_wincols(i_dsp) = min(nint(i_setcols(1)*r_winzoom(i_dsp)),32000)
                    call resize_win(i_dsp,1,i_wincols(i_dsp),i_winrows(i_dsp))
                    if (i_winradr(i_dsp) .ne.
     &                   max(min(i_rcenter-int((32000/2)/r_winzoom(i_dsp)),i_setrows(1)-int(32000/r_winzoom(i_dsp))),0) ) then
                      i_winradr(i_dsp) =
     &                   max(min(i_rcenter-int((32000/2)/r_winzoom(i_dsp)),i_setrows(1)-int(32000/r_winzoom(i_dsp))),0)
                      i_redraw(i_dsp)=1
                    end if
                    if (i_wincadr(i_dsp) .ne.
     &                   max(min(i_ccenter-int((32000/2)/r_winzoom(i_dsp)),i_setcols(1)-int(32000/r_winzoom(i_dsp))),0) ) then
                      i_wincadr(i_dsp) =
     &                   max(min(i_ccenter-int((32000/2)/r_winzoom(i_dsp)),i_setcols(1)-int(32000/r_winzoom(i_dsp))),0)
                      i_redraw(i_dsp)=1
                    end if
                    if (i_redraw(i_dsp) .eq. 1) then
                      i_redraw(i_dsp) = 0
                      i_event(0) = i_dsp   ! Redraw window
                      i_event(1) = 1
                      i_event(2) = 1
                      i_event(3) = i_vxo(i_dsp,1)-5
                      i_event(4) = i_vyo(i_dsp,1)-5
                      i_event(5) = i_vxs(i_dsp,1)
                      i_event(6) = i_vys(i_dsp,1)
                      if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                      call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    end if
                    i_cpos = nint((i_ccenter-i_wincadr(i_dsp))*r_winzoom(i_dsp)-0.5*i_vxs(i_dsp,1))
                    i_rpos = nint((i_rcenter-i_winradr(i_dsp))*r_winzoom(i_dsp)-0.5*i_vys(i_dsp,1))
                    if (i_debug .ge. 9) write(6,*) 'moving scroll to',i_cpos,i_rpos
                    call move_scroll(i_dsp,1,i_cpos,i_rpos)
                    i_cset = 1
                    i_event(0) = i_dsp
                    i_event(1) = 1
                    i_event(2) = 1
                    i_event(3) = i_vxo(i_dsp,1)-5
                    i_event(4) = i_vyo(i_dsp,1)-5
                    i_event(5) = i_vxs(i_dsp,1)
                    i_event(6) = i_vys(i_dsp,1)
                    if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  else if (i_row .eq. 4) then
                    do i=0,20
                      a_elabl(i)=' '
                      a_edata(i)=' '
                    end do
                    a_elabl(5)='Zoom: '
                    if (r_winzoom(i_dsp) .ge. 1.0) then
                      write(a_edata(5),*) nint(r_winzoom(i_dsp))
                    else
                      write(a_edata(5),*) -nint(1.0/r_winzoom(i_dsp))
                    end if
                    call entry_window(0,a_elabl,a_edata)
                    i_dspselect=i_dsp
                    a_elabl(5)=' '
                    a_edata(5)=' '
                  end if
                  if (r_winzoom(i_dsp) .ge. 1.0) then
                    write(a_label,'(a,i3,a)') 'ZOOM:',nint(r_winzoom(i_dsp)),'x'
                  else
                    write(a_label,'(a,i3,a)') 'ZOOM:',-nint(1.0/r_winzoom(i_dsp)),'x'
                  end if
                  call display_label(i_dsp,1,a_label,1)
                else if (i_col .eq. 5) then   ! Select Menu
                  if (i_row .eq. 1) then
                    do i=0,20
                      a_elabl(i)=' '
                      a_edata(i)=' '
                    end do
                    a_elabl(6)='Display: '
                    write(a_edata(6),'(i1,a)') i_show+1,'|Off|On'  ! Sample Display ON/Off
                    a_elabl(7)='Mode: '
                    write(a_edata(7),'(i1,a)') i_smode+1,'|None|Point|Line|Region'
                    if (i_smode .lt.3) then
                      a_elabl(8)='Width: '
                      write(a_edata(8),*) r_wdth
                    else
                      a_elabl(8)='Density: '
                      write(a_edata(8),*) r_spce
                    end if
                    call entry_window(0,a_elabl,a_edata)
                    i_dspselect=i_dsp
                    a_elabl(6)=' '
                    a_edata(6)=' '
                    a_elabl(7)=' '
                    a_edata(7)=' '
                    a_elabl(8)=' '
                    a_edata(8)=' '
                  else if (i_row .eq. 2) then
                    call gx_getfile(a_value,43)
c                    write(6,*) 'file:',a_value(1:70)
                  else if (i_row .eq. 3) then
                    call gx_getfile(a_value,44)
c                    write(6,*) 'file:',a_value(1:70)
                  else if (i_row .eq. 3) then
                  else if (i_row .eq. 4) then
                    i_samps = 0
                    i_redraw(i_dsp) = 1
                    if (i_redraw(i_dsp) .eq. 1) then
                      i_redraw(i_dsp) = 0
                      i_event(0) = i_dsp   ! Redraw window
                      i_event(1) = 1
                      i_event(2) = 1
                      i_event(3) = i_vxo(i_dsp,1)-5
                      i_event(4) = i_vyo(i_dsp,1)-5
                      i_event(5) = i_vxs(i_dsp,1)
                      i_event(6) = i_vys(i_dsp,1)
                      if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                      call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    end if
                  end if
                else if (i_col .eq. 6) then   ! Print Menu
                  if (i_row .eq. 2) then
                    call get_wininfo(i_dsp,1,i_vxo(i_dsp,1),i_vyo(i_dsp,1)
     &                       ,i_vxs(i_dsp,1),i_vys(i_dsp,1),i_wxs(i_dsp,1),i_wys(i_dsp,1)
     &                       ,i_widget)
                    i_event(0) = 0    ! tells data to go to print file instead of screen
                    i_event(1) = 1
                    i_event(2) = 1
c                    i_event(3) = (i_vxo(i_dsp,1)*r_winzoom(0))/r_winzoom(i_dsp)
c                    i_event(4) = (i_vyo(i_dsp,1)*r_winzoom(0))/r_winzoom(i_dsp)

                    i_event(3) = (max(i_vxo(i_dsp,1)-1,0)/r_winzoom(i_dsp)+i_wincadr(i_dsp))*r_winzoom(0)
                    i_event(4) = (max(i_vyo(i_dsp,1)-1,0)/r_winzoom(i_dsp)+i_winradr(i_dsp))*r_winzoom(0)

c                    i_event(5) = ((min(i_vxs(i_dsp,1)+i_vxo(i_dsp,1),i_wincols(i_dsp))-i_vxo(i_dsp,1))*
c     &                  r_winzoom(0))/r_winzoom(i_dsp)
c                    i_event(6) = ((min(i_vys(i_dsp,1)+i_vyo(i_dsp,1),i_winrows(i_dsp))-i_vyo(i_dsp,1))*
c     &                  r_winzoom(0))/r_winzoom(i_dsp)

                    i_event(5) = max((min(i_vxs(i_dsp,1)-i_pcpad,i_wincols(i_dsp)-i_vxo(i_dsp,1))/
     &                  r_winzoom(i_dsp))*r_winzoom(0),20.)
                    i_event(6) =     (min(i_vys(i_dsp,1)-i_prpad,i_winrows(i_dsp)-i_vyo(i_dsp,1))/
     &                  r_winzoom(i_dsp))*r_winzoom(0)

                    i_event(7) = 0
                    i_event(8) = i_event(4)
                    i_event(9) = i_event(6)
                    if (i_debug .ge. 21 .or. i_debug .eq. -21) write(6,*) 'Print range:',i_event(3),i_event(4),i_event(5),i_event(6)
                    do i_chn=1,i_set
                      i_dspactv(0,i_chn) = i_dspactv(i_dsp,i_chn)
                    end do
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                    i_dspselect=i_dsp
                  else if (i_row .eq. 3) then ! Print setup
                    do i=0,20
                      a_elabl(i)=' '
                      a_edata(i)=' '
                    end do
                    a_elabl(3)='Print Zoom: '
                    if (r_winzoom(0).ge. 1.0) then
                      write(a_edata(3),*) nint(r_winzoom(0))
                    else
                      write(a_edata(3),*) -nint(1.0/r_winzoom(0))
                    end if
                    a_elabl(4)='Format: '
                    write(a_edata(4),'(i1,a)') i_pfmt,'|PPM|Raw RGB|PostScript'
                    call entry_window(0,a_elabl,a_edata)
                    i_dspselect=i_dsp
                    a_elabl(3)=' '
                    a_edata(3)=' '
                    a_elabl(4)=' '
                    a_edata(4)=' '

                  end if
                else if (i_col .eq. 7) then   ! Tool Menu
                  write(6,*) 'Tool: ',a_tname(i_row)(1:max(1,rdflen(a_tname(i_row))))
                  if (i_row .eq. 1) then      ! Plot location
                    if (abs(i_samps) .ge. 1) then
                      a_file=a_workdir(1:rdflen(a_workdir))//'mdx_points.dat'
                      open(unit=19,file=a_file,status='unknown',form='formatted',iostat=i_err)
                      if (i_err .eq. 0) then
                        do i=1,abs(i_samps)
                          if (i_tsamps(i) .gt. 0) write(19,*) ' '
                          write(19,*) i_csamps(i),i_rsamps(i),(r_vsamps(i,j),j=1,i_set),i_tsamps(i)
                        end do
                        close(19)
                        a_value = 'xmgrace -free -noask -pexec "yaxes invert on" '//a_file(1:rdflen(a_file))//' &'
                        call system(a_value)
c                        i_samps=-abs(i_samps)
                      else
                        write(6,*) 'Cant open file:'//a_file(1:50)
                      end if
                    end if
                  else if (i_row .eq. 2) then      ! Plot Profiles
                    if (abs(i_samps) .ge. 2) then
                      a_file=a_workdir(1:rdflen(a_workdir))//'mdx_points.dat'
                      open(unit=19,file=a_file,status='unknown',form='formatted',iostat=i_err)
                      if (i_err .eq. 0) then
                        do i=1,abs(i_samps)
                          if (i .eq. 1) then
                            r_path = 0.0
                          else
                            r_path = r_path + sqrt(float(i_csamps(i)-i_csamps(i-1))**2.0+float(i_rsamps(i)-i_rsamps(i-1))**2.0)
                          end if

                          a_label=' '
                          do j=1,i_set
                             if (i_dspactv(i_dsp,j) .eq. 1) then
                               write(a_label1,*) r_vsamps(i,j)
                               a_label = a_label(1:max(1,rdflen(a_label)))//' '//a_label1
                             end if
                          end do
                          if (i_tsamps(i) .gt. 0) write(19,*) ' '
                          write(19,*) r_path,' ',a_label(1:max(1,rdflen(a_label)))
                          i_clast=i_csamps(i)
                          i_rlast=i_rsamps(i)
                          if (i .lt. abs(i_samps)) then
                            if (i_tsamps(i+1) .eq. -2) then   ! fill in extra points
                              r_dist=sqrt((i_csamps(i+1)-i_csamps(i))**2.+(i_rsamps(i+1)-i_rsamps(i))**2.)
                              do ii=1,int(r_dist/r_spce)
                                i_cc=i_csamps(i)+nint((i_csamps(i+1)-i_csamps(i))*(ii*r_spce)/r_dist)
                                i_rr=i_rsamps(i)+nint((i_rsamps(i+1)-i_rsamps(i))*(ii*r_spce)/r_dist)
                                if (i_cc .ne. i_clast .or. i_rr .ne. i_rlast) then
                                  i_clast = i_cc
                                  i_rlast = i_rr
                                  a_label=' '

                                  do i_chn=1,i_set
                                    if (i_dspactv(i_dsp,i_chn) .eq. 1) then
                                      if (a_setfile(i_chn)(1:1) .ne. '=') then
                                        call readdat(i_setunit(i_chn),
     &                                          i_setrows(i_chn),
     &                                          i_setcols(i_chn),
     &                                          i_setshdr(i_chn),
     &                                          i_setstlr(i_chn),
     &                                          i_setrhdr(i_chn),
     &                                          i_setrtlr(i_chn),
     &                                          i_setchdr(i_chn),
     &                                          i_setctlr(i_chn),
     &                                          i_setvend(i_chn)*i_endian,
     &                                          i_setvfmt(i_chn),
     &                                          r_setvmlt(i_chn),
     &                                          r_setvadr(i_chn),
     &                                          r_setvmin(i_chn),
     &                                          r_setvmax(i_chn),
     &                                          b_setvnul(0,i_chn),
     &                                          i_rr,i_cc-1,3,
     &                                          r_data,i_data,readfunc,i_err)
                                      else
                                        do j=0,2
                                          r_data(j)=0
                                          i_data(j)=0
                                        end do
                                        i_opr=1
                                        i_flg=0
                                        a_value = ' '
                                        do iii = 2,rdflen(a_setfile(i_chn))+1
                                          if (index('+-*/x',a_setfile(i_chn)(iii:iii)) .gt. 0 .or. a_setfile(i_chn)(iii:iii) .eq. ' ') then
                                            if (a_value .ne. ' ') then
                                              read(a_value,*) r_value
                                              if (i_opr .eq. 1) then
                                                r_data(1)=r_data(1)+r_value
                                              else if (i_opr .eq. 2) then
                                                r_data(1)=r_data(1)-r_value
                                              else if (i_opr .eq. 3) then
                                                r_data(1)=r_data(1)*r_value
                                              else if (i_opr .eq. 4) then
                                                r_data(1)=r_data(1)/r_value
                                              end if
                                              a_value = ' '
                                            end if
                                          end if
                                          if(a_setfile(i_chn)(iii:iii) .eq. '+') then
                                            i_opr=1
                                          else if (a_setfile(i_chn)(iii:iii) .eq. '-') then
                                            i_opr=2
                                          else if (a_setfile(i_chn)(iii:iii) .eq. 'x') then
                                            i_opr=3
                                          else if (a_setfile(i_chn)(iii:iii) .eq. '/') then
                                            i_opr=4
                                          else if (a_setfile(i_chn)(iii:iii) .eq. 's' .or. a_setfile(i_chn)(iii:iii) .eq. 'S') then
                                            i_flg=1
                                          else if (i_flg .eq. 1) then
                                            i_flg = 0
                                            i_tmp = max(min((ichar(a_setfile(i_chn)(iii:iii))-ichar('0')),i_set+1),1)
                                            if (i_tmp .gt. i_set) i_tmp=0
                                            if (i_tmp .ne. 0) then
                                              call readdat(i_setunit(i_tmp),
     &                                          i_setrows(i_tmp),
     &                                          i_setcols(i_tmp),
     &                                          i_setshdr(i_tmp),
     &                                          i_setstlr(i_tmp),
     &                                          i_setrhdr(i_tmp),
     &                                          i_setrtlr(i_tmp),
     &                                          i_setchdr(i_tmp),
     &                                          i_setctlr(i_tmp),
     &                                          i_setvend(i_tmp)*i_endian,
     &                                          i_setvfmt(i_tmp),
     &                                          r_setvmlt(i_tmp),
     &                                          r_setvadr(i_tmp),
     &                                          r_setvmin(i_tmp),
     &                                          r_setvmax(i_tmp),
     &                                          b_setvnul(0,i_tmp),
     &                                          i_rr,i_cc-1,3,
     &                                          r_data2,i_data2,readfunc,i_err)
                                              i_data(1)=i_data(1)+i_data2(1)
                                              if (i_opr .eq. 1) then
                                                r_data(1)=r_data(1)+r_data2(1)
                                              else if (i_opr .eq. 2) then
                                                r_data(1)=r_data(1)-r_data2(1)
                                              else if (i_opr .eq. 3) then
                                                r_data(1)=r_data(1)*r_data2(1)
                                              else if (i_opr .eq. 4) then
                                                r_data(1)=r_data(1)/r_data2(1)
                                              else
                                                r_data(1)=r_data(1)+r_data2(1)
                                              end if
                                            end if
                                          else
                                            a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(iii:iii)
                                          end if
                                        end do
                                      end if
                                      write(a_label1,*) r_data(1)
                                      a_label = a_label(1:max(1,rdflen(a_label)))//' '//a_label1
                                    end  if
                                  end do
                                  write(19,*) r_path+sqrt((i_cc-i_csamps(i))**2.+(i_rr-i_rsamps(i))**2.),' ',
     &                                           a_label(1:max(1,rdflen(a_label)))
                                end if !  i_cc .ne. i_clast .or. i_rr .ne. i_rlast
                              end do
                            end if
                          end if

                        end do
                        close(19)
                        a_value = 'xmgrace -free -noask -nxy '//a_file(1:rdflen(a_file))//' &'
                        call system(a_value)
c                        i_samps=-abs(i_samps)
                      else
                        write(6,*) 'Cant open file:'//a_file(1:50)
                      end if
                    end if
                  else if (i_row .ge. 3 .and. i_row .le. 5) then      ! Tool 3, 4, or 5
                    i_act=0
                    do i=i_set,1,-1
                      if (i_dspactv(i_dsp,i) .eq. 1) i_act = i
                    end do
                    if (i_act .gt. 0) then
                      a_file=a_workdir(1:rdflen(a_workdir))//'mdx_points.dat'
                      open(unit=19,file=a_file,status='unknown',form='formatted',iostat=i_err)
                      if (i_err .eq. 0) then
c                        write(19,*) a_setfile(i_act)(1:rdflen(a_setfile(i_act))),' ',a_setname(i_act)(1:rdflen(a_setname(i_act))),i_setcols(i_act),i_setrows(i_act)
                        do i=1,abs(i_samps)
                          if (i .eq. 1 .or. i_tsamps(i) .gt. 0) then
                            r_path = 0.0
                          else
                            r_path = r_path + sqrt(float(i_csamps(i)-i_csamps(i-1))**2.0+float(i_rsamps(i)-i_rsamps(i-1))**2.0)
                          end if
                          write(19,'(3i8,2e15.5)') i_csamps(i),i_rsamps(i),i_tsamps(i),r_path,r_vsamps(i,i_act)
                        end do
                        close(19)
                        write(a_value,'(9i10,9e15.5)')
     &                      i_setcols(i_act),i_setrows(i_act),i_setvend(i_act),
     &                      i_setvfmt(i_act),i_setshdr(i_act),
     &                      i_setrhdr(i_act),i_setrtlr(i_act),
     &                      i_setchdr(i_act),i_setctlr(i_act),
     &                      r_setvmin(i_act),r_setvmax(i_act),
     &                      r_setrmlt(i_act),r_setradr(i_act),
     &                      r_setcmlt(i_act),r_setcadr(i_act),
     &                      r_setpegv(1,i_act),r_setpegv(2,i_act),r_setpegv(3,i_act)
                        a_value = a_file(1:rdflen(a_file))//' '//a_setfile(i_act)(1:rdflen(a_setfile(i_act)))//' '//a_value
                        a_value = a_tcmnd(i_row)(1:rdflen(a_tcmnd(i_row)))//' '//a_value
                        a_value = a_value(1:rdflen(a_value))//' '//a_twait(i_row)
                        if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) a_value(1:rdflen(a_value))
                        call system(a_value)
                        i_redraw(i_dsp)=1
                      else
                        write(6,*) 'Cant open file:'//a_file(1:50)
                      end if
                    end if
                  end if
                  if (i_redraw(i_dsp) .eq. 1) then
                    i_redraw(i_dsp) = 0
                    i_event(0) = i_dsp   ! Redraw window
                    i_event(1) = 1
                    i_event(2) = 1
                    i_event(3) = i_vxo(i_dsp,1)-5
                    i_event(4) = i_vyo(i_dsp,1)-5
                    i_event(5) = i_vxs(i_dsp,1)
                    i_event(6) = i_vys(i_dsp,1)
                    if (i_debug .ge. 6) write(6,*) 'i_bcnt2 =',i_bcnt
                    call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)
                  end if
                else if (i_col .eq. 8) then
                  ! Do nothing
                end if
              end if

              do ib=1,i_bcnt-1    ! Move Items up in buffer
                do i=0,10
                  i_bdat(i,ib) = i_bdat(i,ib+1)
                end do
              end do
              i_bcnt = i_bcnt-1
            else
              i_cset = 0
              if (i_debug .ge. 8) write(6,*) '--Setting i_cset = 0'
            end if

            if (i_bcnt .eq. 0 .and. i_ecnt .gt. 0 .or. i_r .ge. 0) then   ! Expose Command to execute
              if (i_r .le. -1) then ! just starting to process command
                call get_ecmd(I_WKSPACE,i_ecnt,i_edat,i_ecmd,i_debug)
                i_edsp = i_ecmd(0)
                i_ewin = i_ecmd(1)
                i_eevn = i_ecmd(2)
                i_ecol = i_ecmd(3)
                i_erow = i_ecmd(4)
                i_encx = i_ecmd(5)   ! columns per line
                i_enrx = i_ecmd(6)   ! number of lines in this segment
                if (i_debug .ge. 5) write(6,*) 'initializing expose'
                if (i_edsp .eq. 0 .and. i_pinit .eq. 0) then ! initialize printer data to file
                  i_pinit = 1
                  i_pid = 30
                  a_file=a_workdir(1:rdflen(a_workdir))//'out.ppm'
                  open(unit=i_pid,file=a_file,status='unknown',form='unformatted',
     &                   access='direct',recl=i_encx*3,iostat=i_err)

                  if (i_err .ne. 0) then
                    write(6,*) ' '
                    write(6,*) 'Error Opening out.ppm   PPM file not created.  ',i_err
                    write(6,*)
                    i_err=0
                  else

                    a_label = 'Creating PPM file'
                    if (i_winactv(i_dspselect) .ne. 0 )call display_label(i_dspselect,1,a_label,1)
                    if (i_debug .ge. 2) then
                      write(6,*) ' '
                      write(6,'(1x,a)') 'Creating PPM File -- '
                    end if

                    a_out='P6'
                    b_out(3)=13
                    do i=4,3*i_encx
                      b_out(i)=32
                    end do
                    write(a_value,'(3i15)') i_encx,i_ecmd(9),255
c                    write(6,*) 'a_value=',a_value(1:50)
c                    write(6,*) 'rdflen(a_value)  =',rdflen(a_value)
                    do i = 1,rdflen(a_value)
                      b_out(3*i_encx-rdflen(a_value)-1+i) = ichar(a_value(i:i))
                    end do
                    b_out(i_encx*3) = 13
                    write(i_pid,rec=1,iostat=i_stat) (b_out(i),i=1,i_encx*3)
                  end if


                end if

                i_r = 0

                if (r_winzoom(i_edsp) .ge. 1) then
                  i_strt=i_encx-1
                  i_stop=0
                  i_incr=-1
                  i_coff=mod(i_ecol,nint(r_winzoom(i_edsp)))
c                 write(6,*) 'strt,stop,i_coff=',i_strt,i_stop,i_coff,i_incr
                else
                  i_strt=0
                  i_stop=i_encx-1
                  i_incr=1
                  i_coff=0
                end if
              else ! in the middle of reading data and filling display buffer
                if (i_debug .ge. 6 .and. i_r .eq. 0) write(6,*) 'gathering data for expose'
                    if (i_debug .ge. 5) write(6,*) 'reading at line: ',i_r+1,
     &                         int(i_erow/r_winzoom(i_edsp)),int(i_ecol/r_winzoom(i_edsp)),
     &                         int(i_enrx/r_winzoom(i_edsp)),int(i_encx/r_winzoom(i_edsp))
                if (i_edsp .gt. 0) then
                  if (i_debug .ge. 4 .and. i_r .lt. i_vyo(i_edsp,i_ewin)-i_erow-2)
     &               write(6,*) '    skipping lines at top: ',i_r,' to ',i_vyo(i_edsp,i_ewin)-i_erow-2
                  i_r = max(i_r,i_vyo(i_edsp,i_ewin)-i_erow-2)

                  if (i_debug .ge. 4 .and. i_vyo(i_edsp,i_ewin)+i_vys(i_edsp,i_ewin)-i_erow .lt. i_enrx)
     &               write(6,*) '    skipping lines at bottom: ',i_enrx,' to ',
     &                         min(i_enrx,i_vyo(i_edsp,i_ewin)+i_vys(i_edsp,i_ewin)-i_erow)
                  i_enrx = min(i_enrx,i_vyo(i_edsp,i_ewin)+i_vys(i_edsp,i_ewin)-i_erow)
                end if
                do while (i_bcnt .le. 0 .and. i_r .lt. i_enrx)

c                  write(6,*) 'i_r=',i_r,i_encx-1
                  i_dflag = 0
                  do i_c=0,i_encx-1
                    i_pos=i_c+i_r*i_encx
                    r_rdat(i_pos)=0.0
                    r_gdat(i_pos)=0.0
                    r_bdat(i_pos)=0.0
                    i_indx(i_pos)=0.0
                  end do
                  do i_chn = 1,i_set
                    if (i_dspactv(i_edsp,i_chn) .eq. 1) then
                      if (a_setfile(i_chn)(1:1) .ne. '=') then
                      call readdat(i_setunit(i_chn),
     &                          i_setrows(i_chn),
     &                          i_setcols(i_chn),
     &                          i_setshdr(i_chn),
     &                          i_setstlr(i_chn),
     &                          i_setrhdr(i_chn),
     &                          i_setrtlr(i_chn),
     &                          i_setchdr(i_chn),
     &                          i_setctlr(i_chn),
     &                          i_setvend(i_chn)*i_endian,
     &                          i_setvfmt(i_chn),
     &                          r_setvmlt(i_chn),
     &                          r_setvadr(i_chn),
     &                          r_setvmin(i_chn),
     &                          r_setvmax(i_chn),
     &                          b_setvnul(0,i_chn),
     &                          int((i_erow+i_r)/r_winzoom(i_edsp))+i_winradr(i_edsp),
     &                          int(i_ecol/r_winzoom(i_edsp))+i_wincadr(i_edsp),
     &                          int(i_encx/r_winzoom(i_edsp))+2,
     &                          r_data,i_data,readfunc,i_err)
                      else
                        do j=0,int(i_encx/r_winzoom(i_edsp))+2
                          r_data(j)=0
                          i_data(j)=0
                        end do
                        i_opr=1
                        i_flg=0
                        a_value=' '
                        do i = 2,rdflen(a_setfile(i_chn))+1
                          if (index('+-*/x',a_setfile(i_chn)(i:i)) .gt. 0 .or. a_setfile(i_chn)(i:i) .eq. ' ') then
                            if (a_value .ne. ' ') then
                              read(a_value,*) r_value
                              if (i_opr .eq. 1) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)+r_value
                                end do
                              else if (i_opr .eq. 2) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)-r_value
                                end do
                              else if (i_opr .eq. 3) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)*r_value
                                end do
                              else if (i_opr .eq. 4) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)/r_value
                                end do
                              end if
                              a_value = ' '
                            end if
                          end if
                          if(a_setfile(i_chn)(i:i) .eq. '+') then
                            i_opr=1
                          else if (a_setfile(i_chn)(i:i) .eq. '-') then
                            i_opr=2
                          else if (a_setfile(i_chn)(i:i) .eq. '*' .or. a_setfile(i_chn)(i:i) .eq. 'x') then
                            i_opr=3
                          else if (a_setfile(i_chn)(i:i) .eq. '/') then
                            i_opr=4
                          else if (a_setfile(i_chn)(i:i) .eq. 's' .or. a_setfile(i_chn)(i:i) .eq. 'S') then
                            i_flg=1
                          else if (i_flg .eq. 1) then
                            i_flg = 0
                            i_tmp = max(min((ichar(a_setfile(i_chn)(i:i))-ichar('0')),i_set+1),1)
                            if (i_tmp .gt. i_set) i_tmp=0
                            if (i_tmp .ne. 0) then
                              call readdat(i_setunit(i_tmp),
     &                          i_setrows(i_tmp),
     &                          i_setcols(i_tmp),
     &                          i_setshdr(i_tmp),
     &                          i_setstlr(i_tmp),
     &                          i_setrhdr(i_tmp),
     &                          i_setrtlr(i_tmp),
     &                          i_setchdr(i_tmp),
     &                          i_setctlr(i_tmp),
     &                          i_setvend(i_tmp)*i_endian,
     &                          i_setvfmt(i_tmp),
     &                          r_setvmlt(i_tmp),
     &                          r_setvadr(i_tmp),
     &                          r_setvmin(i_tmp),
     &                          r_setvmax(i_tmp),
     &                          b_setvnul(0,i_tmp),
     &                          int((i_erow+i_r)/r_winzoom(i_edsp))+i_winradr(i_edsp),
     &                          int(i_ecol/r_winzoom(i_edsp))+i_wincadr(i_edsp),
     &                          int(i_encx/r_winzoom(i_edsp))+2,
     &                          r_data2,i_data2,readfunc,i_err)
                              do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                i_data(j)=i_data(j)+i_data2(j)
                              end do
                              if (i_opr .eq. 1) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)+r_data2(j)
                                end do
                              else if (i_opr .eq. 2) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)-r_data2(j)
                                end do
                              else if (i_opr .eq. 3) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)*r_data2(j)
                                end do
                              else if (i_opr .eq. 4) then
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)/r_data2(j)
                                end do
                              else
                                do j=0,int(i_encx/r_winzoom(i_edsp))+2
                                  r_data(j)=r_data(j)+r_data2(j)
                                end do
                              end if
                            end if
                          else
                            a_value = a_value(1:max(1,rdflen(a_value)))//a_setfile(i_chn)(i:i)
                          end if
                        end do
                      end if
                      do i_c = i_strt,i_stop,i_incr
                        if (r_winzoom(i_edsp) .ne. 1.) then
                          r_data(i_c) = r_data(int((i_c+i_coff)/r_winzoom(i_edsp)))
                          i_data(i_c) = i_data(int((i_c+i_coff)/r_winzoom(i_edsp)))
                        end if
                        i_pos=i_c+i_r*i_encx
                        if (i_data(i_c) .eq. 0 .and. i_indx(i_pos) .eq. 0) then
                          r_data(i_c) = max(r_dspcplw(i_chn),min(r_dspcphi(i_chn),r_data(i_c)))     ! Clip data
                          r_data(i_c) = (r_data(i_c)-r_dspaddr(i_chn))                              ! Shift data
                          if (i_dspmode(i_chn) .eq. 6) then                                         ! Wrap data
                            r_data(i_c) = wrap(r_data(i_c),r_dspwrap(i_chn))
                          end if
                          r_data(i_c) = r_data(i_c)/r_dspmult(i_chn)                                ! Scale data
                          if (r_dspexpn(i_chn) .ne. 1.0) then                                       ! Compress data
                            r_data(i_c) = min(1.0,max(0.0,r_data(i_c)))**r_dspexpn(i_chn)
                          end if
                          i_data(i_c) = max(0,min(i_dspnumt(i_chn)-1,int(i_dspnumt(i_chn)*r_data(i_c))))
                          if (i_dflag .eq. 0) then
                            r_rdat(i_pos) = r_dspredt(i_data(i_c),i_chn)
                            r_gdat(i_pos) = r_dspgrnt(i_data(i_c),i_chn)
                            r_bdat(i_pos) = r_dspblut(i_data(i_c),i_chn)
                          else
                            if (i_dspmixv(i_chn) .eq. 1)  then ! add
                              r_rdat(i_pos) =r_rdat(i_pos)+r_dspredt(i_data(i_c),i_chn)
                              r_gdat(i_pos) =r_gdat(i_pos)+r_dspgrnt(i_data(i_c),i_chn)
                              r_bdat(i_pos) =r_bdat(i_pos)+r_dspblut(i_data(i_c),i_chn)
                            else if (i_dspmixv(i_chn) .eq. 2) then ! mult
                              r_rdat(i_pos) =r_rdat(i_pos)*r_dspredt(i_data(i_c),i_chn)
                              r_gdat(i_pos) =r_gdat(i_pos)*r_dspgrnt(i_data(i_c),i_chn)
                              r_bdat(i_pos) =r_bdat(i_pos)*r_dspblut(i_data(i_c),i_chn)
                            else if (i_dspmixv(i_chn) .eq. 3) then ! max
                              r_rdat(i_pos) = max(r_rdat(i_pos),r_dspredt(i_data(i_c),i_chn))
                              r_gdat(i_pos) = max(r_gdat(i_pos),r_dspgrnt(i_data(i_c),i_chn))
                              r_bdat(i_pos) = max(r_bdat(i_pos),r_dspblut(i_data(i_c),i_chn))
                            end if
     &
                          end if
                        else
                          i_indx(i_pos) = 1 ! mark pixel as bad and set color to default background
                          r_rdat(i_pos) = max(0.0,min(0.9999,(i_nullclr(1)/255.)))
                          r_gdat(i_pos) = max(0.0,min(0.9999,(i_nullclr(2)/255.)))
                          r_bdat(i_pos) = max(0.0,min(0.9999,(i_nullclr(3)/255.)))
                        end if
                      end do
                      i_dflag = 1
                    end if
                  end do  ! Loop over channels
                  if (i_ponly .eq. 0 .and. mod(i_r,i_eventmod) .eq. 1) then
                    call getevent(1,i_event)
                    if (i_debug .ge. 5) then
                       if (i_event(0) .ne. 0) then
                          write(6,'(1x,a,7i10)')
     &                        'i_event=',i_event(0),i_event(1),i_event(2)
     &                        ,i_event(3),i_event(4),i_event(5),i_event(6)
                       end if
                    end if
                    if (i_event(2) .ne. 9 .or. i_button .ne. 0) call buffer_cmd(i_event,i_bdat,i_bcnt,2,I_BMAX,i_abort,i_debug)

                  end if
                  i_r = i_r+1
                end do  ! Loop over rows
                if (i_r .ge. i_enrx) then
                  if (i_r .eq. i_enrx) then
                    r_sum=0.0d0
                    i_bpl = i_encx
                    i_enrx2= i_r
                    if (i_edsp .ne. 0) then
                      if (i_debug .eq. -3 .or. i_debug .ge. 3) write(6,*) 'call disp',i_edsp,i_ewin,i_ecol,i_erow,i_encx,i_enrx2,i_bpl
                      call display_img(i_edsp,i_ewin,i_ecol,i_erow,i_encx,i_enrx2,i_bpl,r_rdat,r_gdat,r_bdat)
                      if (i_show .eq. 1) then ! show lines turned on
                        do i=1,i_samps
                          if (.true.) then
                            r_row(1)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/r_winzoom(i_edsp)-i_rsamps(max(1,i-1)))
     &                         /float(i_winrows(i_edsp))
                            r_row(2)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/r_winzoom(i_edsp)-i_rsamps(i         ))
     &                         /float(i_winrows(i_edsp))
                            r_col(1)=r_winzoom(i_edsp)*i_csamps(max(1,i-1))/float(i_wincols(i_edsp))
                            r_col(2)=r_winzoom(i_edsp)*i_csamps(i         )/float(i_wincols(i_edsp))
                            r_rowlow=min(r_row(1),r_row(2))
                            r_rowhigh=max(r_row(1),r_row(2))
                            r_collow=min(r_col(1),r_col(2))
                            r_colhigh=max(r_col(1),r_col(2))
                            if (r_rowlow*i_winrows(i_edsp) .ge. i_wys(i_edsp,1)-(i_erow) .or.
     &                          r_rowhigh*i_winrows(i_edsp) .le. i_wys(i_edsp,1)-(i_erow+i_enrx2)) then
c                            if (r_rowlow*i_winrows(i_edsp) .ge. (i_erow+i_enrx2) .or. r_rowhigh*i_winrows(i_edsp) .le. i_erow) then
c                              write(6,*) 'row expose: ',int(r_rowlow*i_winrows(i_edsp)),int(r_rowhigh*i_winrows(i_edsp)),i_wys(i_edsp,1)-(i_erow+i_enrx2),i_wys(i_edsp,1)-(i_erow)
c                              write(6,*) 'row expose: ',int(r_rowlow*i_winrows(i_edsp)),int(r_rowhigh*i_winrows(i_edsp)),i_erow,i_erow+i_enrx2
                            else
                              if (r_collow*i_wincols(i_edsp) .ge. i_ecol+i_encx .or. r_colhigh*i_wincols(i_edsp) .le. i_ecol) then
                                ! do nothing
                              else
                                if (i_tsamps(i) .eq. 1) then
                                  r_row(1)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(i))/float(i_winrows(i_edsp))-2/float(i_winrows(i_edsp))
                                  r_row(2)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(i))/float(i_winrows(i_edsp))+2/float(i_winrows(i_edsp))
                                  r_col(1)=r_winzoom(i_edsp)*i_csamps(i)/float(i_wincols(i_edsp))-2/float(i_winrows(i_edsp))
                                  r_col(2)=r_winzoom(i_edsp)*i_csamps(i)/float(i_wincols(i_edsp))+2/float(i_winrows(i_edsp))
                                  call plot_data(i_edsp,1,2,r_col,r_row)
                                  r_row(1)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(i))/float(i_winrows(i_edsp))+2/float(i_winrows(i_edsp))
                                  r_row(2)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(i))/float(i_winrows(i_edsp))-2/float(i_winrows(i_edsp))
                                  r_col(1)=r_winzoom(i_edsp)*i_csamps(i)/float(i_wincols(i_edsp))-2/float(i_winrows(i_edsp))
                                  r_col(2)=r_winzoom(i_edsp)*i_csamps(i)/float(i_wincols(i_edsp))+2/float(i_winrows(i_edsp))
                                  call plot_data(i_edsp,1,2,r_col,r_row)
                                  if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 're-drawing point: ',i,
     &                                 r_col(1)+2,r_row(1)-2
                                else if (i_tsamps(i) .lt. 0) then
                                  r_row(1)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(max(1,i-1)))/float(i_winrows(i_edsp))
                                  r_row(2)=r_winzoom(i_edsp)*(i_winrows(i_edsp)/
     &                                  r_winzoom(i_edsp)-i_rsamps(i))/float(i_winrows(i_edsp))
                                  r_col(1)=r_winzoom(i_edsp)*i_csamps(max(1,i-1))/float(i_wincols(i_edsp))
                                  r_col(2)=r_winzoom(i_edsp)*i_csamps(i)/float(i_wincols(i_edsp))
                                  call plot_data(i_edsp,1,2,r_col,r_row)
                                  if (i_debug .eq. -12 .or. i_debug .ge. 12) write(6,*) 're-drawing line: ',i,
     &                                 r_col(1),r_row(1),r_col(2),r_row(2)
                                end if
                              end if
                            end if
                          end if
                        end do
                      end if  ! end i_show

                    else
                      if (i_debug .gt. 3) write(6,*) 'Printing block: ',i_ecmd(7),i_erow,i_ecmd(8)
                      if (mod(i_ecmd(7)+1,1000) .eq. 0) write(6,*) '  Blocks remaining: ',i_ecmd(7)+1
                      do ir=0,i_enrx2-1

                        do ic=0,min(i_encx,I_WKSPACE)-1
                          b_out(ic*3+1) = max(0,min(255,int(r_rdat(ic+ir*i_encx)*256)))
                          b_out(ic*3+2) = max(0,min(255,int(r_gdat(ic+ir*i_encx)*256)))
                          b_out(ic*3+3) = max(0,min(255,int(r_bdat(ic+ir*i_encx)*256)))
                        end do

                        write(i_pid,rec=2+ir+i_erow-i_ecmd(8),iostat=i_stat) (b_out(ib),ib=1,3*i_encx)

                      end do

                      if (i_ecmd(7) .eq. 0) then
                        close(i_pid,iostat=i_stat)
                        i_pinit=0
                        if (i_ponly .ne. 0) then
                          i_ponly=0
                          i_done=1
                        end if
                        a_label = 'Print Complete'
                        if (i_winactv(i_dspselect) .ne. 0 )call display_label(i_dspselect,1,a_label,1)
                        if (i_debug .ge. 2) then
                          write(6,*) 'Print file complete'
                          write(6,*) ' '
                        end if
                      end if
                    end if
                  end if
                  i_r = -1
                  if (i_debug .ge. 6) write(6,*) 'i_ecnt2=',i_ecnt
                end if

              end if
            end if

          end do


c     !@#&%
          write(6,*) ' '
          write(6,*) 'mdx Done'
          write(6,*) ' '

        end

        subroutine get_mdxdefaults(a_tname,a_tcmnd,a_twait,a_nullclr,i_pcpad,i_prpad,r_winzoom,
     &                  a_workdir,a_colordir,a_colorname,a_colorfile,i_colormax,i_close,a_clickcmd)

          implicit none

          integer       I_KMAX
          parameter     (I_KMAX=20)

          character*20  a_tname(5)
          character*1   a_twait(5)
          character*120 a_tcmnd(5)
          character*120 a_clickcmd(6)
          character*120 a_nullclr
          character*20  a_colorname(I_KMAX)
          character*255 a_colorfile(I_KMAX)
          integer       i_colormax
          integer       i_close
          real*4        r_winzoom(0:5)

          character*255 a_workdir
          character*255 a_colordir

          integer i
          integer j
          integer i_len
          integer i_found
          integer i_inarg
          integer i_prpad
          integer i_pcpad
          character*255 a_inarg(255)
          character*120 a_home

          character*120 a_keyw
          character*120 a_valu
          character*120 a_unit
          character*120 a_dimn
          character*120 a_elem
          character*120 a_oper
          character*120 a_cmnt

          integer rdflen
          external rdflen

          integer rdfnum
          external rdfnum

          character*40 rdflower
          external rdflower

          call getenv('HOME',a_home)
          if (a_home .ne. ' ') then
            a_home=a_home(1:rdflen(a_home))//'/.MDXinit'
          else
            a_home='.MDXinit'
          end if
          call rdf_init('ERROR_SCREEN=OFF')
          call rdf_clear()
          call rdf_read(a_home)

c          write(6,*) 'rdfnum = ',rdfnum()
          do i=1,rdfnum()
            call rdf_viewcols(i,a_keyw,a_valu,a_unit,a_dimn,a_elem,a_oper,a_cmnt)
c            write(6,*) ' a_keyw:',a_keyw
c            write(6,*) ' a_valu:',a_valu
            a_keyw=rdflower(a_keyw)
            if (a_keyw .eq. ' ') then
              ! do nothing
            else if (a_keyw .eq. 'tool3') then
              i_found=3
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .ge. 2) then
                a_tname(i_found)=a_inarg(1)
                a_tcmnd(i_found)=a_inarg(2)
                a_twait(i_found)=' '
                do j=3,i_inarg
                  if (a_inarg(j) .ne. '&') then
                    a_tcmnd(i_found)=a_tcmnd(i_found)(1:rdflen(a_tcmnd(i_found)))//' '//a_inarg(j)
                  else
                    a_twait(i_found)='&'
                  end if
                end do
              end if
            else if (a_keyw .eq. 'tool4') then
              i_found=4
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .ge. 2) then
                a_tname(i_found)=a_inarg(1)
                a_tcmnd(i_found)=a_inarg(2)
                a_twait(i_found)=' '
                do j=3,i_inarg
                  if (a_inarg(j) .ne. '&') then
                    a_tcmnd(i_found)=a_tcmnd(i_found)(1:rdflen(a_tcmnd(i_found)))//' '//a_inarg(j)
                  else
                    a_twait(i_found)='&'
                  end if
                end do
              end if
            else if (a_keyw .eq. 'tool5') then
              i_found=5
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .ge. 2) then
                a_tname(i_found)=a_inarg(1)
                a_tcmnd(i_found)=a_inarg(2)
                a_twait(i_found)=' '
                do j=3,i_inarg
                  if (a_inarg(j) .ne. '&') then
                    a_tcmnd(i_found)=a_tcmnd(i_found)(1:rdflen(a_tcmnd(i_found)))//' '//a_inarg(j)
                  else
                    a_twait(i_found)='&'
                  end if
                end do
              end if
            else if (a_keyw .eq. 'click') then
              i_found=1
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .ge. 2) then
                a_clickcmd(1)=a_inarg(2)
                do j=3,i_inarg
                    a_clickcmd(i_found)=a_clickcmd(i_found)(1:rdflen(a_clickcmd(i_found)))//' '//a_inarg(j)
                end do
              end if
            else if (a_keyw .eq. 'addtool') then
              i_found=0
              do j=5,3,-1
                if (a_tname(j) .eq. ' ') i_found=j
              end do
              if (i_found .ne. 0) then
                call rdf_getfields(a_valu,i_inarg,a_inarg)
                if (i_inarg .ge. 2) then
                  a_tname(i_found)=a_inarg(1)
                  a_tcmnd(i_found)=a_inarg(2)
                  a_twait(i_found)=' '
                  do j=3,i_inarg
                    if (a_inarg(j) .ne. '&') then
                      a_tcmnd(i_found)=a_tcmnd(i_found)(1:rdflen(a_tcmnd(i_found)))//' '//a_inarg(j)
                    else
                      a_twait(i_found)='&'
                    end if
                  end do
                end if
              end if
            else if (a_keyw .eq. 'null_color') then
              a_nullclr=a_valu
            else if (a_keyw .eq. 'addcmap') then
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .eq. 2) then
                i_colormax=i_colormax+1
                if (i_colormax .gt. I_KMAX) then
                  i_colormax=I_KMAX
                  write(6,*) 'i_colormax error'
                end if
                a_colorname(i_colormax)=a_inarg(1)
                a_colorfile(i_colormax)=a_inarg(2)
c                write(6,*) 'adding color file: ',a_colorfile(i_colormax)
              end if
            else if (a_keyw .eq. 'delcmap') then
              call rdf_getfields(a_valu,i_inarg,a_inarg)
              if (i_inarg .eq. 1) then
                i_found=0
                do j=1,i_colormax
                  if (a_colorname(j) .eq. a_inarg(1)) i_found=i_found+1
                  if (j+i_found .lt. I_KMAX) then
                    a_colorfile(j)=a_colorfile(j+i_found)
                    a_colorname(j)=a_colorname(j+i_found)
                  else
                    a_colorfile(j)=' '
                    a_colorname(j)=' '
                  end if
                end do
                i_colormax=i_colormax-i_found
              end if
            else if (a_keyw .eq. 'pcpad') then
              read(a_valu,*) i_pcpad
            else if (a_keyw .eq. 'prpad') then
              read(a_valu,*) i_prpad
            else if (a_keyw .eq. 'close') then
              if (a_valu .eq. 'on' .or. a_valu .eq. 'ON') i_close=1
              if (a_valu .eq. 'off' .or. a_valu .eq. 'OFF') i_close=0
            else if (a_keyw .eq. 'zoom') then
              read(a_valu,*) r_winzoom(1)
              if (r_winzoom(1) .lt. 0.) r_winzoom(1) = abs(1./r_winzoom(1))
            else if (a_keyw .eq. 'pzoom') then
              read(a_valu,*) r_winzoom(0)
              if (r_winzoom(0) .lt. 0.) r_winzoom(0) = abs(1./r_winzoom(0))
            else if (a_keyw .eq. 'workdir') then
              a_workdir=a_valu
              if (a_workdir .eq. ' ') a_workdir='./'
              i_len=rdflen(a_workdir)
              if (a_workdir(i_len:i_len) .ne. '/') a_workdir=a_workdir(1:i_len)//'/'
            else if (a_keyw .eq. 'colordir') then
              a_colordir=a_valu
              if (a_colordir .eq. ' ') a_colordir='./'
              i_len=rdflen(a_colordir)
              if (a_colordir(i_len:i_len) .ne. '/') a_colordir=a_colordir(1:i_len)//'/'
            end if
          end do
          call rdf_clear()
          return
        end

        subroutine encodeval(r_data,a_data)

          implicit none

          real*4 r_data
          character*(*) a_data

          character*20 a_fmt
          integer i
          integer i_err

            a_data='*'
            i=13
            do while (index(a_data,'*') .ne. 0 .and. i .gt. 1)
              i=i-1
              if (i .ge. 10) then
                write(a_fmt,fmt='(a,i2,a)',iostat=i_err) '(f15.',i,')'
              else
                write(a_fmt,fmt='(a,i1,a)',iostat=i_err) '(f15.',i,')'
              end if
              write(a_data,fmt=a_fmt,iostat=i_err) r_data
            end do
            if (index(a_data,'*') .ne. 0) then
              write(a_data,fmt='(e15.8)',iostat=i_err) r_data
            end if
          return
        end

        subroutine decodeval(a_data,r_data,i_err)

          implicit none

          real*4 r_data
          character*(*) a_data
          integer i_err

          integer i_loc

            i_loc=max(index(a_data,'e'),index(a_data,'E'))
            if (i_loc .gt. 1 .and. index(a_data,'.') .eq. 0) then
              a_data=a_data(1:i_loc-1)//'.'//a_data(i_loc:)
              write(6,*) 'inserting a decimal at ',i_loc,'   ',a_data
            end if
            read(a_data,*,iostat=i_err) r_data
          return
        end

        subroutine median(r_lvl,i_cnt,r_val,r_med)

          implicit none

          integer*4 i_cnt
          real*4 r_val(i_cnt)
          real*4 r_med
          real*4 r_lvl

          real*4 r_low
          real*4 r_hgh
          real*4 r_rng

          integer*4 i_idx
          integer*4 i_hist(0:11)

          integer*4 i
          integer*4 i_num
          integer*4 i_sum
          integer*4 i_low
          integer*4 i_hgh
          integer*4 i_itr


c           write(6,*) 'i_cnt=',i_cnt
            r_low=r_val(1)
            r_hgh=r_val(1)
            do i=2,i_cnt
               if (r_val(i) .lt. r_low) r_low=r_val(i)
               if (r_val(i) .gt. r_hgh) r_hgh=r_val(i)
            end do
c           write(6,*) 'looking for lvl: ',r_lvl
            if (r_lvl .le. 0) then
              r_med=r_low
            else if (r_lvl .ge. 1.) then
              r_med=r_hgh
            else
              i_idx=0
              i_hist(i_idx)=i_cnt
              i_itr=0
              do while(i_hist(i_idx) .gt. max(int(0.00001*i_cnt),1) .and. i_itr .lt. 10 .and.
     &             r_hgh-r_low .gt. 0)
                i_itr=i_itr+1
c               write(6,*) 'low,high = ',r_low,r_hgh
c               write(6,*) 'Loop',i_itr
                r_rng=(r_hgh-r_low)
c               write(6,*) 'rng = ',r_rng
                do i=0,11
                  i_hist(i)=0
                end do
                do i=1,i_cnt
c                  i_idx=min(max(int((10*(r_val(i)-r_low)/(r_rng))+1),0),11)
                  i_idx=int(min(max(((10*(r_val(i)-r_low)/r_rng)+1.0),0.0),11.0))
                  i_hist(i_idx)=i_hist(i_idx)+1
                end do
                i_sum=0
                i_idx=0
                do i=0,11
c                 write(6,*) 'Hist ',i,i_hist(i)
                  i_sum=i_sum+i_hist(i)
                  if (i_sum .le. i_cnt*r_lvl) i_idx=i+1
                end do
c               write(6,*) 'idx = ',i_idx
                r_low=(r_rng*(float(i_idx-1)/10))+r_low
                r_hgh=r_low+r_rng/10
              end do
              r_med = 0
              i_num = 0
              do i=1,i_cnt
                 if ((r_val(i) .ge. r_low) .and. (r_val(i) .le. r_hgh)) then
                   i_num=i_num+1
c                  write(6,*) 'idx,r_val=',i_num,r_val(i)
                   r_med = r_med+r_val(i)
                 end if
              end do
              if (i_num .gt. 0) then
                r_med=r_med/i_num
              else
                r_med=(r_low+r_hgh)/2
              end if
              i_low=0
              i_hgh=0
              do i=1,i_cnt
                 if (r_val(i) .lt. r_med) i_low=i_low+1
                 if (r_val(i) .gt. r_med) i_hgh=i_hgh+1
              end do
c             write(6,*) 'balance=',i_low,i_hgh,i_low/float(i_low+i_hgh)
            end if
          return
        end


#ifdef IO64
        integer*8 function i_getfsize(i_setunit)

        implicit none

        integer*4 i_setunit
        integer*8 i_mbytes,i_fbytes

        integer*8 ioseek64
        external ioseek64

          i_mbytes= 0 ! 1E11
          i_fbytes = ioseek64(i_setunit,i_mbytes,2)
          i_getfsize = i_fbytes+1

        end

#else
        integer*4 function i_getfsize(i_setunit)
        implicit none

        integer*4 i_setunit
        integer*4 i_mbytes,i_fbytes

        integer*4 ioseek
        external ioseek

          i_mbytes=0 ! 2147483647
          i_fbytes = ioseek(i_setunit,i_mbytes,2)
          i_getfsize = i_fbytes+1

        end
#endif

        integer function i_setvbyt(i_setvfmt)

        implicit none

        integer i_setvfmt
        integer i_bytes

          goto (10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150), abs(i_setvfmt)+1
c           write (6,*) 'i_setvbyt error = ',i_bytes
            i_bytes=4
            goto 200

10        continue        ! 0 - byte (unsigned integer*1)
             i_bytes=1
             goto 200
20        continue        ! 1 - integer*1
             i_bytes=1
             goto 200
30        continue        ! 2 - integer*2
             i_bytes=2
             goto 200
40        continue        ! 3 - integer*4
             i_bytes=4
             goto 200
50        continue        ! 4 - real*4
             i_bytes=4
             goto 200
60        continue        ! 5 - real*8
             i_bytes=8
             goto 200
70        continue        ! 6 - complex magnitude
             i_bytes=8
             goto 200
80        continue        ! 7 - complex phase
             i_bytes=8
             goto 200
90        continue        ! 8 - unsigned integer*2
             i_bytes=2
             goto 200
100       continue        ! 9 - stokes11
             i_bytes=10
             goto 200
110       continue        ! 10 - Complex 2 magnitude
             i_bytes=2
             goto 200
120       continue        ! 11 - complex 2 phase
             i_bytes=2
             goto 200
130       continue        ! 12 - complex 4 magnitude
             i_bytes=4
             goto 200
140       continue        ! 13 - complex 4 phase
             i_bytes=4
             goto 200
150       continue        ! 14 - Real*4_Magnitude
             i_bytes=4
             goto 200
200       continue
          i_setvbyt = i_bytes
          return
        end

        subroutine get_ecmd(i_wkspace,i_ecnt,i_edat,i_ecmd,i_debug)

          ! This subroutine retrieves expose events from the expose event buffer
          ! If an expose event will exceed the size of the wkspace buffer, the event
          ! is divided into multiple parts and output one at a time
          !
          implicit none

          integer*4 i
          integer*4 ie
          integer*4 i_ecnt
          integer*4 i_edat(0:10,200)
          integer*4 i_ecmd(0:10)

          integer*4 i_row
          integer*4 i_ncx
          integer*4 i_nrx
          integer*4 i_scl
          integer*4 i_brow
          integer*4 i_blks
          integer*4 i_wkspace

          integer*4 i_debug

            do i=0,10
              i_ecmd(i) = i_edat(i,1)
            end do

            i_row = i_edat(4,1)
            i_ncx = i_edat(5,1)
            i_nrx = i_edat(6,1) ! number of lines in expose event
            i_scl = i_edat(7,1)
            i_brow = i_wkspace/i_ncx
            i_blks = (i_nrx-1)/i_brow
            if ((i_blks .gt. 0 .or. i_edat(8,1) .ne. i_edat(4,1)) .and. i_debug .ge. 4)
     &                write(6,*) 'Splitting expose, block ',i_blks,i_row,i_nrx
            if (i_scl .ne. 1) then
              i_ecmd(4)   = i_edat(4,1)
              i_edat(4,1) = i_edat(4,1)+min(i_brow,i_nrx)
            else
              i_ecmd(4) = i_row+max(0,i_nrx-i_brow)
            end if
            i_ecmd(6) = min(i_brow,i_nrx)
            i_ecmd(7) = i_blks

c            if (i_blks .eq. 1 .and. i_nrx .eq. i_brow) i_ecmd(7)= 0        ! From Ron M.  ! should be unnecessary with the change to the addition of a -1 in the blks calculation

            i_edat(6,1) = max(0,i_edat(6,1)-i_ecmd(6))
            if (i_edat(6,1) .le. 0) then
              i_ecnt = max(i_ecnt-1,0)
              do ie=1,i_ecnt    ! Move Items up in buffer
                do i=0,10
                  i_edat(i,ie) = i_edat(i,ie+1)
                end do
              end do
            end if

          return
        end

        real function wrap(r_value,r_wrap)

          implicit none

          real*4 r_value
          real*4 r_wrap
          real*4 r_outp

c            r_outp=r_value-r_wrap*nint((r_value/r_wrap)-0.5)
c           if (r_outp .eq. r_wrap) r_outp=0.
            r_outp = mod(r_value,r_wrap)
            if (r_value .lt. 0) r_outp=r_wrap-abs(r_outp)
c           if (r_wrap .eq. 100) write(6,*) '*** value,wrap,mod,outp: ',r_value,r_wrap,mod(r_value,r_wrap),r_outp
          wrap=r_outp
          return

        end

        subroutine vecmulti(r_a,r_b,r_c)

          implicit none

          real*8 r_a(3,3)
          real*8 r_b(3)
          real*8 r_c(3)

          r_c(1)=r_a(1,1)*r_b(1)+r_a(1,2)*r_b(2)+r_a(1,3)*r_b(3)
          r_c(2)=r_a(2,1)*r_b(1)+r_a(2,2)*r_b(2)+r_a(2,3)*r_b(3)
          r_c(3)=r_a(3,1)*r_b(1)+r_a(3,2)*r_b(2)+r_a(3,3)*r_b(3)

          return

        end


        subroutine vecscale(r_scale,r_a,r_b)

          implicit none

          real*8 r_scale
          real*8 r_a(3)
          real*8 r_b(3)

            r_b(1)=r_scale*r_a(1)
            r_b(2)=r_scale*r_a(2)
            r_b(3)=r_scale*r_a(3)

            return

        end

        subroutine vecaddit(r_a,r_b,r_c)

          implicit none

          real*8 r_a(3)
          real*8 r_b(3)
          real*8 r_c(3)

            r_c(1)=r_a(1)+r_b(1)
            r_c(2)=r_a(2)+r_b(2)
            r_c(3)=r_a(3)+r_b(3)

            return

        end


c****************************************************************

        subroutine tcnatm(r_a,r_e2,r_peg,r_atm)

c****************************************************************
c**
c**     FILE NAME: tcnatm.for
c**
c**     DATE WRITTEN:10/25/95
c**
c**     PROGRAMMER:Scott Shaffer
c**
c**     FUNCTIONAL DESCRIPTION:This routine computes the transformation
c**     matris and translation vector needed to get between radar (t,c,n)
c**     coordinates and (x,y,z) WGS-84 coordinates.
c**
c**     ROUTINES CALLED:
c**
c**     NOTES: none
c**
c**     UPDATE LOG:
c**
c*****************************************************************

        implicit none

c       INPUT VARIABLES:
        real*8 r_a                    !semimajor axis
        real*8 r_e2                   !eccentricity squared
        real*8 r_peg(3)               !peg latitude,longitude,heading

c       OUTPUT VARIABLES:
        real*8 r_atm(3,4)             !rotation matris

c       LOCAL VARIABLES:
        integer i_type
        real*8 r_hgt
        real*8 r_slt,r_clt,r_clo,r_slo,r_chg,r_shg

        real*8 rdir
        external rdir

c       DATA STATEMENTS:none

c       PROCESSING STEPS:

c       first determine the rotation matris

        r_clt = cos(r_peg(1))
        r_slt = sin(r_peg(1))
        r_clo = cos(r_peg(2))
        r_slo = sin(r_peg(2))
        r_chg = cos(r_peg(3))
        r_shg = sin(r_peg(3))

        r_atm(1,1) = - r_slo*r_shg - r_slt*r_clo*r_chg
        r_atm(1,2) =   r_slo*r_chg - r_slt*r_clo*r_shg
        r_atm(1,3) =   r_clt*r_clo
        r_atm(2,1) =   r_clo*r_shg - r_slt*r_slo*r_chg
        r_atm(2,2) = - r_clo*r_chg - r_slt*r_slo*r_shg
        r_atm(2,3) =   r_clt*r_slo
        r_atm(3,1) =   r_clt*r_chg
        r_atm(3,2) =   r_clt*r_shg
        r_atm(3,3) =   r_slt

c       find the translation vector

        i_type = 1
        r_hgt = 0.
        call latlon(r_a,r_e2,r_atm(1,4),r_peg(1),r_peg(2),r_hgt,i_type)

        return
        end

c****************************************************************
        subroutine latlon(r_a,r_e2,r_v,r_lat,r_lon,r_hgt,i_type)

c****************************************************************
c**
c**   FILE NAME: latlon.f
c**
c**   DATE WRITTEN:7/22/93
c**
c**   PROGRAMMER:Scott Hensley
c**
c**   FUNCTIONAL DESCRIPTION:This program converts a vector to
c**   lat,lon and height above the reference ellipsoid or given a
c**   lat,lon and height produces a geocentric vector.
c**
c**   ROUTINES CALLED:none
c**
c**   NOTES: none
c**
c**   UPDATE LOG:
c**
c****************************************************************

        implicit none

c     INPUT VARIABLES:
        integer i_type                   !1=lat,lon to vector,2= vector to lat,lon
        real*8 r_a                       !ellispoid semi-major axis
        real*8 r_e2                      !ellipsoid eccentricity squared
        real*8 r_v(3)                    !geocentric vector (meters)
        real*8 r_lat                     !latitude (deg -90 to 90)
        real*8 r_lon                     !longitude (deg -180 to 180)
        real*8 r_hgt                     !height above ellipsoid (meters)

c       OUTPUT VARIABLES:see input

c       LOCAL VARIABLES:
        integer i_ft
        real*8 pi,r_dtor,r_re,r_q2,r_q3,r_b,r_q
        real*8 r_p,r_tant,r_theta

c       DATA STATEMENTS:
        data pi /3.141592653589793238d0/
        data r_dtor /1.74532925199d-2/
        data i_ft /0/

C       FUNCTION STATEMENTS:

c       PROCESSING STEPS:

        if(i_type .eq. 1)then  !convert lat,lon to vector

           r_re = r_a/sqrt(1.d0 - r_e2*sin(r_lat)**2)

           r_v(1) = (r_re + r_hgt)*cos(r_lat)*cos(r_lon)
           r_v(2) = (r_re + r_hgt)*cos(r_lat)*sin(r_lon)
           r_v(3) = (r_re*(1.d0-r_e2) + r_hgt)*sin(r_lat)

        elseif(i_type .eq. 2)then  !convert vector to lat,lon

           if(i_ft .eq. 0)then
              r_q2 = 1.d0/(1.d0 - r_e2)
              r_q = sqrt(r_q2)
              r_q3 = r_q2 - 1.d0
              r_b = r_a*sqrt(1.d0 - r_e2)
           end if

           r_lon = atan2(r_v(2),r_v(1))

           r_p = sqrt(r_v(1)**2 + r_v(2)**2)
           r_tant = (r_v(3)/r_p)*r_q
           r_theta = atan(r_tant)
           r_tant = (r_v(3) + r_q3*r_b*sin(r_theta)**3)/
     +          (r_p - r_e2*r_a*cos(r_theta)**3)
           r_lat =  atan(r_tant)
           r_re = r_a/sqrt(1.d0 - r_e2*sin(r_lat)**2)
           r_hgt = r_p/cos(r_lat) - r_re

        end if

        return
        end

c****************************************************************
        subroutine sch_to_tcn(r_a,r_v,r_lat,r_lon,r_hgt,i_type)

c****************************************************************
c**
c**   FILE NAME: sch_to_tcn.f
c**
c**   DATE WRITTEN:7/22/93
c**
c**   PROGRAMMER:Scott Hensley
c**
c**   FUNCTIONAL DESCRIPTION:This program converts a vector to
c**   lat,lon and height above the reference ellipsoid or given a
c**   lat,lon and height produces a geocentric vector.
c**
c**   ROUTINES CALLED:none
c**
c**   NOTES: none
c**
c**   UPDATE LOG:
c**
c****************************************************************

        implicit none

c     INPUT VARIABLES:
        integer i_type                   !1=lat,lon to vector,2= vector to lat,lon
        real*8 r_a                       !ellispoid semi-major axis
        real*8 r_v(3)                    !geocentric vector (meters)
        real*8 r_lat                     !latitude (deg -90 to 90)
        real*8 r_lon                     !longitude (deg -180 to 180)
        real*8 r_hgt                     !height above ellipsoid (meters)

c       OUTPUT VARIABLES:see input

c       LOCAL VARIABLES:
        real*8 r_p

C       FUNCTION STATEMENTS:

c       PROCESSING STEPS:

        if(i_type .eq. 1)then  !convert lat,lon to vector

           r_v(3) = (r_a + r_hgt)*cos(r_lat)*cos(r_lon) - r_a
           r_v(1) = (r_a + r_hgt)*cos(r_lat)*sin(r_lon)
           r_v(2) = (r_a + r_hgt)*sin(r_lat)

        elseif(i_type .eq. 2)then  !convert vector to lat,lon, hgt

           r_p = sqrt(r_v(1)**2 + r_v(2)**2 + (r_v(3)+r_a)**2)
           r_lat = asin(r_v(2)/r_p)
           r_lon = atan2(r_v(1),(r_v(3)+r_a))
           r_hgt = r_p - r_a

        end if

        return
        end

c****************************************************************
c
c       Various curvature functions
c
c
c****************************************************************
c**
c**     FILE NAME: curvature.f
c**
c**     DATE WRITTEN: 12/02/93
c**
c**     PROGRAMMER:Scott Hensley
c**
c**     FUNCTIONAL DESCRIPTION: This routine computes the curvature for
c**     of various types required for ellipsoidal or spherical earth
c**     calculations.
c**
c**     ROUTINES CALLED:none
c**
c**     NOTES: none
c**
c**     UPDATE LOG:
c**
c*****************************************************************

        real*8 function  reast(r_a,r_e2,r_lat)

        implicit none
        real*8 r_a,r_e2,r_lat

        reast = r_a/sqrt(1.d0 - r_e2*sin(r_lat)**2)

        end

        real*8 function  rnorth(r_a,r_e2,r_lat)

        implicit none
        real*8 r_a,r_e2,r_lat

        rnorth = (r_a*(1.d0 - r_e2))/
     1                  (1.d0 - r_e2*sin(r_lat)**2)**(1.5d0)

        end


        real*8 function  rdir(r_a,r_e2,r_hdg,r_lat)

        implicit none
        real*8 r_a,r_e2,r_lat,r_hdg,r_re,r_rn,reast,rnorth

        r_re = reast(r_a,r_e2,r_lat)
        r_rn = rnorth(r_a,r_e2,r_lat)

        rdir = (r_re*r_rn)/(r_re*cos(r_hdg)**2 + r_rn*sin(r_hdg)**2)

        end

c****************************************************************

        subroutine utmtoll(r_a,r_e2,i_zone,a_grid,r_vec,r_lat,
     +     r_lon,i_type)

c****************************************************************
c**
c**   FILE NAME: utmtoll.f
c**
c**   DATE WRITTEN:7/22/93
c**
c**   PROGRAMMER:Scott Hensley
c**
c**   FUNCTIONAL DESCRIPTION: This routine converts between lat
c**   lon and utm coordinates for a datum determined from the input
c**   a and e2.
c**
c**   ROUTINES CALLED:none
c**
c**   NOTES: none
c**
c**   UPDATE LOG:
c**
c****************************************************************

        implicit none

c     INPUT VARIABLES:
        integer i_type                   !1=lat,lon to utm,2= utm to lat,lon
        real*8 r_a                       !ellispoid semi-major axis
        real*8 r_e2                      !ellipsoid eccentricity squared
        real*8 r_vec(2)                    !Northing,Easting(m)
        real*8 r_lat                     !latitude (deg -90 to 90)
        real*8 r_lon                     !longitude (deg -180 to 180)
        integer i_zone                   !UTM zone
        character*1 a_grid               !UTM North-South grid

c       OUTPUT VARIABLES:see input

c       LOCAL VARIABLES:
        integer i_ft,i_gi
        real*8 r_v(2)                    !Northing,Easting(m)
        real*8 pi,r_dtor
        real*8 r_ep2,r_k0,r_k
        real*8 r_fe,r_fn(2)
        real*8 r_e4,r_e6,r_n,r_t,r_t2,r_c,r_c2,r_ba
        real*8 r_a2,r_a3,r_a4,r_a5,r_a6
        real*8 r_d,r_d2,r_d3,r_d4,r_d5,r_d6
        real*8 r_lon0,r_lat1,r_m,r_m0,r_mu,r_lat0
        real*8 r_et,r_e1,r_e12,r_e13,r_e14,r_r
        character*1 a_griddes(20)

c       DATA STATEMENTS:
        data pi /3.141592653589793238d0/
        data r_dtor /1.74532925199d-2/
        data i_ft /0/
        data a_griddes /'C','D','E','F','G','H','J',
     +       'K','L','M','N','P','Q','R','S','T','U',
     +       'V','W','X'/
        data r_k0 /.9996d0/    !scale at center
        data r_lat0 /0.d0/
        data r_fe,r_fn /500000.d0,0.d0,10000000.d0/

C       FUNCTION STATEMENTS:none

c       PROCESSING STEPS:

        r_ep2 = r_e2/(1.d0 - r_e2)
        r_e4 = r_e2**2
        r_e6 = r_e2**3
        pi =  4.d0*atan(1.d0)
        r_dtor = pi/180.d0

        if (i_zone .le. 0) i_zone = int(mod(r_lon+3.d0*pi,2.d0*pi)/(r_dtor*6.d0))
     +          + 1

        if(i_type .eq. 2)then  !convert lat,lon to UTM

           i_zone = max(min(i_zone,60),1)
           r_lon0 = -pi + 6.d0*r_dtor*(i_zone-1) + 3.d0*r_dtor

           r_n = r_a/sqrt(1.d0 - r_e2*sin(r_lat)**2)
           r_t = tan(r_lat)**2
           r_t2 = r_t**2
           r_c = r_ep2*cos(r_lat)**2
           r_ba = (r_lon - r_lon0)*cos(r_lat)
           r_a2 = r_ba**2
           r_a3 = r_ba*r_a2
           r_a4 = r_ba*r_a3
           r_a5 = r_ba*r_a4
           r_a6 = r_ba*r_a5
           r_m = r_a*((1.d0-r_e2/4 - 3.d0*r_e4/64.d0 -
     +      5.d0*r_e6/256.d0)*r_lat - (3.d0*r_e2/8.d0 +
     +          3.d0*r_e4/32.d0 +
     +      45.d0*r_e6/1024.d0)*sin(2.d0*r_lat) +
     +          (15.d0*r_e4/256.d0 +
     +      45.d0*r_e6/1024.d0)*sin(4.d0*r_lat) -
     +          (35.d0*r_e6/3072.d0)*
     +      sin(6.d0*r_lat))
           r_m0 = r_a*((1.d0-r_e2/4 - 3.d0*r_e4/64.d0 -
     +      5.d0*r_e6/256.d0)*r_lat0 - (3.d0*r_e2/8.d0 +
     +          3.d0*r_e4/32.d0 +
     +      45.d0*r_e6/1024.d0)*sin(2.d0*r_lat0) +
     +          (15.d0*r_e4/256.d0 +
     +      45.d0*r_e6/1024.d0)*sin(4.d0*r_lat0) -
     +          (35.d0*r_e6/3072.d0)*
     +      sin(6.d0*r_lat0))

           r_vec(2) = r_k0*r_n*(r_ba+(1.d0-r_t+r_c)*r_a3/6.d0 +
     +       (5.d0-18.d0*r_t+r_t2+72.d0*r_c-58.d0*r_ep2)*r_a5/120.d0)
           r_vec(2) = r_vec(2) + r_fe

           r_vec(1) = r_k0*(r_m - r_m0 + r_n*tan(r_lat)*
     +       ( r_a2/2.d0 + (5.d0-r_t+9.d0*r_c+4.d0*r_c**2)*
     +        (r_a4/24.d0) + (61.d0-58.d0*r_t+r_t2+600.d0*r_c-
     +        330.d0*r_ep2)*(r_a6/720.d0) ))
           if(r_lat .ge. 0)then
              r_vec(1) = r_vec(1) + r_fn(1)
           else
              r_vec(1) = r_vec(1) + r_fn(2)
           end if

           r_k = r_k0*(1.d0+(1.d0+r_ep2*cos(r_lat)**2)*
     +          (r_vec(2)-r_fe)**2/
     +          (2.d0*(r_k0**2)*r_n**2))

           i_gi = int((r_lat/r_dtor+80.d0)/8.d0) + 1
           i_gi = max(min(i_gi,20),1)
           a_grid = a_griddes(i_gi)

        elseif(i_type .eq. 1)then  !convert UTM to lat,lon

           r_v(1) = r_vec(1)
           r_v(2) = r_vec(2)
           r_v(2) = r_v(2) - r_fe
           if(r_v(1) .ge. r_fn(2))then
              r_v(1) = r_v(1) - r_fn(2)
           end if
           r_lon0 = -pi + 6.d0*r_dtor*(i_zone-1) + 3.d0*r_dtor

           r_et = sqrt(1.d0-r_e2)
           r_e1 = (1.d0-r_et)/(1.d0+r_et)
           r_e12 = r_e1**2
           r_e13 = r_e1*r_e12
           r_e14 = r_e1*r_e13
           r_m = r_v(1)/r_k0
           r_mu = r_m/(r_a*(1.d0-r_e2/4.d0-3.d0*r_e4/64.d0-
     +          5.d0*r_e6/256.d0))
           r_lat1 = r_mu + (3.d0*r_e1/2.d0-27.d0*r_e13/32.d0)*
     +          sin(2.d0*r_mu)+
     +          (21.d0*r_e12/16.d0-55.d0*r_e14/32.d0)*sin(4.d0*r_mu)+
     +          (51.d0*r_e13/96.d0)*sin(6.d0*r_mu) +
     +          (1097.d0*r_e14/512.d0)*sin(8.d0*r_mu)

           r_n = r_a/sqrt(1.d0 - r_e2*sin(r_lat1)**2)
           r_r = (r_a*(1.d0-r_e2))/sqrt(1.d0 - r_e2*sin(r_lat1)**2)**3
           r_t = tan(r_lat1)**2
           r_t2 = r_t**2
           r_c = r_ep2*cos(r_lat1)**2
           r_c2 = r_c**2
           r_d = r_v(2)/(r_n*r_k0)
           r_d2 = r_d**2
           r_d3 = r_d2*r_d
           r_d4 = r_d3*r_d
           r_d5 = r_d4*r_d
           r_d6 = r_d5*r_d

           r_lat = r_lat1 - (r_n*tan(r_lat1)/r_r)*(r_d2/2.d0+
     +       (5.d0+3.d0*r_t+10.d0*r_c-4.d0*r_c2-9.d0*r_ep2)*
     +          r_d4/24.d0 +
     +       (61.d0+90*r_t+298.d0*r_c+45.d0*r_t2-252.d0*r_ep2-3.d0*
     +          r_c2)*
     +       (r_d6/720.d0))
           r_lon = r_lon0 + (r_d - (1.d0+2.d0*r_t+r_c)*r_d3/6.d0 +
     +       (5.d0-2.d0*r_c+28.d0*r_t-3.d0*r_c2+8.d0*r_ep2+
     +          24.d0*r_t2)*
     +       (r_d5/120.d0))/cos(r_lat1)

        end if

        end

c****************************************************************

        subroutine enutoll(r_a,r_e2,i_zone,a_grid,r_vec,r_lat,
     +     r_lon,i_type)

c****************************************************************
c**
c**   FILE NAME: enutoll.f
c**
c**   DATE WRITTEN:7/22/93
c**
c**   PROGRAMMER:Scott Hensley
c**
c**   FUNCTIONAL DESCRIPTION: This routine converts between lat
c**   lon and enu coordinates for a datum determined from the input
c**   a and e2.
c**
c**   ROUTINES CALLED:none
c**
c**   NOTES: none
c**
c**   UPDATE LOG:  added zone selection logic SJS 3/28/96
c**
c****************************************************************

        implicit none

c     INPUT VARIABLES:
        integer i_type                   !2=lat,lon to utm,1= utm to lat,lon
        real*8 r_a                       !ellispoid semi-major axis
        real*8 r_e2                      !ellipsoid eccentricity squared
        real*8 r_vec(2)                  !Northing,Easting(m)
        real*8 r_lat                     !latitude (deg -90 to 90)
        real*8 r_lon                     !longitude (deg -180 to 180)
        integer i_zone                   !UTM zone
        character*1 a_grid               !UTM North-South grid

c       OUTPUT VARIABLES:see input

c       LOCAL VARIABLES:
        integer i_ft,i_gi
        real*8 pi,r_dtor
        real*8 r_v(2)                    !Northing,Easting(m)
        real*8 r_ep2,r_k0,r_k
        real*8 r_fe,r_fn(2)
        real*8 r_e4,r_e6,r_n,r_t,r_t2,r_c,r_c2,r_ba
        real*8 r_a2,r_a3,r_a4,r_a5,r_a6
        real*8 r_d,r_d2,r_d3,r_d4,r_d5,r_d6
        real*8 r_lon0,r_lat1,r_m,r_m0,r_mu,r_lat0
        real*8 r_et,r_e1,r_e12,r_e13,r_e14,r_r
        character*1 a_griddes(20)

c       DATA STATEMENTS:
        data pi /3.141592653589793238d0/
        data r_dtor /1.74532925199d-2/
        data i_ft /0/
        data a_griddes /'C','D','E','F','G','H','J',
     +       'K','L','M','N','P','Q','R','S','T','U',
     +       'V','W','X'/
        data r_k0 /.9996d0/    !scale at center
        data r_lat0 /0.d0/
        data r_fe,r_fn /500000.d0,0.d0,10000000.d0/

C       FUNCTION STATEMENTS:none

c       PROCESSING STEPS:

        r_ep2 = r_e2/(1.d0 - r_e2)
        r_e4 = r_e2**2
        r_e6 = r_e2**3
        pi =  4.d0*atan(1.d0)
        r_dtor = pi/180.d0

        if(i_type .eq. 2)then  !convert lat,lon to UTM

           if (i_zone .le. 0) i_zone = int(mod(r_lon+3.d0*pi,2.d0*pi)/(r_dtor*6.d0))
     +          + 1

           i_zone = max(min(i_zone,60),1)
           r_lon0 = -pi + 6.d0*r_dtor*(i_zone-1) + 3.d0*r_dtor

           r_n = r_a/sqrt(1.d0 - r_e2*sin(r_lat)**2)
           r_t = tan(r_lat)**2
           r_t2 = r_t**2
           r_c = r_ep2*cos(r_lat)**2
           r_ba = (r_lon - r_lon0)*cos(r_lat)
           r_a2 = r_ba**2
           r_a3 = r_ba*r_a2
           r_a4 = r_ba*r_a3
           r_a5 = r_ba*r_a4
           r_a6 = r_ba*r_a5
           r_m = r_a*((1.d0-r_e2/4 - 3.d0*r_e4/64.d0 -
     +      5.d0*r_e6/256.d0)*r_lat - (3.d0*r_e2/8.d0 +
     +          3.d0*r_e4/32.d0 +
     +      45.d0*r_e6/1024.d0)*sin(2.d0*r_lat) +
     +          (15.d0*r_e4/256.d0 +
     +      45.d0*r_e6/1024.d0)*sin(4.d0*r_lat) -
     +          (35.d0*r_e6/3072.d0)*
     +      sin(6.d0*r_lat))
           r_m0 = r_a*((1.d0-r_e2/4 - 3.d0*r_e4/64.d0 -
     +      5.d0*r_e6/256.d0)*r_lat0 - (3.d0*r_e2/8.d0 +
     +          3.d0*r_e4/32.d0 +
     +      45.d0*r_e6/1024.d0)*sin(2.d0*r_lat0) +
     +          (15.d0*r_e4/256.d0 +
     +      45.d0*r_e6/1024.d0)*sin(4.d0*r_lat0) -
     +          (35.d0*r_e6/3072.d0)*
     +      sin(6.d0*r_lat0))

           r_vec(1) = r_k0*r_n*(r_ba+(1.d0-r_t+r_c)*r_a3/6.d0 +
     +       (5.d0-18.d0*r_t+r_t2+72.d0*r_c-58.d0*r_ep2)*r_a5/120.d0)
           r_vec(1) = r_vec(1) + r_fe

           r_vec(2) = r_k0*(r_m - r_m0 + r_n*tan(r_lat)*
     +       ( r_a2/2.d0 + (5.d0-r_t+9.d0*r_c+4.d0*r_c**2)*
     +        (r_a4/24.d0) + (61.d0-58.d0*r_t+r_t2+600.d0*r_c-
     +        330.d0*r_ep2)*(r_a6/720.d0) ))
           if(r_lat .ge. 0)then
              r_vec(2) = r_vec(2) + r_fn(1)
           else
              r_vec(2) = r_vec(2) + r_fn(2)
           end if

           r_k = r_k0*(1.d0+(1.d0+r_ep2*cos(r_lat)**2)*
     +          (r_vec(1)-r_fe)**2/
     +          (2.d0*(r_k0**2)*r_n**2))

           i_gi = int((r_lat/r_dtor+80.d0)/8.d0) + 1
           i_gi = max(min(i_gi,20),1)
           a_grid = a_griddes(i_gi)

        else if(i_type .eq. 1)then  !convert UTM to lat,lon

           r_v(1) = r_vec(1)
           r_v(2) = r_vec(2)
           r_v(1) = r_v(1) - r_fe
           if(r_v(2) .ge. r_fn(2))then
              r_v(2) = r_v(2) - r_fn(2)
           end if
           r_lon0 = -pi + 6.d0*r_dtor*(i_zone-1) + 3.d0*r_dtor

           r_et = sqrt(1.d0-r_e2)
           r_e1 = (1.d0-r_et)/(1.d0+r_et)
           r_e12 = r_e1**2
           r_e13 = r_e1*r_e12
           r_e14 = r_e1*r_e13
           r_m = r_v(2)/r_k0
           r_mu = r_m/(r_a*(1.d0-r_e2/4.d0-3.d0*r_e4/64.d0-
     +          5.d0*r_e6/256.d0))
           r_lat1 = r_mu + (3.d0*r_e1/2.d0-27.d0*r_e13/32.d0)*
     +          sin(2.d0*r_mu)+
     +          (21.d0*r_e12/16.d0-55.d0*r_e14/32.d0)*sin(4.d0*r_mu)+
     +          (51.d0*r_e13/96.d0)*sin(6.d0*r_mu) +
     +          (1097.d0*r_e14/512.d0)*sin(8.d0*r_mu)

           r_n = r_a/sqrt(1.d0 - r_e2*sin(r_lat1)**2)
           r_r = (r_a*(1.d0-r_e2))/sqrt(1.d0 - r_e2*sin(r_lat1)**2)**3
           r_t = tan(r_lat1)**2
           r_t2 = r_t**2
           r_c = r_ep2*cos(r_lat1)**2
           r_c2 = r_c**2
           r_d = r_v(1)/(r_n*r_k0)
           r_d2 = r_d**2
           r_d3 = r_d2*r_d
           r_d4 = r_d3*r_d
           r_d5 = r_d4*r_d
           r_d6 = r_d5*r_d

           r_lat = r_lat1 - (r_n*tan(r_lat1)/r_r)*(r_d2/2.d0+
     +       (5.d0+3.d0*r_t+10.d0*r_c-4.d0*r_c2-9.d0*r_ep2)*
     +          r_d4/24.d0 +
     +       (61.d0+90*r_t+298.d0*r_c+45.d0*r_t2-252.d0*r_ep2-3.d0*
     +          r_c2)*
     +       (r_d6/720.d0))
           r_lon = r_lon0 + (r_d - (1.d0+2.d0*r_t+r_c)*r_d3/6.d0 +
     +       (5.d0-2.d0*r_c+28.d0*r_t-3.d0*r_c2+8.d0*r_ep2+
     +          24.d0*r_t2)*
     +       (r_d5/120.d0))/cos(r_lat1)

        end if

        end

        subroutine invrstrn(r_atm,r_mta)
c
c  This subroutine finds the inverse of an affine transformation
c                  including the translation vector
c
          implicit none

          real*8 r_atm(3,4)
          real*8 r_mta(3,4)
          real*8 r_tmp(3)
          real*8 r_one

            r_one = -1.0

            call matinvrt(r_atm,r_mta)
            call vecmulti(r_mta,r_atm(1,4),r_tmp)
            call vecscale(r_one,r_tmp,r_mta(1,4))

            return
        end

        subroutine matinvrt(r_a,r_b)

          implicit none

          real*8 a11
          real*8 a12
          real*8 a13
          real*8 a21
          real*8 a22
          real*8 a23
          real*8 a31
          real*8 a32
          real*8 a33

          real*8 r_a(3,3)
          real*8 r_b(3,3)

          real*8 r_dd

          a11=r_a(1,1)
          a12=r_a(1,2)
          a13=r_a(1,3)
          a21=r_a(2,1)
          a22=r_a(2,2)
          a23=r_a(2,3)
          a31=r_a(3,1)
          a32=r_a(3,2)
          a33=r_a(3,3)

          r_dd=a11*(a22*a33-a23*a32)-a12*(a21*a33-a23*a31)+
     &         a13*(a21*a32-a22*a31)

          if (r_dd .ne. 0.) then
            r_b(1,1)=(a22*a33-a23*a32)/r_dd
            r_b(1,2)=(a13*a32-a12*a33)/r_dd
            r_b(1,3)=(a12*a23-a13*a22)/r_dd
            r_b(2,1)=(a23*a31-a21*a33)/r_dd
            r_b(2,2)=(a11*a33-a13*a31)/r_dd
            r_b(2,3)=(a13*a21-a11*a23)/r_dd
            r_b(3,1)=(a21*a32-a22*a31)/r_dd
            r_b(3,2)=(a12*a31-a11*a32)/r_dd
            r_b(3,3)=(a11*a22-a12*a21)/r_dd
          else
            write(6,*) 'Determinant =  0 in Subroutine matinvrt'
            r_b(1,1)=1.
            r_b(1,2)=0.
            r_b(1,3)=0.
            r_b(2,1)=0.
            r_b(2,2)=1.
            r_b(2,3)=0.
            r_b(3,1)=0.
            r_b(3,2)=0.
            r_b(3,3)=1.
          endif

          return

        end


      subroutine get_coordinates(a_setproj,r_setpegv,r_loc11,r_loc22,i_flag,i_debug,i_err)

        implicit none

        character*200 a_setproj      ! Projection name

        integer*4     i_flag
        integer*4     i_debug
        integer*4     i_err
        real*4        r_setpegv(3)   ! Peg Point
        real*4        r_row
        real*4        r_col
        real*4        r_val

        real*4        r_loc11(3)
        real*4        r_loc22(3)

        real*8        r_setpegvdble(3)   ! Peg Point
        real*8        r_loc1(3)
        real*8        r_loc2(3)
        real*8        r_loc3(3)
        real*8        r_loc4(3)
        real*8        r_rtod
        real*8        r_rad
        real*8        r_hhh
        real*8        r_lat
        real*8        r_lon

        real*8 r_pi
        real*8 r_e2
        real*8 r_a

        real*8 r_atm(3,4)
        real*8 r_mta(3,4)
        integer*4     i_zone

        character*1 a_grid               !UTM North-South grid

        integer rdflen
        external rdflen

        real*8 rdir
        external rdir

c
c     Initialize pi and conversions
c
            r_pi = 4.d0*atan(1.0d0)
            r_rtod = 180.0d0/r_pi
            r_a =  6378137.0
            r_e2 = 0.00669438
            r_setpegvdble(1) = r_setpegv(1)
            r_setpegvdble(2) = r_setpegv(2)
            r_setpegvdble(3) = r_setpegv(3)
            i_zone = 0
            r_lon=r_setpegv(2)

            r_rad = rdir(r_a,r_e2,r_setpegvdble(3),r_setpegvdble(1))

            i_err=0

            if (i_flag .eq. 1) then  ! convert row/column to lat/lon

              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_peglat=',r_setpegv(1)
              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_peglon=',r_setpegv(2)
              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_peghdg=',r_setpegv(3)

              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_rad=',r_rad

              r_loc1(1) = r_loc11(1)
              r_loc1(2) = r_loc11(2)
              r_loc1(3) = r_loc11(3)
              if (i_debug .ge. 6) write(6,*) 'r_loc1=',r_loc1

              if (a_setproj .eq. 'sch' .or. a_setproj .eq. 'SCH') then
                 r_lon=r_loc1(1)/r_rad
                 r_lat=r_loc1(2)/r_rad
                 r_hhh=r_loc1(3)
                 call tcnatm(r_a,r_e2,r_setpegvdble,r_atm)
                 call sch_to_tcn(r_rad,r_loc3,r_lat,r_lon,r_hhh,1)
                 call vecmulti(r_atm,r_loc3,r_loc4) ! convert from input xyz to output xyz
                 call vecaddit(r_atm(1,4),r_loc4,r_loc4)
                 call latlon(r_a,r_e2,r_loc4,r_lat,r_lon,r_hhh,2)
              else if (a_setproj .eq. 'scx' .or. a_setproj .eq. 'SCX') then
                 r_lon=r_loc1(1)/r_rad
                 r_lat=r_loc1(2)/r_rad
                 r_hhh=0
                 call tcnatm(r_a,r_e2,r_setpegvdble,r_atm)
                 call sch_to_tcn(r_rad,r_loc3,r_lat,r_lon,r_hhh,1)
                 call vecmulti(r_atm,r_loc3,r_loc4) ! convert from input xyz to output xyz
                 call vecaddit(r_atm(1,4),r_loc4,r_loc4)
                 call latlon(r_a,r_e2,r_loc4,r_lat,r_lon,r_hhh,2)
                 r_hhh=r_loc1(3)
              else if (a_setproj .eq. 'eqa' .or. a_setproj .eq. 'EQA') then
                 r_lat=r_loc1(1)/r_rtod
                 r_lon=r_loc1(2)/r_rtod
                 r_hhh=r_loc1(3)
              else if (a_setproj .eq. 'utm' .or. a_setproj .eq. 'UTM') then
                 call utmtoll(r_a,r_e2,i_zone,a_grid,r_loc1,r_lat,r_lon,1)
                 if (i_debug .ge. 6) write(6,*) 'i_zone=',i_zone
                 r_hhh=r_loc1(3)
              else if (a_setproj .eq. 'neu' .or. a_setproj .eq. 'NEU') then
                 call utmtoll(r_a,r_e2,i_zone,a_grid,r_loc1,r_lat,r_lon,1)
                 r_hhh=r_loc1(3)
              else if (a_setproj .eq. 'enu' .or. a_setproj .eq. 'ENU') then
                 call enutoll(r_a,r_e2,i_zone,a_grid,r_loc1,r_lat,r_lon,1)
                 r_hhh=r_loc1(3)
              else
                 i_err=1
                 if (i_debug .ge. 1) write(6,*) 'Lat/Long conversion not supported for ',a_setproj(1:max(1,rdflen(a_setproj)))
              end if
              r_loc22(1)=r_lat
              r_loc22(2)=r_lon
              r_loc22(3)=r_hhh

           else  ! convert lat/lon to row/column

              r_lat = r_loc22(1)
              r_lon = r_loc22(2)
              r_hhh = r_loc22(3)

              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_lat=',r_lat
              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_lon=',r_lon
              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_hdg=',r_hhh

              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'r_rad=',r_rad
              if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'Converting from lat/lon to row/column(almost) '//a_setproj

              if (a_setproj .eq. 'sch' .or. a_setproj .eq. 'SCH') then
                 call latlon(r_a,r_e2,r_loc1,r_lat,r_lon,r_hhh,1) ! convert lat/lon to wgs84 xyz
                 if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) 'wgs84xyz=',r_loc1
                 call tcnatm(r_a,r_e2,r_setpegvdble,r_atm)  ! compute tcn to xyz transform
                 call invrstrn(r_atm,r_mta)
                 call vecmulti(r_mta,r_loc1,r_loc2) ! convert from wgs84 xyz to tcn
                 call vecaddit(r_mta(1,4),r_loc2,r_loc2)
                 if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'tcnxyz=',r_loc2
                 call sch_to_tcn(r_rad,r_loc2,r_lat,r_lon,r_hhh,2) ! convert tcn to sch
                 r_loc11(1)=r_lon*r_rad ! Convert sch
                 r_loc11(2)=r_lat*r_rad
                 r_loc11(3)=r_hhh
              else if (a_setproj .eq. 'scx' .or. a_setproj .eq. 'SCX') then
                 r_hhh=0.0
                 call latlon(r_a,r_e2,r_loc1,r_lat,r_lon,r_hhh,1) ! convert lat/lon to wgs84 xyz
                 if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) 'wgs84xyz=',r_loc1
                 call tcnatm(r_a,r_e2,r_setpegvdble,r_atm)  ! compute tcn to xyz transform
c                 write(6,*) 'peg=',r_setpegv
                 call invrstrn(r_atm,r_mta)
                 call vecmulti(r_mta,r_loc1,r_loc2) ! convert from wgs84 xyz to tcn
                 call vecaddit(r_mta(1,4),r_loc2,r_loc2)
                 if (i_debug .eq. -9 .or. i_debug .ge. 9) write(6,*) 'tcnxyz=',r_loc2
                 call sch_to_tcn(r_rad,r_loc2,r_lat,r_lon,r_hhh,2) ! convert tcn to sch
                 r_loc11(1)=r_lon*r_rad ! Convert sch
                 r_loc11(2)=r_lat*r_rad
                 r_loc11(3)=r_hhh
              else if (a_setproj .eq. 'eqa' .or. a_setproj .eq. 'EQA') then
                 r_loc11(1)=r_lat*r_rtod
                 r_loc11(2)=r_lon*r_rtod
                 r_loc11(3)=r_hhh
              else
                 i_err=1
                 if (i_debug .ge. 1) write(6,*) 'Lat/Long output not supported for ',a_setproj(1:max(1,rdflen(a_setproj)))
              end if

           end if

        return
      end

      subroutine buffer_cmd(i_event,i_bdat,i_bcnt,i_base,I_BMAX,i_abort,i_debug)

      implicit none

      integer*4 I_BMAX
      integer*4 i_event(0:10)
      integer*4 i_bdat(0:10,I_BMAX)
      integer*4 i_bcnt
      integer*4 i_abort
      integer*4 i_base
      integer*4 i_debug

      integer*4 i
      integer*4 j
      integer*4 k
      integer*4 ii

c      if ((i_event(0) .eq. 0 .and. i_event(2) .eq. 0) .or. i_event(2) .eq. 9) then
        if ((i_event(0) .eq. 0 .and. i_event(2) .eq. 0) ) then
           ! do nothing
        else
          i_bcnt = min(i_bcnt+1,I_BMAX)
          do i=0,10
            i_bdat(i,i_bcnt) = i_event(i)
          end do

        end if
      return
      end


      subroutine get_colortable(a_colordir,a_dspctbl,i_dspnumt,r_dspredt,r_dspgrnt,r_dspblut,i_debug)

      implicit none

      character*(*) a_dspctbl
      character*(255) a_line
      character*(255) a_colordir
      character*(255) a_file
      integer*4     i_dspnumt
      integer*4     i_debug
      real*4        r_dspredt(0:255)
      real*4        r_dspgrnt(0:255)
      real*4        r_dspblut(0:255)

      integer*4     i_nrgb(0:3,0:256)

      integer*4     i, j, k
      integer*4     i_cnt
      integer*4     i_loc
      integer*4     ierr

      integer rdflen
      external rdflen

      if (i_debug .eq. -3 .or. i_debug .ge. 3) write(6,*) 'in get_colortable:',a_dspctbl,a_colordir
      if (a_dspctbl .eq. ' ' .or. a_dspctbl .eq. '?' .or. a_dspctbl .eq. '*') then
c         i_dspnumt=256
c         do i=0,255
c            r_dspredt(i) = 0.   ! Values of red   color table
c            r_dspgrnt(i) = 0.   ! Values of green color table
c            r_dspblut(i) = 0.   ! Values of blue  color table
c         end do
      else if (a_dspctbl .eq. 'bitmap') then
         i_dspnumt=2
         r_dspredt(0) = 0.   ! Values of red   color table
         r_dspgrnt(0) = 0.   ! Values of green color table
         r_dspblut(0) = 0.   ! Values of blue  color table
         r_dspredt(1) = 1.   ! Values of red   color table
         r_dspgrnt(1) = 1.   ! Values of green color table
         r_dspblut(1) = 1.   ! Values of blue  color table
      else if (a_dspctbl .eq. 'white') then
         i_dspnumt=2
         do i=0,i_dspnumt-1
            r_dspredt(i) = 1.0    ! Values of red   color table
            r_dspgrnt(i) = 1.0    ! Values of green color table
            r_dspblut(i) = 1.0    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'black') then
         i_dspnumt=2
         do i=0,i_dspnumt-1
            r_dspredt(i) = 0.0    ! Values of red   color table
            r_dspgrnt(i) = 0.0    ! Values of green color table
            r_dspblut(i) = 0.0    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'grey') then
         i_dspnumt=256
         do i=0,i_dspnumt-1
            r_dspredt(i) = max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of red   color table
            r_dspgrnt(i) = max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of green color table
            r_dspblut(i) = max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'red') then
         i_dspnumt=256
         do i=0,i_dspnumt-1
            r_dspredt(i) = max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of red   color table
            r_dspgrnt(i) = 0    ! Values of green color table
            r_dspblut(i) = 0    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'green') then
         i_dspnumt=256
         do i=0,i_dspnumt-1
            r_dspredt(i) = 0    ! Values of red   color table
            r_dspgrnt(i) = max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of green color table
            r_dspblut(i) = 0    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'blue') then
         i_dspnumt=256
         do i=0,i_dspnumt-1
            r_dspredt(i) = 0    ! Values of red   color table
            r_dspgrnt(i) = 0    ! Values of green color table
            r_dspblut(i)=max(0.,min(1.,i/(i_dspnumt-1.)))    ! Values of blue  color table
         end do
      else if (a_dspctbl .eq. 'cmy') then
         do i=0,84
            r_dspredt(i) = i*3  ! Values of red   color table
            r_dspgrnt(i) = 255-i*3 ! Values of green color table
            r_dspblut(i) = 255  ! Values of blue  color table
         end do
         do i=0,84
            r_dspredt(i+85) = 255 ! Values of red   color table
            r_dspgrnt(i+85) = i*3 ! Values of green color table
            r_dspblut(i+85) = 255-i*3 ! Values of blue  color table
         end do
         do i=0,84
            r_dspredt(i+170) = 255-i*3 ! Values of red   color table
            r_dspgrnt(i+170) = 255 ! Values of green color table
            r_dspblut(i+170) = i*3 ! Values of blue  color table
         end do
         r_dspredt(255) = 0     ! Values of red   color table
         r_dspgrnt(255) = 255   ! Values of green color table
         r_dspblut(255) = 255   ! Values of blue  color table
         i_dspnumt=256
         do i=0,255
           r_dspredt(i)=max(0.,min(1.,r_dspredt(i)/255.))
           r_dspgrnt(i)=max(0.,min(1.,r_dspgrnt(i)/255.))
           r_dspblut(i)=max(0.,min(1.,r_dspblut(i)/255.))
         end do
      else if (a_dspctbl .eq. 'myc') then
         do i=0,84
            r_dspredt(i) = 255  ! Values of red   color table
            r_dspgrnt(i) = i*3  ! Values of green color table
            r_dspblut(i) = 255-i*3 ! Values of blue  color table
         end do
         do i=0,84
            r_dspredt(i+85) = 255-i*3 ! Values of red   color table
            r_dspgrnt(i+85) = 255 ! Values of green color table
            r_dspblut(i+85) = i*3 ! Values of blue  color table
         end do
         do i=0,84
            r_dspredt(i+170) = i*3 ! Values of red   color table
            r_dspgrnt(i+170) = 255-i*3 ! Values of green color table
            r_dspblut(i+170) = 255 ! Values of blue  color table
         end do
         r_dspredt(255) = 255   ! Values of red   color table
         r_dspgrnt(255) = 0     ! Values of green color table
         r_dspblut(255) = 255   ! Values of blue  color table
         i_dspnumt=256
         do i=0,255
           r_dspredt(i)=max(0.,min(1.,r_dspredt(i)/255.))
           r_dspgrnt(i)=max(0.,min(1.,r_dspgrnt(i)/255.))
           r_dspblut(i)=max(0.,min(1.,r_dspblut(i)/255.))
         end do
      else if (a_dspctbl .eq. 'bgw') then
         i_dspnumt=256
         i_cnt = 4
         i_nrgb(0,1) = 0
         i_nrgb(1,1) = 25
         i_nrgb(2,1) = 25
         i_nrgb(3,1) = 112
         i_nrgb(0,2) = 127
         i_nrgb(1,2) = 34
         i_nrgb(2,2) = 139
         i_nrgb(3,2) = 34
         i_nrgb(0,3) = 200
         i_nrgb(1,3) = 139
         i_nrgb(2,3) = 69
         i_nrgb(3,3) = 19
         i_nrgb(0,4) = 255
         i_nrgb(1,4) = 180
         i_nrgb(2,4) = 180
         i_nrgb(3,4) = 180
         do i=0,i_dspnumt-1
            k=0
            do j=1,i_cnt
               if (i_nrgb(0,j-1) .le. i .and. i_nrgb(0,j) .ge. i) then
                  k = j
               end if
            end do
            if (k .eq. 0) then
               if (i_debug .ge. 1) write(6,*) 'Error in bgw get_colortable'
            end if
            r_dspredt(i) = i_nrgb(1,k-1)+((i_nrgb(1,k)-i_nrgb(1,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))
            r_dspgrnt(i) = i_nrgb(2,k-1)+((i_nrgb(2,k)-i_nrgb(2,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))
            r_dspblut(i) = i_nrgb(3,k-1)+((i_nrgb(3,k)-i_nrgb(3,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))

         end do
         do i=0,i_dspnumt-1
           r_dspredt(i)=max(0.,min(1.,r_dspredt(i)/255.))
           r_dspgrnt(i)=max(0.,min(1.,r_dspgrnt(i)/255.))
           r_dspblut(i)=max(0.,min(1.,r_dspblut(i)/255.))
         end do
      else
         i_cnt=0
         i_dspnumt=1
         i_nrgb(0,0)=0
         i_nrgb(1,0)=0
         i_nrgb(2,0)=0
         i_nrgb(3,0)=0
         if (i_debug .eq. -3 .or. i_debug .ge. 3) write(6,*) 'Loading external color table: ',a_dspctbl
         a_file=a_dspctbl
         open(unit=81,file=a_file,form='formatted',status='old',iostat=ierr)
         if (ierr .ne. 0 .and. index(a_dspctbl,'/') .eq. 0) then
           a_file=a_colordir(1:rdflen(a_colordir))//a_dspctbl
           open(unit=81,file=a_file,form='formatted',status='old',iostat=ierr)
         end if
         if (i_debug .eq. -3 .or. i_debug .ge. 3) write(6,*) 'reading color file:',a_file
         if (ierr .eq. 0) then
           do while (ierr .eq. 0 .and. i_cnt .lt. 256)
             read(81,fmt='(a)',err=900,end=900) a_line
             if (a_line(1:1) .ne. 'c' .and. a_line(1:1) .ne. '#' .and. a_line(1:1) .ne. '!' .and.
     &           a_line(1:1) .ne. '%' .and. a_line(1:1) .ne. '/' .and. a_line(1:1) .ne. 'C' ) then
               if (index(a_line,'!') .gt. 1) a_line=a_line(1:index(a_line,'!')-1)
               read(unit=a_line,fmt=*,iostat=ierr) i_nrgb(0,i_cnt),i_nrgb(1,i_cnt)
     &              ,i_nrgb(2,i_cnt),i_nrgb(3,i_cnt)
               if (ierr .eq. 0) then
                 if (i_debug .eq. -6 .or. i_debug .ge. 6) write(6,*) 'cfile:',i_nrgb(0,i_cnt),i_nrgb(1,i_cnt)
     &              ,i_nrgb(2,i_cnt),i_nrgb(3,i_cnt)
                 i_dspnumt=max(i_dspnumt,i_nrgb(0,i_cnt)+1)
                 i_cnt=i_cnt+1
               end if
             end if
           end do
           if (i_cnt .gt. 256) stop 'Error - External color table too big'
 900       continue
           close(81)
         else
           do i=0,256
              i_nrgb(0,i)=i
              i_nrgb(1,i)=i
              i_nrgb(2,i)=i
              i_nrgb(3,i)=i
           end do
           i_cnt=256
           i_dspnumt=256
           a_dspctbl=a_dspctbl(1:max(1,rdflen(a_dspctbl)))//' - not found.  Using grey'
         end if
         i_dspnumt=min(i_dspnumt,256)
         if (i_debug .ge. 4) write(6,*) 'Number of colors in file: ',i_cnt
         if (i_debug .ge. 4) write(6,*) 'Number of colors in cmap: ',i_dspnumt
         do i=0,i_dspnumt-1
            k=0
            do j=1,i_cnt
               if (i_nrgb(0,j-1) .le. i .and. i_nrgb(0,j) .ge. i) then
                  k = j
               end if
            end do
            if (k .eq. 0) then
               if (i_debug .ge. 1) write(6,*) 'Error in bgw get_colortable'
            end if
            r_dspredt(i) = i_nrgb(1,k-1)+((i_nrgb(1,k)-i_nrgb(1,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))
            r_dspgrnt(i) = i_nrgb(2,k-1)+((i_nrgb(2,k)-i_nrgb(2,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))
            r_dspblut(i) = i_nrgb(3,k-1)+((i_nrgb(3,k)-i_nrgb(3,k-1))*(i
     &           -i_nrgb(0,k-1)))/(i_nrgb(0,k)-i_nrgb(0,k-1))

         end do
         do i=0,i_dspnumt-1
           r_dspredt(i)=max(0.,min(1.,r_dspredt(i)/255.))
           r_dspgrnt(i)=max(0.,min(1.,r_dspgrnt(i)/255.))
           r_dspblut(i)=max(0.,min(1.,r_dspblut(i)/255.))
           if (i_debug .ge. 6) write(6,*) i,r_dspredt(i),r_dspgrnt(i),r_dspblut(i)
         end do

      end if
      return
      end


       subroutine copy_setdata(i_in,i_out,i_setunit,i_setrows,i_setcols,
     &                         a_setname,a_setfile,a_setinfo,a_setproj,
     &                         i_setshdr,i_setstlr,i_setrhdr,i_setrtlr,i_setchdr,i_setctlr,
     &                         r_setrmlt,r_setradr,r_setcmlt,r_setcadr,r_setvmlt,r_setvadr,
     &                         i_setvend,i_setvfmt,r_setvmin,r_setvmax,a_setvnul,r_setpegv)

       implicit none

       integer i_in
       integer i_out

      integer I_FMAX            ! Maximum number of data files
      parameter(I_FMAX= 6)

      integer I_CMAX            ! Maximum number of data channels
      parameter(I_CMAX=10)

c     structure / set_structure / s_set(*)
      character*200 a_setname(-I_FMAX:I_CMAX) ! Parameter name
      character*200 a_setfile(-I_FMAX:I_CMAX) ! Data filename
      character*200 a_setinfo(-I_FMAX:I_CMAX) ! Header filename
      character*200 a_setproj(-I_FMAX:I_CMAX) ! Projection name
      character*16  a_setvnul(-I_FMAX:I_CMAX) ! Hex string of null value
      integer i_setunit(-I_FMAX:I_CMAX) ! Unit number to read set
      integer i_setrows(-I_FMAX:I_CMAX) ! Number of rows in set
      integer i_setcols(-I_FMAX:I_CMAX) ! Number of columns in set
      integer i_setshdr(-I_FMAX:I_CMAX) ! Number of bytes in set header
      integer i_setstlr(-I_FMAX:I_CMAX) ! Number of bytes in set trailer
      integer i_setrhdr(-I_FMAX:I_CMAX) ! Number of bytes in row header
      integer i_setrtlr(-I_FMAX:I_CMAX) ! Number of bytes in row trailer
      integer i_setchdr(-I_FMAX:I_CMAX) ! Number of bytes in column header
      integer i_setctlr(-I_FMAX:I_CMAX) ! Number of bytes in column trailer
      integer i_setvend(-I_FMAX:I_CMAX) ! Endian flag
      integer i_setvfmt(-I_FMAX:I_CMAX) ! Method to decode columns
      real*4  r_setrmlt(-I_FMAX:I_CMAX) ! Row Scale  for set
      real*4  r_setradr(-I_FMAX:I_CMAX) ! Row Offset for set
      real*4  r_setcmlt(-I_FMAX:I_CMAX) ! Column Scale  for set
      real*4  r_setcadr(-I_FMAX:I_CMAX) ! Column Offset for set
      real*4  r_setvmlt(-I_FMAX:I_CMAX) ! Value Scale  for set
      real*4  r_setvadr(-I_FMAX:I_CMAX) ! Value Offset for set
      real*4  r_setvmin(-I_FMAX:I_CMAX) ! Minimum valid value
      real*4  r_setvmax(-I_FMAX:I_CMAX) ! Maximum valid value
      real*4  r_setpegv(3,-I_FMAX:I_CMAX) ! Maximum valid value
c     end structure

                  if (i_out .lt. -I_FMAX .or. i_out .gt. I_CMAX) write(6,*) 'i_out error in copy setdata ',i_out
                  if (i_in  .lt. -I_FMAX .or. i_in  .gt. I_CMAX) write(6,*) 'i_in error in copy setdata ',i_in

                  a_setname(i_out) = a_setname(i_in)
                  a_setfile(i_out) = a_setfile(i_in)
                  a_setinfo(i_out) = a_setinfo(i_in)
                  a_setproj(i_out) = a_setproj(i_in)
                  i_setunit(i_out) = i_setunit(i_in)
                  i_setrows(i_out) = i_setrows(i_in)
                  i_setcols(i_out) = i_setcols(i_in)
                  i_setshdr(i_out) = i_setshdr(i_in)
                  i_setstlr(i_out) = i_setstlr(i_in)
                  i_setrhdr(i_out) = i_setrhdr(i_in)
                  i_setrtlr(i_out) = i_setrtlr(i_in)
                  i_setchdr(i_out) = i_setchdr(i_in)
                  i_setctlr(i_out) = i_setctlr(i_in)
                  i_setvend(i_out) = i_setvend(i_in)
                  i_setvfmt(i_out) = i_setvfmt(i_in)
                  r_setvmlt(i_out) = r_setvmlt(i_in)
                  r_setvadr(i_out) = r_setvadr(i_in)
                  r_setvmin(i_out) = r_setvmin(i_in)
                  r_setvmax(i_out) = r_setvmax(i_in)
                  a_setvnul(i_out) = a_setvnul(i_in)

                  r_setrmlt(i_out) = r_setrmlt(i_in)
                  r_setradr(i_out) = r_setradr(i_in)

                  r_setcmlt(i_out) = r_setcmlt(i_in)
                  r_setcadr(i_out) = r_setcadr(i_in)

                  r_setvmlt(i_out) = r_setvmlt(i_in)
                  r_setvadr(i_out) = r_setvadr(i_in)
                  r_setvadr(i_out) = r_setvadr(i_in)

                  r_setpegv(1,i_out) = r_setpegv(1,i_in)
                  r_setpegv(2,i_out) = r_setpegv(2,i_in)
                  r_setpegv(3,i_out) = r_setpegv(3,i_in)


       return
           end


       subroutine copy_dspdata(i_in,i_out,
     &                         r_dspaddr,r_dspmult,r_dspwrap,r_dspexpn,r_dspcplw,r_dspcphi,
     &                         r_dspval1,r_dspval2,r_dspval3,i_dspmode,i_dspaddr,i_dspmult,i_dspmixv,
     &                         a_dspctbl,i_dspdvdc)
c     structure / dspinfo / s_dsp

       implicit none

           integer i_in
           integer i_out

      integer I_FMAX            ! Maximum number of data files
      parameter(I_FMAX= 6)

      integer I_CMAX            ! Maximum number of data channels
      parameter(I_CMAX=10)

      character*200 a_dspctbl(-I_FMAX:I_CMAX) ! Color table file
      integer i_dspcnt
      integer i_dspchnl         ! Number of sets to display
      integer i_dspaddr(-I_FMAX:I_CMAX) ! Add  auto Scale flag
      integer i_dspmult(-I_FMAX:I_CMAX) ! Mult auto Scale flag
      integer i_dspmixv(-I_FMAX:I_CMAX) ! Method to mix set (add, multiply, max, avg)
      integer i_dspmode(-I_FMAX:I_CMAX)
      integer i_dspdvdc(-I_FMAX:I_CMAX)
      real*4  r_dspcplw(-I_FMAX:I_CMAX) ! Discard if below value
      real*4  r_dspcphi(-I_FMAX:I_CMAX) ! Discard if above value
      real*4  r_dspaddr(-I_FMAX:I_CMAX) ! Shift data by value
      real*4  r_dspwrap(-I_FMAX:I_CMAX) ! Wrap data by value
      real*4  r_dspexpn(-I_FMAX:I_CMAX) ! Compress data
      real*4  r_dspmult(-I_FMAX:I_CMAX) ! Multiply data by value
      real*4  r_dspval1(-I_FMAX:I_CMAX)
      real*4  r_dspval2(-I_FMAX:I_CMAX)
      real*4  r_dspval3(-I_FMAX:I_CMAX)
c     end structure

                  if (i_out .lt. -I_FMAX .or. i_out .gt. I_CMAX) write(6,*) 'i_out error in copy dspdata ',i_out
                  if (i_in  .lt. -I_FMAX .or. i_in  .gt. I_CMAX) write(6,*) 'i_in error in copy dspdata ',i_in

                  r_dspaddr(i_out) = r_dspaddr(i_in)
                  r_dspwrap(i_out) = r_dspwrap(i_in)
                  r_dspexpn(i_out) = r_dspexpn(i_in)
                  r_dspmult(i_out) = r_dspmult(i_in)
                  r_dspcplw(i_out) = r_dspcplw(i_in)
                  r_dspcphi(i_out) = r_dspcphi(i_in)
                  r_dspmult(i_out) = r_dspmult(i_in)
                  r_dspval1(i_out) = r_dspval1(i_in)
                  r_dspval2(i_out) = r_dspval2(i_in)
                  r_dspval3(i_out) = r_dspval3(i_in)
                  i_dspmode(i_out) = i_dspmode(i_in)
                  i_dspdvdc(i_out) = i_dspdvdc(i_in)
                  i_dspaddr(i_out) = i_dspaddr(i_in)
                  i_dspmult(i_out) = i_dspmult(i_in)
                  i_dspmixv(i_out) = i_dspmixv(i_in)
                  a_dspctbl(i_out) = a_dspctbl(i_in)

       return
           end

      subroutine init_dsp(a_lcolor,i_debug)


      implicit none

      integer i_debug

      integer i_clrs
      integer i_dxi
      integer i_wxi             ! Number of windows
      integer i_wxs(0:20)       ! Size of window canvas in x direction
      integer i_wys(0:20)       ! Size of window canvas in y direction

      integer*4 i_type(0:20)
      integer*4 i_frx(0:20)
      integer*4 i_fry(0:20)

      character*80 a_labl(0:20)
      character*20 a_menu(0:5,0:9)
      character*80 a_lcolor

      integer init_gx
      external init_gx


c
c     Initialize graphics
c

      i_wxi = 0
      i_clrs=0

      i_dxi=init_gx(i_wxi,i_type,a_labl,i_wxs,i_wys,i_frx,i_fry,a_menu,
     &     a_lcolor,i_clrs,i_debug)
c      write(6,*) '0 is good from init_dsp = ',i_dxi

      return
      end

      subroutine create_dsp(a_dspname,i_winrows,i_wincols,i_winy,i_winx,a_setname
     &     ,i_set,i_dxi,i_menu,a_tname,i_close,a_lcolor,i_debug)


      implicit none

      integer I_CMAX
      parameter (I_CMAX=10)

      integer i
      integer j
      integer i_set
      character*(*) a_dspname
      character*(*) a_setname(i_set)
      integer i_winrows
      integer i_wincols
      integer i_winx
      integer i_winy
      integer i_debug
      integer i_menu
      integer i_close
      character*20 a_tname(5)

      integer i_clrs
      integer i_dxi
      integer i_wxi             ! Number of windows
      integer i_wxs(0:20)       ! Size of window canvas in x direction
      integer i_wys(0:20)       ! Size of window canvas in y direction

      integer*4 i_type(0:20)
      integer*4 i_frx(0:20)
      integer*4 i_fry(0:20)

      character*80 a_labl(0:20)
      character*20 a_menu(0:5,0:9)
      character*80 a_lcolor

      integer init_gx
      external init_gx


c
c     Initialize graphics
c
      if (i_menu .eq. 1) then
        a_menu(0,0)= 'Application'
        a_menu(1,0)= 'Spawn  ^A'
        a_menu(2,0)= 'Quit   ^Q'
        a_menu(3,0)= ' '
        a_menu(4,0)= ' '
        a_menu(5,0)= ' '
        a_menu(0,1)= 'Display'
        a_menu(1,1)= 'Open   ^D'
        a_menu(2,1)= 'Close  ^K'
        a_menu(3,1)= 'Resize ^R'
        a_menu(4,1)= ' '
        a_menu(5,1)= ' '
        a_menu(0,2)= 'Set'
        a_menu(1,2)= 'Add    ^I'
        a_menu(2,2)= 'Delete ^K'
        a_menu(3,2)= 'Modify ^M'
        a_menu(4,2)= ' '
        a_menu(5,2)= ' '
        a_menu(0,3)= 'Zoom'
        a_menu(1,3)= 'None   ^N'
        a_menu(2,3)= '+2x    ^+'
        a_menu(3,3)= '-2x    ^-'
        a_menu(4,3)= 'Other  ^Z'
        a_menu(5,3)= ' '
        a_menu(0,4)= 'Select'
        a_menu(1,4)= 'Mode'
        a_menu(2,4)= 'Import'
        a_menu(3,4)= 'Export'
        a_menu(4,4)= 'Clear'
        a_menu(5,4)= ' '
        a_menu(0,5)= 'Print'
        a_menu(1,5)= 'To Printer ^PP'
        a_menu(2,5)= 'To File    ^PF'
        a_menu(3,5)= 'Setup      ^PS'
        a_menu(4,5)= ' '
        a_menu(5,5)= ' '
        if (a_tname(1) .ne. ' ' .or. a_tname(2) .ne. ' ' .or.
     &        a_tname(3) .ne. ' ' .or. a_tname(4) .ne. ' ' .or. a_tname(5) .ne. ' ') then
          a_menu(0,6)='Tools'
        else
          a_menu(0,6)= ' '
        end if
        a_menu(1,6)= a_tname(1)
        a_menu(2,6)= a_tname(2)
        a_menu(3,6)= a_tname(3)
        a_menu(4,6)= a_tname(4)
        a_menu(5,6)= a_tname(5)
        a_menu(0,7)= ' '
        a_menu(1,7)= ' '
        a_menu(2,7)= ' '
        a_menu(3,7)= ' '
        a_menu(4,7)= ' '
        a_menu(5,7)= ' '
        a_menu(0,8)= ' '
        a_menu(1,8)= ' '
        a_menu(2,8)= ' '
        a_menu(3,8)= ' '
        a_menu(4,8)= ' '
        a_menu(5,8)= ' '
        a_menu(0,9)= 'Help'
        a_menu(1,9)= 'Reference   ^HC'
        a_menu(2,9)= 'Users Guide ^HT'
        a_menu(3,9)= ' '
        a_menu(4,9)= ' '
        a_menu(5,9)= ' '
      else
        do i=0,5
          do j=0,9
            a_menu(i,j)=' '
          end do
        end do
      end if

      i_wxi = max(4,min(i_set+1+2*i_close,I_CMAX+2))

      if (i_debug .eq. -3 .or. i_debug .ge. 3) write(6,*) 'i_wxi = ',i_wxi

      i_type(1) = 4
      do i=2,i_wxi
        i_type(i) = 6
      end do

      a_labl(0) = a_dspname
      a_labl(1) = 'Image Window'
      do i=2,i_wxi
        a_labl(i) = ' '
      end do
      if (i_close .ne. 0) a_labl(i_wxi) = 'Close'

      write(6,*) 'i_set=',i_set,I_CMAX
      do i=1,min(i_set,I_CMAX)
         if (a_setname(i) .ne. ' ') then
            a_labl(i+1)=a_setname(i)
         else
            write(a_labl(i+1),'(a,i2)') 'Set',i
         end if
      end do

      write(6,*) 'a_labl(i_wxi)=',a_labl(i_wxi)

      if (i_winx .ne. 0) then
        i_wxs(0) = i_winx
      else
        i_wxs(0) = min(i_wincols+28,800)
      end if
      if (i_winy .ne. 0) then
        i_wys(0) = i_winy
      else
        i_wys(0) = min(i_winrows+120,600)
      end if
      i_wxs(1) = i_wincols
      i_wys(1) = i_winrows
      do i=2,i_wxi
        i_wxs(i) = 50
        i_wys(i) = 50
      end do

      i_frx(0) = i_wxi-1
      i_frx(1) = i_wxi-1
      do i=2,i_wxi
        i_frx(i) = 1
      end do

      i_fry(0) = 0
      i_fry(1) = 400
      do i=2,i_wxi
        i_fry(i) = -25
      end do

      i_clrs=0

      i_dxi=init_gx(i_wxi,i_type,a_labl,i_wxs,i_wys,i_frx,i_fry,a_menu,
     &     a_lcolor,i_clrs,i_debug)
      if (i_debug .ge. 4) write(6,*) 'i_dxi = ',i_dxi

      return
      end


****************************************************************
        subroutine read_hdr(a_hdrfile,i_lsize,i_ssize,r_peg,a_type,
     &              r_str,r_spc,i_mbytes,i_dbytes,r_mmul,r_madd,
     &              r_dmul,r_dadd,i_err)

c****************************************************************
c**
c**     FILE NAME: read_hdr.f
c**
c**     DATE WRITTEN: 2/15/96
c**
c**     PROGRAMMER:Scott Shaffer
c**
c**     FUNCTIONAL DESCRIPTION: Reads some of an IFPROC header file.
c**
c**     ROUTINES CALLED:none
c**
c**     NOTES:
c**
c**
c*****************************************************************

        implicit none

c       INPUT VARIABLES:

        character*(*) a_hdrfile         !header file

c       OUTPUT VARIABLES:

        character*(*) a_type

        integer*4 i_err
        integer*4 i_lsize
        integer*4 i_ssize

        integer*4 i_mbytes
        integer*4 i_dbytes

        real*8 r_peg(3)
        real*8 r_str(2)
        real*8 r_spc(2)
        real r_mmul
        real r_madd
        real r_dmul
        real r_dadd


c       LOCAL VARIABLES:

        integer*4 i
        integer*4 j
        integer*4 i_cnt
        integer*4 i_zone
        real*8 r_atm(3,4)
        real*8 r_pi
        real*8 r_rtod
        real*8 r_mdnc(2)
        real*8 r_ddnc(2)

        character*255 a_tmp

c       FUNCTION STATEMENTS:

        integer rdflen
        external rdflen

c       DATA STATEMENTS: none

c       PROCESSING STEPS:

c
c  Initialize pi and conversions
c
        r_pi = 4.d0*atan(1.0d0)
        r_rtod = 180.0d0/r_pi

        i_err = 1
        i_cnt = 0

        write(6,*) ' '
        write(6,*) 'Opening hdr input  file: ',a_hdrfile(1:52)
        open(12,file=a_hdrfile,status='old',form='formatted',err=900)
        write(6,*) 'Reading'

        do i=1,100000
           read(12,'(a)',end=900) a_tmp
           if (a_tmp .eq. ' ') then
             ! do nothing
           else if (index(a_tmp,'Data file dimensions') .gt. 0) then
             read(a_tmp,*) i_lsize,i_ssize
             i_cnt = i_cnt + 1
           else if (index(a_tmp,'Post Spacing') .gt. 0) then
             read(a_tmp,*) r_spc
             i_cnt = i_cnt + 2
           else if (index(a_tmp,'Peg position (WGS-84)') .gt. 0) then
             read(a_tmp,*) r_peg
             r_peg(1) = r_peg(1)/r_rtod
             r_peg(2) = r_peg(2)/r_rtod
             r_peg(3) = r_peg(3)/r_rtod
             i_cnt = i_cnt + 4
           else if (index(a_tmp,'UTM Zone') .gt. 0) then
             read(a_tmp,*) i_zone
             r_peg(2)=(i_zone-0.5)*(6.d0/r_rtod)-r_pi
           else if (index(a_tmp,'Starting corner position (s,c)') .gt. 0) then
             read(a_tmp,*) r_str
             i_cnt = i_cnt + 8
           else if (index(a_tmp,'M11 M12 M13') .gt. 0) then
             read(a_tmp,*) r_atm(1,1),r_atm(1,2),r_atm(1,3)
c             i_cnt = i_cnt + 16
           else if (index(a_tmp,'M21 M22 M23') .gt. 0) then
             read(a_tmp,*) r_atm(2,1),r_atm(2,2),r_atm(2,3)
c             i_cnt = i_cnt + 32
           else if (index(a_tmp,'M31 M32 M33') .gt. 0) then
             read(a_tmp,*) r_atm(3,1),r_atm(3,2),r_atm(3,3)
c             i_cnt = i_cnt + 64
           else if (index(a_tmp,'O1 O2 O3') .gt. 0) then
             read(a_tmp,*) r_atm(1,4),r_atm(2,4),r_atm(3,4)
c             i_cnt = i_cnt + 128
           else if (index(a_tmp,'Magnitude Scale and Shift') .gt. 0) then
             read(a_tmp,*) r_mdnc
             r_mmul=r_mdnc(1)
             r_madd=r_mdnc(2)
           else if (index(a_tmp,'Elevation Scale and Shift') .gt. 0) then
             read(a_tmp,*) r_ddnc
             r_dmul=r_ddnc(1)
             r_dadd=r_ddnc(2)
             write(6,*) 'r_dm,r_da=',r_dmul,r_dadd
           else if (index(a_tmp,'Magnitude Bytes per Pixel') .gt. 0) then
             read(a_tmp,*) i_mbytes
           else if (index(a_tmp,'Elevation Bytes per Pixel') .gt. 0) then
             read(a_tmp,*) i_dbytes
             write(6,*) 'i_dbytes=',i_dbytes
           else if (index(a_tmp,'Data file type') .gt. 0) then
             a_type = a_tmp(1:max(1,index(a_tmp,';')-1))
             do j=1,rdflen(a_type)
               if (ichar(a_type(1:1)) .eq. 32 .or. ichar(a_type(1:1)) .eq. 9) a_type = a_type(2:)
             end do
           end if
        end do
        close(12)
        stop 'Error reading header file, too many lines'

900     close(12,err=910)
910     if (i_cnt .eq. 15) i_err = 0
        return
      end

      subroutine get_airsarinfo(          a_setname,
     &     a_setfile,
     &     a_setproj,
     &     i_setunit,
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     a_setvnul,
     &     r_setrmlt,
     &     r_setradr,
     &     r_setcmlt,
     &     r_setcadr,
     &     r_setpegv,
     &     a_dspctbl   )

c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
      character*200 a_setname   ! Parameter name
      character*200 a_setfile   ! Data filename
      character*200 a_setinfo   ! Header filename
      character*200 a_setproj   ! Projection name
      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setrmlt         ! Row Scale  for set
      real*4  r_setradr         ! Row Offset for set
      real*4  r_setcmlt         ! Column Scale  for set
      real*4  r_setcadr         ! Column Offset for set
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      character*16 a_setvnul    ! Invalid value
      real*4  r_setvavg         ! Average value in set
      real*4  r_setvstd         ! Standard deviation of values in set
      real*4  r_setpegv(3)      ! Peg Point
c     end structure

      character*200 a_dspctbl

        integer i
        integer i_err
        integer i_unit
        integer i_bytes

        character*50 a_string(100)

        byte b_string(5000)

        real*8 r_pi
        real*8 r_rtod
        real*4 r_temp

        integer nread


        integer initdk
        external initdk

        integer closedk
        external closedk

#ifdef IO64
      integer*8 nseek

      integer*8 ioseek64
      external ioseek64

      integer*8 i_demoff
      integer*8 i_magoff
      integer*8 i_paroff
#else
      integer*4 nseek

      integer*4 ioseek
      external ioseek

      integer*4 i_demoff
      integer*4 i_magoff
      integer*4 i_paroff
#endif

        integer ioread
        external ioread

        equivalence(a_string,b_string)

c
c  Initialize pi and conversions
c
        r_pi = 4.d0*atan(1.0d0)
        r_rtod = 180.0d0/r_pi


c          write(6,*) 'AIRSAR: ',a_setfile(1:60)
          i_unit = initdk(19,a_setfile)
c          write(6,*) 'i_unit=',i_unit
          i_demoff = 0
#ifdef IO64
          nseek   = ioseek64(i_unit,i_demoff,0)
c         write(6,*) 'nseek64=',nseek
#else
          nseek   = ioseek(i_unit,i_demoff,0)
c         write(6,*) 'nseek=',nseek
#endif
c          write(6,*) 'i_unit again = ',i_unit
          nread = ioread(i_unit,b_string(1),5000)

          i_demoff = -1
          i_magoff = -1
          i_paroff = -1
c         write(6,*) 'nread=',nread
          nread=5000
          do i=1,(nread-1)/50+1
            if (a_string(i) .eq. ' ') then
              ! do nothing
            else if (index(a_string(i),'NUMBER OF SAMPLES PER RECORD =') .gt. 0) then
              read(a_string(i)(35:),*) i_setcols
              write(6,*) ' '
              write(6,*) 'Reading AIRSAR header '
              a_setname = 'AIRSAR-MAG'
            else if (index(a_string(i),'NUMBER OF LINES IN IMAGE =') .gt. 0) then
              read(a_string(i)(35:),*) i_setrows
            else if (index(a_string(i),'NUMBER OF BYTES PER SAMPLE =') .gt. 0) then
              read(a_string(i)(35:),*) i_bytes

              if (i_bytes .eq. 0) then
                ! do nothing
              else if (i_bytes .eq. 1) then
                i_setvfmt = 0 ! 'val_frmt = BYTE'
              else if (i_bytes .eq. 2) then
                i_setvfmt = 2 ! 'val_frmt = INTEGER*2'
              else if (i_bytes .eq. 4) then
                i_setvfmt = 4 ! 'val_frmt = REAL*4'
              else if (i_bytes .eq. 8) then
                i_setvfmt = 6 ! 'val_frmt = Complex magnitude
              else if (i_bytes .eq. 10) then
                i_setvfmt = 9 ! 'val_frmt = Compressed stokes11
                a_setname = 'AIRSAR-M11'
              end if

            else if (index(a_string(i),'BYTE OFFSET OF FIRST DATA RECORD =') .gt. 0) then
              read(a_string(i)(35:),*) i_setshdr
            else if (index(a_string(i),'BYTE OFFSET OF DEM HEADER =') .gt. 0) then
              read(a_string(i)(35:),*) i_demoff
              if (i_demoff .gt. 0) a_setname = 'AIRSAR-DEM'
            else if (index(a_string(i),'BYTE OFFSET OF CALIBRATION HEADER =') .gt. 0) then
              read(a_string(i)(37:),*) i_magoff
              if (i_magoff .gt. 0) a_setname = 'AIRSAR-MAG'
            else if (index(a_string(i),'BYTE OFFSET OF PARAMETER HEADER =') .gt. 0) then
              read(a_string(i)(37:),*) i_paroff
            endif
          enddo

          if (i_demoff .ge. 0) then
#ifdef IO64
          nseek   = ioseek64(i_unit,i_demoff,0)
#else
          nseek   = ioseek(i_unit,i_demoff,0)
#endif
            nread = ioread(i_unit,b_string,4550)

            do i=1,(nread-1)/50+1
              if (a_string(i)(35:) .eq. ' ') then
                ! do nothing
              else if (index(a_string(i),'X-DIRECTION POST SPACING (M) =') .gt. 0) then
                read(a_string(i)(35:),*) r_setrmlt
              else if (index(a_string(i),'Y-DIRECTION POST SPACING (M) =') .gt. 0) then
                read(a_string(i)(35:),*) r_setcmlt
              else if (index(a_string(i),'ELEVATION INCREMENT (M) =') .gt. 0) then
                read(a_string(i)(35:),*,iostat=i_err) r_temp
                if (r_temp .ne. 0.0) r_setvmlt = r_temp
              else if (index(a_string(i),'ELEVATION OFFSET (M) =') .gt. 0) then
                read(a_string(i)(35:),*,iostat=i_err) r_setvadr
              else if (index(a_string(i),'LATITUDE OF PEG POINT =') .gt. 0) then
                read(a_string(i)(35:),*) r_setpegv(1)
                r_setpegv(1) = r_setpegv(1) / r_rtod
                a_setproj = 'sch'
              else if (index(a_string(i),'LONGITUDE OF PEG POINT =') .gt. 0) then
                read(a_string(i)(35:),*) r_setpegv(2)
                r_setpegv(2) = r_setpegv(2) / r_rtod
              else if (index(a_string(i),'HEADING AT PEG POINT (DEGREES) =') .gt. 0) then
                read(a_string(i)(35:),*) r_setpegv(3)
                r_setpegv(3) = r_setpegv(3) / r_rtod
              else if (index(a_string(i),'ALONG-TRACK OFFSET S0 (M) =') .gt. 0) then
                read(a_string(i)(35:),*) r_setradr
              else if (index(a_string(i),'CROSS-TRACK OFFSET C0 (M) =') .gt. 0) then
                read(a_string(i)(35:),*) r_setcadr
              endif
            enddo
          end if
          i_err = closedk(i_unit)

        return

      end



      subroutine get_pdsinfo(          a_setname,
     &     a_setfile,
     &     a_setproj,
     &     i_setunit,
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     a_setvnul,
     &     r_setrmlt,
     &     r_setradr,
     &     r_setcmlt,
     &     r_setcadr,
     &     r_setpegv,
     &     a_dspctbl,i_debug   )

c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
      character*200 a_setname   ! Parameter name
      character*200 a_setfile   ! Data filename
      character*200 a_setinfo   ! Header filename
      character*200 a_setproj   ! Projection name
      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setrmlt         ! Row Scale  for set
      real*4  r_setradr         ! Row Offset for set
      real*4  r_setcmlt         ! Column Scale  for set
      real*4  r_setcadr         ! Column Offset for set
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      character*16 a_setvnul    ! Invalid value
      real*4  r_setvavg         ! Average value in set
      real*4  r_setvstd         ! Standard deviation of values in set
      real*4  r_setpegv(3)      ! Peg Point
c     end structure

      character*200 a_dspctbl

        integer i
        integer i_err
        integer i_unit
        integer i_bytes
        integer i_debug

        integer i_recbytes
        integer i_label

        character*10000 a_string
        character*255 a_line
        character*255 a_key
        character*255 a_val
        character*255 a_object

        byte b_string(10000)

        real*8 r_pi
        real*8 r_rtod
        real*4 r_temp

        integer nread


        integer initdk
        external initdk

        integer closedk
        external closedk

#ifdef IO64
      integer*8 nseek

      integer*8 ioseek64
      external ioseek64

      integer*8 i_demoff
      integer*8 i_magoff
      integer*8 i_paroff
#else
      integer*4 nseek

      integer*4 ioseek
      external ioseek

      integer*4 i_demoff
      integer*4 i_magoff
      integer*4 i_paroff
#endif

        integer ioread
        external ioread


        integer rdflen
        external rdflen

        equivalence(a_string,b_string)

c
c  Initialize pi and conversions
c
        r_pi = 4.d0*atan(1.0d0)
        r_rtod = 180.0d0/r_pi


c          write(6,*) 'AIRSAR: ',a_setfile(1:60)
          i_unit = initdk(19,a_setfile)
c          write(6,*) 'i_unit=',i_unit
          i_demoff = 0
#ifdef IO64
          nseek   = ioseek64(i_unit,i_demoff,0)
c         write(6,*) 'nseek64=',nseek
#else
          nseek   = ioseek(i_unit,i_demoff,0)
c         write(6,*) 'nseek=',nseek
#endif
c          write(6,*) 'i_unit again = ',i_unit
          nread = ioread(i_unit,b_string(1),10000)

          if (a_string(1:14) .eq. 'PDS_VERSION_ID') then

            i_demoff = -1
            i_magoff = -1
            i_paroff = -1

            i_bytes = 0

            write(6,*) ' '
            write(6,*) 'Reading PDS Label  ',index(a_string,char(10)),i_debug
            do while(index(a_string,char(10)) .gt. 0)
              a_line=a_string(1:index(a_string,char(10)))
              a_key = a_line(1:max(1,index(a_line,'=')-1))
              a_val = a_line(max(1,index(a_line,'=')+1):)
              if (index(a_val,char(13)) .gt. 1) a_val = a_val(1:index(a_val,char(13))-1)
              if (index(a_val,char(10)) .gt. 1) a_val = a_val(1:index(a_val,char(10))-1)
c              write(6,*) 'length = ',rdflen(a_val)
c              do i=1,rdflen(a_val)
c                write(6,*) i,' ',ichar(a_val(i:i)),' ',a_val(i:i)
c              end do
              if (i_debug .eq. -13 .or. i_debug .ge. 13) write(6,*) 'a_line=',a_line(1:70)
              a_string=a_string(index(a_string,char(10))+1:)
              if (a_line .eq. ' ') then
                ! do nothing
              else if (a_key .eq. 'RECORD_BYTES') then
                read(a_val,*) i_recbytes
              else if (a_key .eq. 'LABEL_RECORDS') then
                read(a_val,*) i_label
              else if (a_key .eq. 'OBJECT') then
c                write(6,*) 'a_val=',a_val(1:70)
                if (a_val .eq. ' LBDR_TABLE') then
                  a_object = 'LBIDR_TABLE'
                  i_setcols = 32768
                  i_setrhdr = 1272
                  i_setvfmt = 4
                else if (a_val .eq. ' IMAGE') then
                  a_object = 'IMAGE'
                else if (a_val .eq. ' IMAGE_MAP_PROJECTION') then
                  a_object = 'IMAGE_MAP_PROJECTION'
                end if
c                write(6,*) '  Object = ',a_object(1:30),i_setcols
              else if (a_key .eq. 'END_OBJECT') then
                a_object = ' '
              else if (a_object .eq. 'LBIDR_TABLE') then
                if (a_key .eq. '  ROWS') then
                  read(a_val,*) i_setrows
                end if
              else if (a_object .eq. 'IMAGE') then
                if (a_key .eq. '  LINE_SAMPLES') then
                  read(a_val,*) i_setcols
                else if (a_key .eq. '  LINES') then
                  read(a_val,*) i_setrows
                else if (a_key .eq. '  SAMPLE_TYPE') then
c                  do i=1,25
c                    write(6,*) 'i/val=',i,ichar(a_line(32+i:32+i)),' ',a_line(32+i:32+i)
c                  end do
                  if (a_val .eq. ' ') then
                    ! do nothing
                  else if (a_val(1:19) .eq. ' "UNSIGNED INTEGER"') then
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    else if (i_bytes .eq. 1) then
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    else if (i_bytes .eq. 2) then
                      i_setvfmt = 8 ! 'val_frmt = BYTE*2'
                    else
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    end if
                  else if (a_val(1:10) .eq. ' "INTEGER"') then
c                    write(6,*) 'INTEGER data detected ',i_bytes
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else if (i_bytes .eq. 1) then
                      i_setvfmt = 1 ! 'val_frmt = INTEGER*1'
                    else if (i_bytes .eq. 2) then
                      i_setvfmt = 2 ! 'val_frmt = INTEGER*2'
                    else if (i_bytes .eq. 4) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    end if
c                    write(6,*) 'i_setvfmt = ',i_setvfmt
                  else if (a_val(1:10) .eq. ' "PC_REAL"') then
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 4) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 8) then
                      i_setvfmt = 5 ! 'val_frmt = REAL*8'
                    else
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    end if
                  else if (a_val(1:10) .eq. ' "COMPLEX"') then
                    i_setvfmt = 6 ! 'val_frmt = Complex magnitude
                  end if
                else if (a_key .eq. '  SAMPLE_BITS') then
                  read(a_val,*) i_bytes
                  i_bytes = i_bytes/8
                  if (i_bytes .eq. 0) then
                    ! do nothing
                  else if (i_bytes .eq. 1) then
                      if (i_setvfmt .eq. 2 .or. i_setvfmt .eq. 3) then
                      i_setvfmt = 1 ! 'val_frmt = INTEGER*1'
                    else if (i_setvfmt .eq. 4 .or. i_setvfmt .eq. 5) then
                       ! do nothing
                    end if
                  else if (i_bytes .eq. 2) then
                    if (i_setvfmt .eq. 0) then
                      i_setvfmt = 8 ! 'val_frmt = BYTE*2'
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 3) then
                      i_setvfmt = 2 ! 'val_frmt = INTEGER*2'
                    else if (i_setvfmt .eq. 4 .or. i_setvfmt .eq. 5) then
                      ! do nothing
                    end if
                  else if (i_bytes .eq. 4) then
                    if (i_setvfmt .eq. 0 .or. i_setvfmt .eq. 8) then
                      ! do nothing
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 2) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else if (i_setvfmt .eq. 5) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    end if
                  else if (i_bytes .eq. 8) then
                    if (i_setvfmt .eq. 0 .or. i_setvfmt .eq. 8) then
                      ! do nothing
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 2 .or. i_setvfmt .eq. 3) then
                      ! do nothing
                    else if (i_setvfmt .eq. 4) then
                      i_setvfmt = 5 ! 'val_frmt = REAL*4'
                    end if
                  end if
                end if
              else if (a_object .eq. 'IMAGE_MAP_PROJECTION') then
                if (a_key .eq. '  MAP_SCALE') then
                  read(a_val,*) r_setrmlt
                  read(a_val,*) r_setcmlt
                else if (a_key .eq. '  OBLIQUE_PROJ_POLE_LATITUDE') then
                  read(a_val,*) r_setpegv(1)
                  r_setpegv(1) = r_setpegv(1) / r_rtod
                a_setproj = 'sch'
                else if (a_key .eq. '  OBLIQUE_PROJ_POLE_LONGITUDE') then
                  read(a_val,*) r_setpegv(2)
                  r_setpegv(2) = r_setpegv(2) / r_rtod
                else if (a_key .eq. '  OBLIQUE_PROJ_POLE_ROTATION') then
                  read(a_val,*) r_setpegv(3)
                  r_setpegv(3) = r_setpegv(3) / r_rtod
                else if (a_key .eq. '  LINE_PROJECTION_OFFSET') then
                  read(a_val,*) r_setradr
                else if (a_key .eq. '  SAMPLE_PROJECTION_OFFSET') then
                  read(a_val,*) r_setcadr
                endif
              end if
            enddo
            i_setshdr = i_recbytes*i_label
          end if
          i_err = closedk(i_unit)

        return

      end

      subroutine get_cubinfo(          a_setname,
     &     a_setfile,
     &     a_setproj,
     &     i_setunit,
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     a_setvnul,
     &     r_setrmlt,
     &     r_setradr,
     &     r_setcmlt,
     &     r_setcadr,
     &     r_setpegv,
     &     a_dspctbl,i_debug   )

c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
      character*200 a_setname   ! Parameter name
      character*200 a_setfile   ! Data filename
      character*200 a_setinfo   ! Header filename
      character*200 a_setproj   ! Projection name
      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setrmlt         ! Row Scale  for set
      real*4  r_setradr         ! Row Offset for set
      real*4  r_setcmlt         ! Column Scale  for set
      real*4  r_setcadr         ! Column Offset for set
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      character*16 a_setvnul    ! Invalid value
      real*4  r_setvavg         ! Average value in set
      real*4  r_setvstd         ! Standard deviation of values in set
      real*4  r_setpegv(3)      ! Peg Point
c     end structure

      character*200 a_dspctbl

        integer i
        integer i_err
        integer i_unit
        integer i_bytes
        integer i_debug

        integer i_recbytes
        integer i_label

        character*10000 a_string
        character*255 a_line
        character*255 a_key
        character*255 a_val
        character*255 a_object
        character*255 a_group

        integer      i_values
        character*20 a_values(20)

        integer i_band

        byte b_string(10000)

        real*8 r_pi
        real*8 r_rtod
        real*4 r_temp

        integer nread


        integer initdk
        external initdk

        integer closedk
        external closedk

#ifdef IO64
      integer*8 nseek

      integer*8 ioseek64
      external ioseek64

      integer*8 i_demoff
      integer*8 i_magoff
      integer*8 i_paroff
#else
      integer*4 nseek

      integer*4 ioseek
      external ioseek

      integer*4 i_demoff
      integer*4 i_magoff
      integer*4 i_paroff
#endif

        integer ioread
        external ioread


        integer rdflen
        external rdflen

        equivalence(a_string,b_string)

c
c  Initialize pi and conversions
c
        r_pi = 4.d0*atan(1.0d0)
        r_rtod = 180.0d0/r_pi


c          write(6,*) 'AIRSAR: ',a_setfile(1:60)
          i_unit = initdk(19,a_setfile)
c          write(6,*) 'i_unit=',i_unit
          i_demoff = 0
#ifdef IO64
          nseek   = ioseek64(i_unit,i_demoff,0)
c         write(6,*) 'nseek64=',nseek
#else
          nseek   = ioseek(i_unit,i_demoff,0)
c         write(6,*) 'nseek=',nseek
#endif
c          write(6,*) 'i_unit again = ',i_unit
          nread = ioread(i_unit,b_string(1),10000)

          if (a_string(1:12) .eq. 'CCSD3ZF00001') then

            if (a_setname .eq. ' ') a_setname = 'QUBE QUBE'

            i_demoff = -1
            i_magoff = -1
            i_paroff = -1

            i_bytes = 0

            write(6,*) ' '
            write(6,*) 'Reading CUB Label  ',index(a_string,char(10)),i_debug
            do while(index(a_string,char(10)) .gt. 0)
              a_line=a_string(1:index(a_string,char(10)))
              a_key = a_line(1:max(1,index(a_line,'=')-1))
              a_val = a_line(max(1,index(a_line,'=')+1):)
              if (index(a_val,char(13)) .gt. 1) a_val = a_val(1:index(a_val,char(13))-1)
              if (index(a_val,char(10)) .gt. 1) a_val = a_val(1:index(a_val,char(10))-1)

              if (i_debug .eq. -1001 .or. i_debug .ge. 1001) then
                write(6,*) 'length = ',rdflen(a_val)
                do i=1,rdflen(a_val)
                  write(6,*) i,' ',ichar(a_val(i:i)),' ',a_val(i:i)
                end do
              end if
              if (i_debug .eq. -13 .or. i_debug .ge. 13) write(6,*) 'a_line=',a_line(1:70)
              a_string=a_string(index(a_string,char(10))+1:)
              if (a_line .eq. ' ') then
                ! do nothing
              else if (a_key .eq. 'RECORD_BYTES') then
                read(a_val,*) i_recbytes
c                write(6,*) 'i_recbytes=',i_recbytes,'  ',a_val
c              else if (a_key .eq. 'LABEL_RECORDS') then
c                read(a_val,*) i_label
c                write(6,*) 'i_label=',i_label,'  ',a_val
              else if (a_key .eq. '^QUBE') then
                read(a_val,*) i_label
                i_label=i_label-1
c                write(6,*) 'i_label=',i_label,'  ',a_val
              else if (a_key .eq. 'OBJECT') then
c                write(6,*) 'a_val=',a_val(1:70)
                if (a_val .eq. ' QUBE') then
                  a_object = 'QUBE'
                else
                  a_object = 'UNKNOWN'
                end if
c                write(6,*) '  Object = ',a_object(1:30),i_setcols
              else if (a_key .eq. '  GROUP') then
c                write(6,*) 'a_val=',a_val(1:70)
                if (index(a_val,' IMAGE_MAP_PROJECTION') .gt. 0) then
                  a_group = 'IMAGE_MAP_PROJECTION'
                  a_setproj='EQA'
                  r_setpegv(1)=0.
                  r_setpegv(2)=0.
                  r_setpegv(3)=0.
                else
                  a_group = 'UNKNOWN'
                end if
c                write(6,*) '  Object = ',a_object(1:30),i_setcols
              else if (a_key .eq. 'END_OBJECT') then
                a_object = ' '
              else if (index(a_key,'END_GROUP') .gt. 0) then
                a_group = ' '
              else if (a_object .eq. 'QUBE') then
                if (a_key .eq. '  CORE_ITEMS') then
                  a_val=a_val(index(a_val,'(')+1:)
                  a_val=a_val(:index(a_val,')')-1)
                  call rdf_getfields(a_val,i_values,a_values)
                  read(a_values(1),*) i_setcols
                  read(a_values(2),*) i_setrows
                  read(a_values(3),*) i_band
                  if (i_band .ne. 1) write(6,*) 'Band error in Qube header ',i_band
                else if (a_key .eq. '  CORE_ITEM_BYTES') then
                  read(a_val,*) i_bytes
                else if (a_key .eq. '  CORE_ITEM_TYPE') then
c                  do i=1,25
c                    write(6,*) 'i/val=',i,ichar(a_line(32+i:32+i)),' ',a_line(32+i:32+i)
c                  end do
                  if (a_val .eq. ' ') then
                    ! do nothing
                  else if (a_val(1:19) .eq. ' UNSIGNED INTEGER') then
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    else if (i_bytes .eq. 1) then
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    else if (i_bytes .eq. 2) then
                      i_setvfmt = 8 ! 'val_frmt = BYTE*2'
                    else
                      i_setvfmt = 0 ! 'val_frmt = BYTE'
                    end if
                  else if (a_val(1:10) .eq. ' INTEGER') then
c                    write(6,*) 'INTEGER data detected ',i_bytes
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else if (i_bytes .eq. 1) then
                      i_setvfmt = 1 ! 'val_frmt = INTEGER*1'
                    else if (i_bytes .eq. 2) then
                      i_setvfmt = 2 ! 'val_frmt = INTEGER*2'
                    else if (i_bytes .eq. 4) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    end if
c                    write(6,*) 'i_setvfmt = ',i_setvfmt
                  else if (a_val(1:10) .eq. ' PC_REAL') then
                    i_setvend=-1
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 4) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 8) then
                      i_setvfmt = 5 ! 'val_frmt = REAL*8'
                    else
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    end if
                  else if (a_val(1:10) .eq. ' SUN_REAL') then
                    i_setvend=1
                    if (i_bytes .eq. 0) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 4) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    else if (i_bytes .eq. 8) then
                      i_setvfmt = 5 ! 'val_frmt = REAL*8'
                    else
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    end if
                  else if (a_val(1:10) .eq. ' COMPLEX') then
                    i_setvfmt = 6 ! 'val_frmt = Complex magnitude
                  end if
                else if (a_key .eq. '  SAMPLE_BITS') then
                  read(a_val,*) i_bytes
                  i_bytes = i_bytes/8
                  if (i_bytes .eq. 0) then
                    ! do nothing
                  else if (i_bytes .eq. 1) then
                      if (i_setvfmt .eq. 2 .or. i_setvfmt .eq. 3) then
                      i_setvfmt = 1 ! 'val_frmt = INTEGER*1'
                    else if (i_setvfmt .eq. 4 .or. i_setvfmt .eq. 5) then
                       ! do nothing
                    end if
                  else if (i_bytes .eq. 2) then
                    if (i_setvfmt .eq. 0) then
                      i_setvfmt = 8 ! 'val_frmt = BYTE*2'
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 3) then
                      i_setvfmt = 2 ! 'val_frmt = INTEGER*2'
                    else if (i_setvfmt .eq. 4 .or. i_setvfmt .eq. 5) then
                      ! do nothing
                    end if
                  else if (i_bytes .eq. 4) then
                    if (i_setvfmt .eq. 0 .or. i_setvfmt .eq. 8) then
                      ! do nothing
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 2) then
                      i_setvfmt = 3 ! 'val_frmt = INTEGER*4'
                    else if (i_setvfmt .eq. 5) then
                      i_setvfmt = 4 ! 'val_frmt = REAL*4'
                    end if
                  else if (i_bytes .eq. 8) then
                    if (i_setvfmt .eq. 0 .or. i_setvfmt .eq. 8) then
                      ! do nothing
                    else if (i_setvfmt .eq. 1 .or. i_setvfmt .eq. 2 .or. i_setvfmt .eq. 3) then
                      ! do nothing
                    else if (i_setvfmt .eq. 4) then
                      i_setvfmt = 5 ! 'val_frmt = REAL*4'
                    end if
                  end if
                else if (a_group .eq. 'IMAGE_MAP_PROJECTION') then
                  if (index(a_key,'MAP_SCALE') .gt. 0) then
                    read(a_val,*) r_setrmlt
                    read(a_val,*) r_setcmlt
                  else if (index(a_key,'LINE_PROJECTION_OFFSET') .gt. 0) then
                    read(a_val,*) r_setradr
                  else if (index(a_key,'SAMPLE_PROJECTION_OFFSET') .gt. 0) then
                    read(a_val,*) r_setcadr
                  endif
                end if
              end if
            enddo
            i_setshdr = i_recbytes*i_label
          end if
          i_err = closedk(i_unit)

        return

      end


****************************************************************
      subroutine get_setinfo(          a_setname,
     &     a_setinfo,
     &     a_setproj,
     &     i_setunit,
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     a_setvnul,
     &     r_setrmlt,
     &     r_setradr,
     &     r_setcmlt,
     &     r_setcadr,
     &     r_setpegv,
     &     r_dspaddr,
     &     r_dspmult,
     &     r_dspwrap,
     &     r_dspexpn,
     &     r_dspcplw,
     &     r_dspcphi,
     &     r_dspval1,
     &     r_dspval2,
     &     r_dspval3,
     &     i_dspmode,
     &     i_dspaddr,
     &     i_dspmult,
     &     i_dspmixv,
     &     i_dspdvdc,
     &     a_dspctbl   )

      implicit none

c     INPUT VARIABLES:

c     OUTPUT VARIABLES:

c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
      character*200 a_setname   ! Parameter name
      character*200 a_setfile   ! Data filename
      character*200 a_setinfo   ! Header filename
      character*200 a_setproj   ! Projection name
      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setrmlt         ! Row Scale  for set
      real*4  r_setradr         ! Row Offset for set
      real*4  r_setcmlt         ! Column Scale  for set
      real*4  r_setcadr         ! Column Offset for set
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      character*16 a_setvnul    ! Invalid value
      real*4  r_setvavg         ! Average value in set
      real*4  r_setvstd         ! Standard deviation of values in set
      real*4  r_setpegv(3)      ! Peg Point
c     end structure

c     structure / dspinfo / s_dsp
          character*200 a_dspctbl ! Color table file
          integer i_dspcnt
          integer i_dspchnl         ! Number of sets to display
          integer i_dspaddr ! Add  auto Scale flag
          integer i_dspmult ! Mult auto Scale flag
          integer i_dspmixv ! Method to mix set (add, multiply, max, avg)
          integer i_dspnumt ! Number of entries in color table
          integer i_dspmode
          integer i_dspdvdc
          integer i_dspactv(0:5)
c          real*4  r_dspredt(0:255) ! Values of red color table
c          real*4  r_dspgrnt(0:255) ! Values of green color table
c          real*4  r_dspblut(0:255) ! Values of blue color table
          real*4  r_dspcplw ! Discard if below value
          real*4  r_dspcphi ! Discard if above value
          real*4  r_dspexpn ! Exponent to raise data
          real*4  r_dspaddr ! Shift data by value
          real*4  r_dspwrap ! Wrap data by value
          real*4  r_dspmult ! Multiply data by value
          real*4  r_dspvmin ! Min value to display
          real*4  r_dspvmax ! Max value to display
          real*4  r_dspval1
          real*4  r_dspval2
          real*4  r_dspval3
c     end structure

c     LOCAL VARIABLES:

      integer*4 i
      integer*4 j
      integer*4 i_cnt
      integer*4 i_oper
      integer*4 i_set
      integer*4 i_stat
      integer*4 i_flg
      integer*4 i_indx

      character*255 a_tmp
      character*255 a_set
      character*255 a_key
      character*255 a_keyword
      character*255 a_valword
      character*255 a_value

c     FUNCTION STATEMENTS:

      character*320 rdfdata
      external rdfdata

      integer rdflen
      external rdflen

      integer rdfnum
      external rdfnum

      integer rdferr
      external rdferr

      integer rdfmap
      external rdfmap

      character*320 rdfdimn
      external rdfdimn

      character*320 rdfvalu
      external rdfvalu

      character*320 rdfunit
      external rdfunit

      character*320 rdfcmnt
      external rdfcmnt

      character*320 rdfelem
      external rdfelem

      character*320 rdfoper
      external rdfoper

      character*320 rdfint
      external rdfint

      character*320 rdfreal
      external rdfreal

      character*320 rdfdble
      external rdfdble

      character*40 rdflower
      external rdflower

      character*50 rdfversion
      external rdfversion

      integer*4 i_CnvrtFmt
      external i_CnvrtFmt

      call rdf_init('ERROR_SCREEN=OFF')

c     write(6,*) ' '
c     write(6,*) rdfversion()
c     write(6,*) ' '
c     write(6,*) ' '

      call rdf_clear()
      call rdf_read(a_setinfo)
      call rdf_init('ERROR_SCREEN=ON')


      if (a_setname .ne. ' ') then
         a_key = a_setname(1:rdflen(a_setname))//'.'
      else
         a_key = ' '
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_name',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_name','&')
         if (a_value .ne. ' ') a_setname = a_value
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_rows',i_indx
     &     ,i_flg)
c     type *,a_key(1:max(1,rdflen(a_key)))//'set_rows:',i_indx,i_flg
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_rows'
     &        ,'pixels')
         if (a_value .ne. ' ')  read(unit=a_value,fmt='(i10)') i_setrows
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_cols',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_cols'
     &        ,'pixels')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setcols !@#&%  change fmt
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_hddr',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_hddr'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setshdr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_tail',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_tail'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setstlr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'row_hddr',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'row_hddr'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setrhdr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'row_tail',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'row_tail'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setrtlr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'col_hddr',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'col_hddr'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setchdr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'col_tail',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'col_tail'
     &        ,'bytes')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(i10)') i_setctlr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_endi',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_endi'
     &        ,'bytes')
         if (a_value .eq. ' ') then
           ! do nothing
         else if (rdflower(a_value) .eq. 'little endian') then
            i_setvend = -1
         else if (rdflower(a_value) .eq. 'little_endian') then
            i_setvend = -1
         else if (rdflower(a_value) .eq. 'big endian'   ) then
            i_setvend = 1
         else if (rdflower(a_value) .eq. 'big_endian'   ) then
            i_setvend = 1
         else if (rdflower(a_value) .eq. 'byte swap'    ) then
            i_setvend = -i_setvend
         else if (rdflower(a_value) .eq. 'byte_swap'    ) then
            i_setvend = -i_setvend
         end if
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_frmt',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_frmt','&')
         if (a_value .ne. ' ') i_setvfmt = i_CnvrtFmt(a_value)
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'row_mult',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'row_mult',' ')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)')
     &        r_setrmlt
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'row_addr',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'row_addr',' ')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)')
     &        r_setradr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'col_mult',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'col_mult',' ')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)')
     &        r_setcmlt
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'col_addr',i_indx
     &     ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'col_addr',' ')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)')
     &        r_setcadr
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_mult',i_indx ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_mult',' ')
c         write(6,*) 'val_mult=',a_value
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setvmlt
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_addr',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_addr',' ')
         if (index(a_value,'.') .eq. 0) a_value=a_value(1:max(1,rdflen(a_value)))//'.'
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setvadr
c         write(6,*) 'r_setvadr=',a_value
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_minv',i_indx ,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_minv',' ')
         if (index(a_value,'.') .eq. 0) a_value=a_value(1:max(1,rdflen(a_value)))//'.'
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setvmin
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_maxv',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_maxv',' ')
         if (index(a_value,'.') .eq. 0) a_value=a_value(1:max(1,rdflen(a_value)))//'.'
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)')r_setvmax
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'val_null',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'val_null',' ')
         if (a_value .ne. ' ') a_setvnul = a_value
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_plat',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_plat','rad')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setpegv(1)
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_plon',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_plon','rad')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setpegv(2)
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_phdg',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_phdg','rad')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_setpegv(3)
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_pegv',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfdata(a_key(1:max(1,rdflen(a_key)))//'set_phdg','rad')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(3f15.4)') r_setpegv
      end if
      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'set_proj',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_setproj=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'set_proj')
      end if


      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_cmap',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_dspctbl=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_cmap')
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_mode',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_mode')
c         write(6,*) 'Mode = ','*'//a_value//'*'
         if (a_value .eq. ' ') then
           ! do nothing
         else if (rdflower(a_value) .eq. 'range') then
           i_dspmode = 1
c           write(6,*) 'setting mode to 1'
         else if (rdflower(a_value) .eq. 'sdev') then
           i_dspmode = 2
         else if (rdflower(a_value) .eq. 'per' .or. rdflower(a_value) .eq. 'percent') then
           i_dspmode = 3
         else if (rdflower(a_value) .eq. 'norm' .or. rdflower(a_value) .eq. 'normal') then
           i_dspmode = 4
         else if (rdflower(a_value) .eq. 'cw' .or. rdflower(a_value) .eq. 'charlie') then
           i_dspmode = 5
         else if (rdflower(a_value) .eq. 'wrap') then
           i_dspmode = 6
         end if
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_wrap',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_wrap')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspwrap
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_addr',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_addr')
         if (a_value .ne. ' ') i_dspaddr=0
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspaddr
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_mult',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_mult')
         if (a_value .ne. ' ') i_dspmult=0
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspmult
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_fact',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_fact')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspval1
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_expn',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_expn')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspexpn
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_expn',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_expn')
         if (a_value .ne. ' ') read(unit=a_value,fmt='(f15.4)') r_dspexpn
      end if

      call rdf_index(a_key(1:max(1,rdflen(a_key)))//'dsp_dvdc',i_indx,i_flg)
      if (i_flg .eq. 1) then
         a_value=rdfvalu(a_key(1:max(1,rdflen(a_key)))//'dsp_dvdc')
         if (rdflower(a_value) .eq. 'y' .or. rdflower(a_value) .eq. 'yes' .or.
     &       rdflower(a_value) .eq. 't' .or. rdflower(a_value) .eq. 'true' .or.
     &       a_value .eq. '1') then
           i_dspdvdc=1
         else
           i_dspdvdc=0
         end if
      end if

      return
      end


****************************************************************
      subroutine put_setinfo(          a_setname,
     &     a_setinfo,
     &     a_setproj,
     &     i_setunit,
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     a_setvnul,
     &     r_setrmlt,
     &     r_setradr,
     &     r_setcmlt,
     &     r_setcadr,
     &     r_setpegv   )

      implicit none

c     INPUT VARIABLES:

c     OUTPUT VARIABLES:

c     structure / set_structure / s_set(-I_FMAX:I_CMAX)
      character*200 a_setname   ! Parameter name
      character*200 a_setfile   ! Data filename
      character*200 a_setinfo   ! Header filename
      character*200 a_setproj   ! Projection name
      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setrmlt         ! Row Scale  for set
      real*4  r_setradr         ! Row Offset for set
      real*4  r_setcmlt         ! Column Scale  for set
      real*4  r_setcadr         ! Column Offset for set
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      character*16 a_setvnul    ! Invalid value
      real*4  r_setvavg         ! Average value in set
      real*4  r_setvstd         ! Standard deviation of values in set
      real*4  r_setpegv(3)      ! Peg Point
c     end structure


c     LOCAL VARIABLES:

      integer*4 i
      integer*4 j
      integer*4 i_cnt
      integer*4 i_oper
      integer*4 i_set
      integer*4 i_stat
      integer*4 i_flg
      integer*4 i_indx

      character*255 a_tmp
      character*255 a_set
      character*255 a_key
      character*255 a_keyword
      character*255 a_valword
      character*255 a_value

      character*255 a_data

c     FUNCTION STATEMENTS:

      integer rdflen
      external rdflen

      integer rdfnum
      external rdfnum

      integer rdferr
      external rdferr

      integer rdfmap
      external rdfmap

      integer*4 i_CnvrtFmt
      external i_CnvrtFmt

      call rdf_init(' ')

      call rdf_clear()

      write(a_data,'(a,a)') 'set_name =',a_setname
      call rdf_append(a_data)
      write(6,*) 'set_rows = ',i_setrows
      write(a_data,fmt=*) 'set_rows =',i_setrows
      write(6,*) 'a_data=',a_data
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_cols =',i_setcols
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_hddr =',i_setshdr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_tail =',i_setstlr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'row_hddr =',i_setrhdr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'row_tail =',i_setrtlr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'col_hddr =',i_setchdr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'col_tail =',i_setctlr
      call rdf_append(a_data)
      if (i_setvend .eq. -1) then
        write(a_data,fmt=*) 'val_endi = LITTLE ENDIAN'
      else
        write(a_data,fmt=*) 'val_endi = BIG ENDIAN'
      end if
      call rdf_append(a_data)
      If (i_setvfmt .eq. -1) then
        ! do nothing
      else if (i_setvfmt .eq. 0) then
        write(a_data,fmt=*) 'val_frmt = BYTE'
      else if (i_setvfmt .eq. 1) then
        write(a_data,fmt=*) 'val_frmt = INTEGER*1'
      else if (i_setvfmt .eq. 2) then
        write(a_data,fmt=*) 'val_frmt = INTEGER*2'
      else if (i_setvfmt .eq. 3) then
        write(a_data,fmt=*) 'val_frmt = INTEGER*4'
      else if (i_setvfmt .eq. 4) then
        write(a_data,fmt=*) 'val_frmt = REAL*4'
      else if (i_setvfmt .eq. 5) then
        write(a_data,fmt=*) 'val_frmt = REAL*8'
      else if (i_setvfmt .eq. 6) then
        write(a_data,fmt=*) 'val_frmt = COMPLEX_MAGNITUDE'
      else if (i_setvfmt .eq. 7) then
        write(a_data,fmt=*) 'val_frmt = COMPLEX_PHASE'
      else if (i_setvfmt .eq. 8) then
        write(a_data,fmt=*) 'val_frmt = BYTE*2'
      else if (i_setvfmt .eq. 9) then
        write(a_data,fmt=*) 'val_frmt = COMPRESSED_STOKES'
      else if (i_setvfmt .eq. 10) then
        write(a_data,fmt=*) 'val_frmt = COMPLEX*2_MAGNITUDE'
      else if (i_setvfmt .eq. 11) then
        write(a_data,fmt=*) 'val_frmt = COMPLEX*2_PHASE'
      else if (i_setvfmt .eq. 12) then
        write(a_data,fmt=*) 'val_frmt = REAL*4_MAGNITUDE'
      else
        write(6,*) 'ERROR IN PUT_SETINFO'
      end if
      call rdf_append(a_data)
      write(a_data,fmt=*) 'row_mult =',r_setrmlt
      call rdf_append(a_data)
      write(a_data,fmt=*) 'row_addr =',r_setradr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'col_mult =',r_setcmlt
      call rdf_append(a_data)
      write(a_data,fmt=*) 'col_addr =',r_setcadr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'val_mult =',r_setvmlt
      call rdf_append(a_data)
      write(a_data,fmt=*) 'val_addr =',r_setvadr
      call rdf_append(a_data)
      write(a_data,fmt=*) 'val_minv =',r_setvmin
      call rdf_append(a_data)
      write(a_data,fmt=*) 'val_maxv =',r_setvmax
      call rdf_append(a_data)
      write(a_data,'(a,a)') 'val_null =',a_setvnul
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_plat =',r_setpegv(1)
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_plon =',r_setpegv(2)
      call rdf_append(a_data)
      write(a_data,fmt=*) 'set_phdg =',r_setpegv(3)
      call rdf_append(a_data)
      write(a_data,'(a,a)') 'set_proj =',a_setproj
      call rdf_append(a_data)

      call rdf_write(a_setinfo)
      return
      end

      integer function i_CnvrtFmt(a_fmt)

      implicit none

      character*(*) a_fmt
      integer i_fmt

      character*20 rdfupper
      external rdfupper

      if (a_fmt .eq. ' ') then
         i_fmt = -1
      else if (rdfupper(a_fmt) .eq. 'BYTE*1' .or. a_fmt .eq. 'BYTE') then
         i_fmt = 0
      else if (rdfupper(a_fmt) .eq. 'INTEGER*1') then
         i_fmt = 1
      else if (rdfupper(a_fmt) .eq. 'INTEGER*2') then
         i_fmt = 2
      else if (rdfupper(a_fmt) .eq. 'INTEGER*4') then
         i_fmt = 3
      else if (rdfupper(a_fmt) .eq. 'REAL*4') then
         i_fmt = 4
      else if (rdfupper(a_fmt) .eq. 'REAL*8') then
         i_fmt = 5
      else if (rdfupper(a_fmt) .eq. 'COMPLEX_MAGNITUDE' .or. rdfupper(a_fmt) .eq. 'COMPLEX*8_MAGNITUDE') then
         i_fmt = 6
      else if (rdfupper(a_fmt) .eq. 'COMPLEX_PHASE' .or. rdfupper(a_fmt) .eq. 'COMPLEX*8_PHASE') then
         i_fmt = 7
      else if (rdfupper(a_fmt) .eq. 'BYTE*2') then
         i_fmt = 8
      else if (rdfupper(a_fmt) .eq. 'COMPRESSED_STOKES' .or. a_fmt .eq. 'STOKES11') then
         i_fmt = 9
      else if (rdfupper(a_fmt) .eq. 'COMPLEX*2_MAGNITUDE') then
         i_fmt = 10
      else if (rdfupper(a_fmt) .eq. 'COMPLEX*2_PHASE') then
         i_fmt = 11
      else if (rdfupper(a_fmt) .eq. 'COMPLEX*4_MAGNITUDE') then
         i_fmt = 12
      else if (rdfupper(a_fmt) .eq. 'COMPLEX*4_PHASE') then
         i_fmt = 13
      else if (rdfupper(a_fmt) .eq. 'REAL*4_MAGNITUDE') then
         i_fmt = 14
      else
         i_fmt = -1
      endif
      i_CnvrtFmt = i_fmt
      end

      subroutine write_greeting()

      implicit none

        write(6,*) ' '
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) 'Usage: mdx file1 '
        write(6,*) '       mdx file1 -x xval -y yval '
        write(6,*) '       mdx file1 -x xval -y yval file2 -zval '
        write(6,*) '       mdx file1 -set setname1 -x xval -y yval -set setname2 -z zval '
        write(6,*) '       mdx file1 -x xval -set setname1 -y yval -set setname2 -z zval'
        write(6,*) ' '
        write(6,*) 'Rules for using flags:'
        write(6,*) ' '
        write(6,*) '   Flags specified before the first filename are used as default for '
        write(6,*) '      all following files.'
        write(6,*) '   Flags specified after a filename but before any set names are used '
        write(6,*) '      as the default for all the sets in that file.'
        write(6,*) '   Flags specified after a set name only apply to that set.'
        write(6,*) '   In general, flags that are capitalized don''t require an argument,'
        write(6,*) '      flags in lower case do.'
        write(6,*) ' '
        write(6,*) 'Unobvious features:'
        write(6,*) ' '
        write(6,*) '  To activate one desired set, left-click on that sets selector button'
        write(6,*) ' '
        write(6,*) '  To toggle a set on or off, middle-click on that sets selector button'
        write(6,*) ' '
        write(6,*) '  To bring up a menu of set parameters, right-click on the set selector button'
        write(6,*) ' '
        write(6,*) '  To get an xmgrace display of a sets color bar, hold the shift key and click '
        write(6,*) '   on the set selector button '
        write(6,*) ' '
        write(6,*) '  To center the display on a pixel that isnt currently visible, click on the location'
        write(6,*) '   bar just above the image and enter the pixel row/column when asked'
        write(6,*) ' '
        write(6,*) '  To center the display on a latitude/longitude, hold the shift key down and click on '
        write(6,*) '   the locationbar just above the image and enter the lat/long when asked'
        write(6,*) ' '
        write(6,*) '  To center the display on a particular visable pixel, middle-click on that pixel'
        write(6,*) ' '
        write(6,*) '  To center other displays on a particular visable pixel, hold the shift key down'
        write(6,*) '   and middle-click on that pixel'
        write(6,*) ' '
        write(6,*) 'Flags:'
        write(6,*) ' '
        write(6,*) '-cols, -columns, -s, or -samples    = Number of samples per line'
        write(6,*) '-rows, -l, or -lines                = Number of lines in file'
        write(6,*) '-shdr  =  Size of Header (in bytes) at top of file'
        write(6,*) '-rhdr  =  Size of header (in bytes) at start of each line'
        write(6,*) '-chdr  =  Size of header (in bytes) at start of each sample'
        write(6,*) '-stlr  =  Size of trailer (in bytes at the end of each set'
        write(6,*) '-rtlr  =  Size of trailer (in bytes) at the end of each line'
        write(6,*) '-ctlr  =  Size of trailer (in bytes) at the end of each sample'
        write(6,*) '-rmlt  =  Multiplier to convert image row number to an engineering unit'
        write(6,*) '-radr  =  Offset to convert image row number to an engineering unit'
        write(6,*) '-cmlt  =  Multiplier to convert image column number to an engineering unit'
        write(6,*) '-cadr  =  Offset to convert image column number to an engineering unit'
        write(6,*) '-vmlt  =  Multiplier to convert image data to an engineering unit'
        write(6,*) '-vadr  =  Offset to convert image data to an engineering unit'
        write(6,*) '-plat  =  Peg Latitude'
        write(6,*) '-plon  =  Peg Longitude'
        write(6,*) '-phdr  =  Peg heading'
        write(6,*) '-proj  =  Projection name'
        write(6,*) ' '
        write(6,*) '-min, -vmin, or -minval  =  Minimum valid value (in engineering units)'
        write(6,*) '-max, -vmax, or -maxval  =  Maximum valid value (in engineering units)'
        write(6,*) ' '
        write(6,*) '-e, -exp = Exponent that data is raised to after scaling between 0 and 1'
        write(6,*) '-addr, -a, or -daddr  = Offset to shift color table in display'
        write(6,*) '-mult, -m, or -dmult  = Scaler to stretch color table in display'
        write(6,*) '-cws, -cw, -charlie   = Scale factor in CW mode'
        write(6,*) '-wrap, or -d          = Wrap value for display'
        write(6,*) '-fact, or -f          = Sets number of standard deviations to display across color table'
        write(6,*) '-per, percent, or -p  = percent of data that is clipped in the display'
        write(6,*) '-clpmin, or -minclp   = Minimum value before clipping during display'
        write(6,*) '-clpmax, or -maxclp   = Maximum value before clipping during display'
        write(6,*) ' '
        write(6,*) '-row    = row of display center on startup'
        write(6,*) '-col    = column of display center on startup'
        write(6,*) '-lat    = latitude of display center on startup'
        write(6,*) '-lon    = longitude of display center on startup'
        write(6,*) ' '
        write(6,*) '-active  = The following 1s and 0s set the on/off status of the sets at startup'
        write(6,*) '-z, or -zoom  =  Initial zoom of display'
        write(6,*) '-pz, or -pzoom  =  Zoom factor for printing to file'
        write(6,*) '-vx =  x dimension of initial display window'
        write(6,*) '-vy =  y dimension of initial display window'
        write(6,*) '-mix  =  Sets how to combine sets +, x are options'
        write(6,*) '-cmap, or -ctable  =  Name of color table to use'
        write(6,*) '-nc, -null_color, or -cnull  =  RGB color value to use for null data'
        write(6,*) '-emod  =  Number of rows to read before checking if window update (def=10)'
        write(6,*) '-debug =  Sets debug level (def=2) '
        write(6,*) '-workdir = working directory for out.ppm '
        write(6,*) '-colordir = default directory for color tables'
        write(6,*) ' '
        write(6,*) '-h        = Specifies header file name'
        write(6,*) '-maghdr   = Name of .hdr file to be used for a magnitude file (must be after set name)'
        write(6,*) '-dtehdr   = Name of .hdr file to be used for a height file (must be after set name)'
        write(6,*) '-pts or -points  = Filename of input selection points to overlay on display'
        write(6,*) ' '
        write(6,*) '-pcpad     = Number of pixel in column direction to reduce print size by'
        write(6,*) '-prpad     = Number of pixel in row direction to reduce print size by'
        write(6,*) ' '
        write(6,*) '-col, -cpos or -c   =  jump to specified column at start up'
        write(6,*) '-row, -rpos or -r   =  jump to specified row at start up'
        write(6,*) '-lat, or -latitude  =  jump to specified latitude at start up'
        write(6,*) '-lon, or -longitude =  jump to specified longitude at start up'
        write(6,*) ' '
        write(6,*) 'Display Mode Stuff '
        write(6,*) '-STD  = Sets display scaling to Standard deviation mode with factor at 2'
        write(6,*) '-PER  = Sets display scaling to Percentage mode with percent set to 90%'
        write(6,*) '-CW   = Sets display scaling to Charlie Warner mode with factor at 1'
        write(6,*) '-WRAP = Sets display scaling to wrap mode with a modules of Pi'
        write(6,*) '-ON   = Turns set on at startup (default)'
        write(6,*) '-OFF  = Turns set off at startup'
        write(6,*) ' '
        write(6,*) '-P, -ponly = No display, only create ppm file of sets'
        write(6,*) '-D, -dvdc, -dc, -dx or -slope = Slope of channel in column direction'
        write(6,*) '-LE, -le, -little = little endian'
        write(6,*) '-BE, -be, -big    = big endian'
        write(6,*) '-BS, -bs, -bswap  = byte swapped from default machine format'
        write(6,*) '-NM               = turns off main menu'
        write(6,*) '-C   -CLOSE       = enables close button in bottom right corner'
        write(6,*) '-NC  -NOCLOSE     = disables close button in bottom right corner'
        write(6,*) ' '
        write(6,*) 'File definition shortcuts '
        write(6,*) '-b1, or -byte       =  Unsigned byte file'
        write(6,*) '-b2, or -byte2      =  Unsigned 2-byte integer file'
        write(6,*) '-i1, or -integer*1  =  Signed byte file'
        write(6,*) '-i2, or -integer*2  =  Signed 2-byte integer file'
        write(6,*) '-i4, or -integer*4  =  Signed 4-byte integer file'
        write(6,*) '-r4, or -real*4     =  IEEE 4-byte Float file'
        write(6,*) '-c2, or -complex*2  =  Complex*2  (mag and phase sets)'
        write(6,*) '-c8, or -complex*8  =  Complex*8  (mag and phase sets)'
        write(6,*) '-c8mag, or -cmag    =  Magnitude portion of a c8 file only'
        write(6,*) '-c8pha, or -cpha    =  Phase portion of a c8 file only'
        write(6,*) '-c2mag              =  Magnitude portion of a c2 file only'
        write(6,*) '-c2pha,             =  Phase portion of a c2 file only'
        write(6,*) '-rmg                =  RMG file (mag and dte sets)'
        write(6,*) '-vfmt or -val_frmt  =  Character string indicating format (i.e. real*4)'
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) 'Please forward any comments or suggestions '
        write(6,*) 'regarding mdx to:  Scott.Shaffer@jpl.nasa.gov    '
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) ' '
        write(6,*) ' '
      return
      end

      subroutine readdat(i_setunit,   ! This version uses ioseek/read
     &     i_setrows,
     &     i_setcols,
     &     i_setshdr,
     &     i_setstlr,
     &     i_setrhdr,
     &     i_setrtlr,
     &     i_setchdr,
     &     i_setctlr,
     &     i_setvend,
     &     i_setvfmt,
     &     r_setvmlt,
     &     r_setvadr,
     &     r_setvmin,
     &     r_setvmax,
     &     b_setvnul,
     &     i_row,i_col,i_num,r_data,i_data,readfunc,i_err)

      implicit none

      integer i
      integer i_err
      integer i_num
      integer i_row
      integer i_col
      integer i_pos

      integer i_ll
      integer i_hh


      integer i_colsize
      integer i_rowsize

      integer i_setunit         ! Unit number to read set
      integer i_setrows         ! Number of rows in set
      integer i_setcols         ! Number of columns in set
      integer i_setshdr         ! Number of bytes in set header
      integer i_setstlr         ! Number of bytes in set trailer
      integer i_setrhdr         ! Number of bytes in row header
      integer i_setrtlr         ! Number of bytes in row trailer
      integer i_setchdr         ! Number of bytes in column header
      integer i_setctlr         ! Number of bytes in column trailer
      integer i_setvend         ! Endian flag
      integer i_setvfmt         ! Method to decode columns
      real*4  r_setvmlt         ! Value Scale  for set
      real*4  r_setvadr         ! Value Offset for set
      real*4  r_setvmin         ! Minimum valid value
      real*4  r_setvmax         ! Maximum valid value
      byte    b_setvnul(0:16)   ! Invalid value

      integer i_numxx

      integer nread
      integer ioread
      external ioread

#ifdef IO64
      integer*8 i_strtc
      integer*8 i_stopc
      integer*8 nseek

      integer*8 ioseek64
      external ioseek64

      integer*8 i_eight
      external i_eight

      integer*8 readfunc
      external readfunc
#else
      integer*4 i_strtc
      integer*4 i_stopc
      integer*4 nseek

      integer*4 ioseek
      external ioseek

      integer*4 readfunc
      external readfunc
#endif

      real*4 r_cnvrtdat
      external r_cnvrtdat

      real r_data(0:i_num-1)
      integer i_data(0:i_num-1)
      byte b_data(0:400000)

      real r_data2(0:100000)
      integer i_data2(0:100000)

      integer i_checknul
      external i_checknul

      integer i_setvbyt
      external i_setvbyt

      byte b_tmp(4)
      real*4 r_tmp
      equivalence(b_tmp,r_tmp)

      if (i_num .gt. 100000) stop 'Error - i_num too big in readdat'

      if (i_row .ge. 0 .and. i_row .lt. i_setrows .and.
     &     i_col+i_num-1 .ge. 0 .and. i_col .lt. i_setcols) then
         i_colsize = i_setchdr + i_setctlr + i_setvbyt(i_setvfmt)
         i_rowsize = i_setrhdr + i_setrtlr + i_colsize*i_setcols
c     write(6,*) 'i_colsize=',i_colsize
c     write(6,*) 'i_rowsize=',i_rowsize

#ifdef IO64
         i_strtc = i_setshdr + i_setrhdr + i_setchdr + (i_row)*i_eight(i_rowsize)
     &                + (max(0,i_col*i_colsize))
         i_stopc = i_strtc + min(i_num,i_setcols-i_col)*i_colsize
         if (i_setunit .gt. 0) then
           nseek   = ioseek64(i_setunit,i_strtc,0)
           if (nseek .ne. i_strtc) write(6,*) 'nseek<>i_strtc ',nseek,i_strtc

           i_numxx = i_stopc - i_strtc
           nread = ioread(i_setunit,b_data(max(0,-i_colsize*i_col)),i_numxx)
         else
           i_numxx = i_stopc - i_strtc
           nread = readfunc(0,-i_setunit,i_strtc,i_numxx,b_data(max(0,-i_colsize*i_col)))

         end if
#else
         i_strtc = i_setshdr + i_setrhdr + i_setchdr + (i_row)*(i_rowsize)
     &                + (max(0,i_col*i_colsize))
         i_stopc = i_strtc + min(i_num,i_setcols-i_col)*i_colsize
         if (i_setunit .gt. 0) then
           nseek   = ioseek(i_setunit,i_strtc,0)
           if (nseek .ne. i_strtc) write(6,*) 'nseek<>i_strtc ',nseek,i_strtc

           i_numxx = i_stopc - i_strtc
           nread = ioread(i_setunit,b_data(max(0,-i_colsize*i_col)),i_numxx)
         else
           i_numxx = i_stopc - i_strtc
           nread = readfunc(0,-i_setunit,i_strtc,i_numxx,b_data(max(0,-i_colsize*i_col)))

         end if
#endif
         if (nread .ne. i_numxx) write(6,*) 'nread<>i_numxx ',nread,i_numxx

         do i = 0, i_num-1
            if (i+i_col .ge. 0 .and. i+i_col .lt. i_setcols) then
               i_pos = i*i_colsize
               if (i_checknul(i_setvbyt(i_setvfmt),b_data(i_pos),b_setvnul) .eq. 0) ! Data not flagged as bad
     &              then
                  r_data(i) = r_cnvrtdat(i_setvfmt,i_setvend,b_data(i_pos))
                  if (r_data(i) .eq. r_data(i)) then                                ! Check if valid number
                    r_data(i) = r_setvmlt*r_data(i)+r_setvadr
                    i_data(i) = 0
                    if (r_setvmax .gt. r_setvmin) then ! check for bad data outside range
                       if (r_data(i) .lt. r_setvmin .or. r_data(i) .gt. r_setvmax) then   ! bad data
                          i_data(i) = 1
                       end if
                    else  ! Check for bad data within range
                       if (r_data(i) .le. r_setvmin .and. r_data(i) .ge. r_setvmax) then ! bad data
                          i_data(i) = 1
                       end if
                    end if
                  else              ! NaN or something
                    i_data(i) = 5
                  end if
               else
                  r_data(i) = 0
                  i_data(i) = 2
               end if
            else
               r_data(i) = 0
               i_data(i) = 3
            end if
c     write(6,*) 'r_data=',r_data(i),i,i_row,i_col,i_strtc,i_numxx
         end do
         if (i_setvfmt .lt. 0) then
           do i = 0, i_num-1
             r_data2(i) = r_data(i)
             i_data2(i) = i_data(i)
           end do
           do i = 0, i_num-1
             i_ll=max(0,i-1)
             i_hh=min(i_num-1,i+1)
             if (i_data2(i_ll) .eq. 0 .and. i_data2(i_hh) .eq. 0) then
               i_data(i)=0
               r_data(i)=(r_data2(i_hh)-r_data2(i_ll))/(i_hh-i_ll)
             else
               i_data(i)=1
               r_data(i)=0
             end if
           end do
         end if
      else
         do i=0,i_num-1
            r_data(i) = 0
            i_data(i) = 3
         end do
      end if
      return
      end

#ifdef IO64
      integer*8 function i_eight(i_value4)

        implicit none

        integer*4 i_value4

        i_eight=i_value4

        return

      end
#else
      integer*4 function i_eight(i_value4)

        implicit none

        integer*4 i_value4

        i_eight=i_value4

        return

      end
#endif

      real*4 function r_cnvrtdat(i_fmt,i_end,b_data)

      implicit none

      integer*4 i
      integer*4 i_fmt
      integer*4 i_end
      byte b_data(16)

      byte      b_value(16)
      integer*2 i_value2(8)
      integer*4 i_value4(4)
      real*4    r_value4(4)
      real*8    r_value8(2)
      real*4    r_val

      real*8    r_realval
      real*8    r_imagval
      equivalence(b_value,i_value2)
      equivalence(b_value,i_value4)
      equivalence(b_value,r_value4)
      equivalence(b_value,r_value8)

      r_val=0
      goto (10,20,30,40,50,60,70,80,90,100,110,120,130,140,150), abs(i_fmt)+1
         stop 'Format not recognized in r_cnvrtdat'

10    continue ! byte
         r_val = b_data(1)
         if (r_val .lt. 0.) r_val = r_val + 256
      goto 200

20    continue ! integer*1
         r_val = b_data(1)
         if (r_val .gt. 127.) r_val = r_val - 256
      goto 200

30    continue ! integer*2
         if (i_end .gt. 0) then
           b_value(1) = b_data(1)
           b_value(2) = b_data(2)
         else
           b_value(1) = b_data(2)
           b_value(2) = b_data(1)
         end if
         r_val = i_value2(1)
      goto 200

40    continue ! integer*4
         if (i_end .gt. 0) then
           b_value(1) = b_data(1)
           b_value(2) = b_data(2)
           b_value(3) = b_data(3)
           b_value(4) = b_data(4)
         else
           b_value(1) = b_data(4)
           b_value(2) = b_data(3)
           b_value(3) = b_data(2)
           b_value(4) = b_data(1)
         end if
         r_val = i_value4(1)
      goto 200

50    continue ! Real*4
         if (i_end .gt. 0) then
           b_value(1) = b_data(1)
           b_value(2) = b_data(2)
           b_value(3) = b_data(3)
           b_value(4) = b_data(4)
         else
           b_value(1) = b_data(4)
           b_value(2) = b_data(3)
           b_value(3) = b_data(2)
           b_value(4) = b_data(1)
         end if
         r_val = r_value4(1)
      goto 200

60    continue ! Real*8
         if (i_end .gt. 0) then
           do i=1,8
              b_value(i) = b_data(i)
           end do
         else
           do i=1,8
             b_value(i) = b_data(9-i)
           end do
         end if
         r_val = r_value8(1)
      goto 200

70    continue ! Complex*8 Magnitude
         if (i_end .gt. 0) then
            do i=1,8
               b_value(i) = b_data(i)
            end do
         else
            do i=1,4
               b_value(i) = b_data(5-i)
               b_value(4+i) = b_data(9-i)
            end do
         end if
         r_realval = r_value4(1)
         r_imagval = r_value4(2)
         r_val = sqrt(r_realval**2+r_imagval**2)
      goto 200

80    continue ! Complex*8 Phase
         if (i_end .gt. 0) then
            do i=1,8
               b_value(i) = b_data(i)
            end do
         else
            do i=1,4
               b_value(i) = b_data(5-i)
               b_value(4+i) = b_data(9-i)
            end do
         end if
         if (r_value4(2) .eq. 0.0 .and. r_value4(1) .eq. 0.0) then
           r_val=0.0
         else
           r_val = atan2(r_value4(2),r_value4(1))
         end if
      goto 200

90    continue ! unsigned integer*2
         i_value2(1) = 0
         if (i_end .gt. 0) then
           b_value(1) = b_data(1)
           b_value(2) = b_data(2)
         else
           b_value(1) = b_data(2)
           b_value(2) = b_data(1)
         end if
         if (i_value2(1) .ge.0) then
           r_val = i_value2(1)
         else
           r_val = i_value2(1)+65536
         end if
      goto 200

100    continue ! Stokes11
         i_value2(1) = b_data(1)
         if (i_value2(1) .ge. 128) i_value2(1) = i_value2(1)-256
         i_value2(2) = b_data(2)
         if (i_value2(2) .ge. 128) i_value2(2) = i_value2(2)-256
         r_val = ((float(int(i_value2(2)))/254.0) + 1.5) * 2.**(i_value2(1))
      goto 200
110   continue ! Complex*2 Magnitude
         r_value4(1) = b_data(1)
         r_value4(2) = b_data(2)
         r_val = sqrt(r_value4(1)**2+r_value4(2)**2)
      goto 200

120    continue ! Complex*2 Phase
         r_value4(1) = b_data(1)
         r_value4(2) = b_data(2)
         r_val = atan2(r_value4(2),r_value4(1))
      goto 200

130   continue ! Complex*4 Magnitude
         if (i_end .gt. 0) then
            do i=1,4
               b_value(i) = b_data(i)
            end do
         else
            do i=1,2
               b_value(i) = b_data(3-i)
               b_value(2+i) = b_data(5-i)
            end do
         end if

         r_val = sqrt(float(int(i_value2(1)))**2+float(int(i_value2(2)))**2)
      goto 200

140   continue ! Complex*4 Phase
         if (i_end .gt. 0) then
            do i=1,4
               b_value(i) = b_data(i)
            end do
         else
            do i=1,2
               b_value(i) = b_data(3-i)
               b_value(2+i) = b_data(5-i)
            end do
         end if
         r_val = atan2(float(int(i_value2(2))),float(int(i_value2(1))))
      goto 200

150    continue ! Real*4_Magnitude
         if (i_end .gt. 0) then
           b_value(1) = b_data(1)
           b_value(2) = b_data(2)
           b_value(3) = b_data(3)
           b_value(4) = b_data(4)
         else
           b_value(1) = b_data(4)
           b_value(2) = b_data(3)
           b_value(3) = b_data(2)
           b_value(4) = b_data(1)
         end if
         r_val = abs(r_value4(1))
      goto 200




200   continue
      r_cnvrtdat = r_val
      return
      end


      real*4 function r_cnvrtdat_old(i_fmt,b_data)

      implicit none

      integer*4 i
      integer*4 i_fmt
      byte b_data(16)

      byte      b_value(16)
      integer*2 i_value2(8)
      integer*4 i_value4(4)
      real*4    r_value4(4)
      real*4    r_value8(2)
      real*4    r_val
      equivalence(b_value,i_value2)
      equivalence(b_value,i_value4)
      equivalence(b_value,r_value4)
      equivalence(b_value,r_value8)

      r_val=0
      if (i_fmt .lt. 0) then
         stop 'Format not recognized'
      else if (i_fmt .eq. 0) then  ! byte
         r_value4(1) = b_data(1)
         if (r_value4(1) .lt. 0.) r_value4(1) = r_value4(1) + 256
         r_val = r_value4(1)
      else if (i_fmt .eq. 1) then  ! integer*1
         r_value4(1) = b_data(1)
         if (r_value4(1) .gt. 127.) r_value4(1) = r_value4(1) - 256
         r_val = r_value4(1)
      else if (i_fmt .eq. 2) then  ! integer*2
         do i=1,2
            b_value(i) = b_data(i)
         end do
         r_val = i_value2(1)
      else if (i_fmt .eq. 3) then  ! integer*4
         do i=1,4
            b_value(i) = b_data(i)
         end do
         r_val = i_value4(1)
      else if (i_fmt .eq. 4) then  ! Real*4
         do i=1,4
            b_value(i) = b_data(i)
         end do
         r_val = r_value4(1)
      else if (i_fmt .eq. 5) then  ! Real*8
         do i=1,8
            b_value(i) = b_data(i)
         end do
         r_val = r_value8(1)
      else if (i_fmt .eq. 6) then  ! Complex Magnitude
         do i=1,8
            b_value(i) = b_data(i)
         end do
         r_val = sqrt(r_value4(1)**2+r_value4(2)**2)
      else if (i_fmt .eq. 7) then  ! Complex Phase
         do i=1,8
            b_value(i) = b_data(i)
         end do
         r_val = atan2(r_value4(2),r_value4(1))
      else
         write(6,*) 'Fmt = ',i_fmt
         stop 'Format not recognized in r_cnvrtdat'
      end if
      r_cnvrtdat_old = r_val
      return
      end



      integer*4 function i_checknul(i_byt,b_data,b_vnul)

      implicit none

      integer*4 i
      integer*4 i_byt
      integer*4 i_flg
      byte b_data(16)
      byte b_vnul(0:16)
      integer i_vnul

      if (b_vnul(0) .eq. 0) then
         i_flg = 0
      else
         i_flg = 1
c         write(6,*) 'b_vnul(0)=',b_vnul(0)
         i_vnul=b_vnul(0)
         if (i_vnul .lt. 0) i_vnul=i_vnul+256
         do i=1,min(i_byt,int(b_vnul(0)))
c            write(6,*) b_data(i),b_vnul(i)
            if (b_data(i) .ne. b_vnul(i)) i_flg=0
         end do
      end if
      i_checknul = i_flg
      return
      end
