subroutine display(nkeep,ftol)

  parameter (MAXLINES=400,MX=400,MAXCALLS=500)
  integer indx(MAXLINES),indx2(MX)
  character*83 line(MAXLINES),line2(MX),line3(MAXLINES)
  character out*52,out0*52,cfreq0*3,livecq*58
  character*6 callsign,callsign0
  character*12 freqcall(MAXCALLS)
  real freqkHz(MAXLINES)
  integer utc(MAXLINES),utc2(MX),utcz
  real*8 f0
  save

  out0=' '
  rewind(26)

  do i=1,MAXLINES
     read(26,1010,end=10) line(i)
1010 format(a77)
     read(line(i),1020) f0,ndf,nh,nm
1020 format(f8.3,i5,25x,i3,i2)
     utc(i)=60*nh + nm
     freqkHz(i)=1000.d0*(f0-144.d0) + 0.001d0*ndf
  enddo

10 backspace(26)
  nz=i-1
  utcz=utc(nz)
  nz=nz-1
  if(nz.lt.1) go to 999
  nquad=max(nkeep/4,3)
  do i=1,nz
     nage=utcz-utc(i)
     if(nage.lt.0) nage=nage+1440
     iage=nage/nquad
     write(line(i)(73:74),1021) iage
1021 format(i2)
  enddo

  nage=utcz-utc(1)
  if(nage.lt.0) nage=nage+1440
  if(nage.gt.nkeep) then
     do i=1,nz
        nage=utcz-utc(i)
        if(nage.lt.0) nage=nage+1440
        if(nage.le.nkeep) go to 20
     enddo
20   i0=i
     nz=nz-i0+1
     rewind(26)
     if(nz.lt.1) go to 999
     do i=1,nz
        j=i+i0-1
        line(i)=line(j)
        utc(i)=utc(j)
        freqkHz(i)=freqkHz(j)
        write(26,1022) line(i)
1022    format(a77)
     enddo
  endif

  call flush(26)
  call indexx(freqkHz,nz,indx)

  nstart=1
  k3=0
  k=1
  m=indx(1)
  if(m.lt.1 .or. m.gt.MAXLINES) then
     print*,'Error in display.f90: ',nz,m
     m=1
  endif
  line2(1)=line(m)
  utc2(1)=utc(m)
  do i=2,nz
     j0=indx(i-1)
     j=indx(i)
     if(freqkHz(j)-freqkHz(j0).gt.2.0*ftol) then
        if(nstart.eq.0) then
           k=k+1
           line2(k)=""
           utc2(k)=-1
        endif
        kz=k
        if(nstart.eq.1) then
           call indexx(float(utc2(1:kz)),kz,indx2)
           k3=0
           do k=1,kz
              k3=min(k3+1,400)
              line3(k3)=line2(indx2(k))
           enddo
           nstart=0
        else
           call indexx(float(utc2(1:kz)),kz,indx2)
           do k=1,kz
              k3=min(k3+1,400)
              line3(k3)=line2(indx2(k))
           enddo
        endif
        k=0
     endif
     if(i.eq.nz) then
        k=k+1
        line2(k)=""
        utc2(k)=-1
     endif
     k=k+1
     line2(k)=line(j)
     utc2(k)=utc(j)
     j0=j
  enddo
  kz=k
  call indexx(float(utc2(1:kz)),kz,indx2)
  do k=1,kz
     k3=min(k3+1,400)
     line3(k3)=line2(indx2(k))
  enddo

  rewind 19
  rewind 20
  cfreq0='   '
  nc=0
  callsign0='      '
  do k=1,k3
     out=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)//       &
          line3(k)(35:38)//line3(k)(46:74)
     if(out(1:3).ne.'   ') then
        cfreq0=out(1:3)
        livecq=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)//       &
             line3(k)(23:27)//line3(k)(35:38)//line3(k)(46:70)//        &
             line3(k)(73:77)
        if(livecq(56:56).eq.':') livecq(56:58)=' '//livecq(56:57)
        if(index(livecq,' CQ ').gt.0 .or. index(livecq,' QRZ ').gt.0 .or.   &
           index(livecq,' QRT ').gt.0 .or. index(livecq,' CQV ').gt.0 .or.  &
           index(livecq,' CQH ').gt.0) write(19,1029) livecq
1029    format(a58)

! Suppress listing duplicate (same time, decoded message, and frequency)
        if(out(14:17).ne.out0(14:17) .or. out(26:50).ne.out0(26:50) .or.  &
             out(1:3).ne.out0(1:3)) then
           write(*,1030) out                  !Messages
1030       format('@',a52)
           out0=out
        endif

        i1=index(out(26:),' ')
        callsign=out(i1+26:)
        i2=index(callsign,' ')
        if(i2.gt.1) callsign(i2:)='      '
        if(callsign.ne.'      ' .and. callsign.ne.callsign0) then
           len=i2-1
           if(len.lt.0) len=6
           if(len.ge.4) then                        !Omit short "callsigns"
              if(nc.lt.MAXCALLS) nc=nc+1
              freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74)
              callsign0=callsign
           endif
        endif
        if(callsign.ne.'      ' .and. callsign.eq.callsign0) then
           freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74)
        endif
     endif
  enddo
  flush(19)
  if(nc.lt.MAXCALLS) nc=nc+1
  freqcall(nc)='            '
  if(nc.lt.MAXCALLS) nc=nc+1
  freqcall(nc)='            '
  freqcall(nc+1)='            '
  freqcall(nc+2)='            '

  do i=1,nc
  write(*,1042) freqcall(i)                         !Band Map
1042 format('&',a12)
  enddo

999  continue
  return
end subroutine display
