From a6722648c7da82fafec1afff5b46d1f98c3ac37b Mon Sep 17 00:00:00 2001
From: Joe Taylor <k1jt@arrl.org>
Date: Wed, 28 Nov 2012 01:57:45 +0000
Subject: [PATCH] Permit signal reports in the range -50 to +49 dB

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2779 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
---
 lib/packgrid.f90   |  38 +++++++---------
 lib/packmsg.f      | 111 ---------------------------------------------
 lib/packmsg.f90    | 111 +++++++++++++++++++++++++++++++++++++++++++++
 lib/unpackgrid.f90 |  75 ++++++++++++++++--------------
 lib/unpackmsg.f    | 100 ----------------------------------------
 lib/unpackmsg.f90  | 100 ++++++++++++++++++++++++++++++++++++++++
 mainwindow.cpp     |   2 +-
 7 files changed, 268 insertions(+), 269 deletions(-)
 delete mode 100644 lib/packmsg.f
 create mode 100644 lib/packmsg.f90
 delete mode 100644 lib/unpackmsg.f
 create mode 100644 lib/unpackmsg.f90

diff --git a/lib/packgrid.f90 b/lib/packgrid.f90
index ab4d43aa3..bfb0f5f40 100644
--- a/lib/packgrid.f90
+++ b/lib/packgrid.f90
@@ -2,33 +2,26 @@ subroutine packgrid(grid,ng,text)
 
   parameter (NGBASE=180*180)
   character*4 grid
+  character*1 c1
   logical text
 
   text=.false.
   if(grid.eq.'    ') go to 90               !Blank grid is OK
 
-  if(grid(1:1).eq.'-') then                 !Test for numerical signal report
-     read(grid(2:3),*,err=1,end=1) n        !NB: n is positive
-     if(n.lt.1) n=1
-     if(n.gt.50) n=50
-     if(n.gt.30) then
-        call n2grid(-n,grid)                !Very low S/N use locators near -90
-        go to 10
+  n=99
+  c1=grid(1:1)
+  read(grid,*,err=1) n
+  go to 2
+1 read(grid(2:4),*,err=2) n
+2 if(n.ge.-50 .and. n.le.49) then
+     if(c1.eq.'R') then
+        write(grid,1002) n+50
+1002    format('LA',i2.2)
+     else
+        write(grid,1003) n+50
+1003    format('KA',i2.2)
      endif
-1    ng=NGBASE+1+n
-     go to 100
-  else if(grid(1:2).eq.'R-') then
-     read(grid(3:4),*,err=2,end=2) n
-     if(n.lt.1) n=1
-     if(n.gt.50) n=50
-     if(n.gt.30) then
-        call n2grid(-n-20,grid)           !Very low S/N use locators near -90
-        go to 10
-     endif
-
-2    if(n.eq.0) go to 90
-     ng=NGBASE+31+n
-     go to 100
+     go to 10
   else if(grid(1:2).eq.'RO') then
      ng=NGBASE+62
      go to 100
@@ -54,6 +47,7 @@ subroutine packgrid(grid,ng,text)
 
 90 ng=NGBASE + 1
 
-100 return
+100 continue
+  return
 end subroutine packgrid
 
diff --git a/lib/packmsg.f b/lib/packmsg.f
deleted file mode 100644
index 4d131400b..000000000
--- a/lib/packmsg.f
+++ /dev/null
@@ -1,111 +0,0 @@
-      subroutine packmsg(msg,dat,text)
-
-      parameter (NBASE=37*36*10*27*27*27)
-      parameter (NBASE2=262178562)
-      character*22 msg
-      integer dat(12)
-      character*12 c1,c2
-      character*4 c3
-      character*6 grid6
-      logical text1,text2,text3,text
-
-      text=.false.
-C  Convert all letters to upper case
-      iz=22
-      do i=1,22
-         if(msg(i:i).ge.'a' .and. msg(i:i).le.'z') 
-     +     msg(i:i)= char(ichar(msg(i:i))+ichar('A')-ichar('a'))
-         if(msg(i:i).ne.' ') iz=i
-      enddo
-      do iter=1,5                           !Collapse multiple blanks into one
-         ib2=index(msg(1:iz),'  ')
-         if(ib2.lt.1) go to 5
-         msg=msg(1:ib2)//msg(ib2+2:)
-         iz=iz-1
-      enddo
-
-C  See if it's a CQ message
- 5    if(msg(1:3).eq.'CQ ') then
-         i=3
-C  ... and if so, does it have a reply frequency?
-         if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and. 
-     +      msg(5:5).ge.'0' .and. msg(5:5).le.'9' .and. 
-     +      msg(6:6).ge.'0' .and. msg(6:6).le.'9') i=7
-         go to 1
-      endif
-
-      do i=1,22
-         if(msg(i:i).eq.' ') go to 1       !Get 1st blank
-      enddo 
-      go to 10                             !Consider msg as plain text
-      
- 1    ia=i
-      c1=msg(1:ia-1)
-      do i=ia+1,22
-         if(msg(i:i).eq.' ') go to 2       !Get 2nd blank
-      enddo
-      go to 10                             !Consider msg as plain text
-
- 2    ib=i
-      c2=msg(ia+1:ib-1)
-
-      do i=ib+1,22
-         if(msg(i:i).eq.' ') go to 3       !Get 3rd blank
-      enddo
-      go to 10                             !Consider msg as plain text
-
- 3    ic=i
-      c3='    '
-      if(ic.ge.ib+1) c3=msg(ib+1:ic)
-      if(c3.eq.'OOO ') c3='    '           !Strip out the OOO flag
-      call getpfx1(c1,k1,junk)
-      call packcall(c1,nc1,text1)
-      call getpfx1(c2,k2,nv2)
-      call packcall(c2,nc2,text2)
-      if(nv2.eq.0) then
-         if(k1.lt.0 .or. k2.lt.0 .or. k1*k2.ne.0) go to 10
-         if(k2.gt.0) k2=k2+450
-         k=max(k1,k2)
-         if(k.gt.0) then
-            call k2grid(k,grid6)
-            c3=grid6(:4)
-         endif
-      endif
-      call packgrid(c3,ng,text3)
-      if(nv2.eq.0 .and. (.not.text1) .and. (.not.text2) .and. 
-     +        (.not.text3)) go to 20
-      if(nv2.gt.0) then
-         if(nv2.eq.1) then
-            if(c1(1:3).eq.'CQ ')  nc1=262178563 + k2
-            if(c1(1:4).eq.'QRZ ') nc1=264002072 + k2 
-            if(c1(1:3).eq.'DE ')  nc1=265825581 + k2
-         endif
-         if(nv2.eq.2) then
-            if(c1(1:3).eq.'CQ ')  nc1=267649090 + k2
-            if(c1(1:4).eq.'QRZ ') nc1=267698375 + k2
-            if(c1(1:3).eq.'DE ')  nc1=267747660 + k2
-         endif
-         go to 20
-      endif
-
-C  The message will be treated as plain text.
- 10   text=.true.
-      call packtext(msg,nc1,nc2,ng)
-      ng=ng+32768
-
-C  Encode data into 6-bit words
- 20   dat(1)=iand(ishft(nc1,-22),63)                !6 bits
-      dat(2)=iand(ishft(nc1,-16),63)                !6 bits
-      dat(3)=iand(ishft(nc1,-10),63)                !6 bits
-      dat(4)=iand(ishft(nc1, -4),63)                !6 bits
-      dat(5)=4*iand(nc1,15)+iand(ishft(nc2,-26),3)  !4+2 bits
-      dat(6)=iand(ishft(nc2,-20),63)                !6 bits
-      dat(7)=iand(ishft(nc2,-14),63)                !6 bits
-      dat(8)=iand(ishft(nc2, -8),63)                !6 bits
-      dat(9)=iand(ishft(nc2, -2),63)                !6 bits
-      dat(10)=16*iand(nc2,3)+iand(ishft(ng,-12),15) !2+4 bits
-      dat(11)=iand(ishft(ng,-6),63)
-      dat(12)=iand(ng,63)
-
-      return
-      end
diff --git a/lib/packmsg.f90 b/lib/packmsg.f90
new file mode 100644
index 000000000..509e4679c
--- /dev/null
+++ b/lib/packmsg.f90
@@ -0,0 +1,111 @@
+subroutine packmsg(msg,dat,text)
+
+  parameter (NBASE=37*36*10*27*27*27)
+  parameter (NBASE2=262178562)
+  character*22 msg
+  integer dat(12)
+  character*12 c1,c2
+  character*4 c3
+  character*6 grid6
+  logical text1,text2,text3,text
+
+  text=.false.
+! Convert all letters to upper case
+  iz=22
+  do i=1,22
+     if(msg(i:i).ge.'a' .and. msg(i:i).le.'z')                       &
+          msg(i:i)= char(ichar(msg(i:i))+ichar('A')-ichar('a'))
+     if(msg(i:i).ne.' ') iz=i
+  enddo
+  do iter=1,5                           !Collapse multiple blanks into one
+     ib2=index(msg(1:iz),'  ')
+     if(ib2.lt.1) go to 5
+     msg=msg(1:ib2)//msg(ib2+2:)
+     iz=iz-1
+  enddo
+
+! See if it's a CQ message
+5 if(msg(1:3).eq.'CQ ') then
+     i=3
+! ... and if so, does it have a reply frequency?
+     if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and.                  &
+          msg(5:5).ge.'0' .and. msg(5:5).le.'9' .and.                &
+          msg(6:6).ge.'0' .and. msg(6:6).le.'9') i=7
+     go to 1
+  endif
+
+  do i=1,22
+     if(msg(i:i).eq.' ') go to 1       !Get 1st blank
+  enddo
+  go to 10                             !Consider msg as plain text
+      
+1 ia=i
+  c1=msg(1:ia-1)
+  do i=ia+1,22
+     if(msg(i:i).eq.' ') go to 2       !Get 2nd blank
+  enddo
+  go to 10                             !Consider msg as plain text
+
+2 ib=i
+  c2=msg(ia+1:ib-1)
+
+  do i=ib+1,22
+     if(msg(i:i).eq.' ') go to 3       !Get 3rd blank
+  enddo
+  go to 10                             !Consider msg as plain text
+
+3 ic=i
+  c3='    '
+  if(ic.ge.ib+1) c3=msg(ib+1:ic)
+  if(c3.eq.'OOO ') c3='    '           !Strip out the OOO flag
+  call getpfx1(c1,k1,junk)
+  call packcall(c1,nc1,text1)
+  call getpfx1(c2,k2,nv2)
+  call packcall(c2,nc2,text2)
+  if(nv2.eq.0) then
+     if(k1.lt.0 .or. k2.lt.0 .or. k1*k2.ne.0) go to 10
+     if(k2.gt.0) k2=k2+450
+     k=max(k1,k2)
+     if(k.gt.0) then
+        call k2grid(k,grid6)
+        c3=grid6(:4)
+     endif
+  endif
+  call packgrid(c3,ng,text3)
+  if(nv2.eq.0 .and. (.not.text1) .and. (.not.text2) .and.           &
+       (.not.text3)) go to 20
+  if(nv2.gt.0) then
+     if(nv2.eq.1) then
+        if(c1(1:3).eq.'CQ ')  nc1=262178563 + k2
+        if(c1(1:4).eq.'QRZ ') nc1=264002072 + k2 
+        if(c1(1:3).eq.'DE ')  nc1=265825581 + k2
+     endif
+     if(nv2.eq.2) then
+        if(c1(1:3).eq.'CQ ')  nc1=267649090 + k2
+        if(c1(1:4).eq.'QRZ ') nc1=267698375 + k2
+        if(c1(1:3).eq.'DE ')  nc1=267747660 + k2
+     endif
+     go to 20
+  endif
+
+! The message will be treated as plain text.
+10 text=.true.
+  call packtext(msg,nc1,nc2,ng)
+  ng=ng+32768
+
+! Encode data into 6-bit words
+20 dat(1)=iand(ishft(nc1,-22),63)               !6 bits
+  dat(2)=iand(ishft(nc1,-16),63)                !6 bits
+  dat(3)=iand(ishft(nc1,-10),63)                !6 bits
+  dat(4)=iand(ishft(nc1, -4),63)                !6 bits
+  dat(5)=4*iand(nc1,15)+iand(ishft(nc2,-26),3)  !4+2 bits
+  dat(6)=iand(ishft(nc2,-20),63)                !6 bits
+  dat(7)=iand(ishft(nc2,-14),63)                !6 bits
+  dat(8)=iand(ishft(nc2, -8),63)                !6 bits
+  dat(9)=iand(ishft(nc2, -2),63)                !6 bits
+  dat(10)=16*iand(nc2,3)+iand(ishft(ng,-12),15) !2+4 bits
+  dat(11)=iand(ishft(ng,-6),63)
+  dat(12)=iand(ng,63)
+
+  return
+end subroutine packmsg
diff --git a/lib/unpackgrid.f90 b/lib/unpackgrid.f90
index 3cbdca2e3..84dc7441d 100644
--- a/lib/unpackgrid.f90
+++ b/lib/unpackgrid.f90
@@ -1,40 +1,45 @@
-      subroutine unpackgrid(ng,grid)
+subroutine unpackgrid(ng,grid)
 
-      parameter (NGBASE=180*180)
-      character grid*4,grid6*6
+  parameter (NGBASE=180*180)
+  character grid*4,grid6*6
 
-      grid='    '
-      if(ng.ge.32400) go to 10
-      dlat=mod(ng,180)-90
-      dlong=(ng/180)*2 - 180 + 2
-      call deg2grid(dlong,dlat,grid6)
-      grid=grid6(:4)
-      if(grid(2:2).eq.'A' .and. grid(4:4).eq.'0') then
-         i=ichar(grid(1:1))
-         if(i.ge.ichar('A') .and. i.le.ichar('D')) then
-            call grid2n(grid,n)
-            if(n.ge.-50) write(grid,1012) n
-            if(n.lt.-50) write(grid,1022) n+20
-         endif
-      endif
-      go to 100
+  grid='    '
+  if(ng.ge.32400) go to 10
+  dlat=mod(ng,180)-90
+  dlong=(ng/180)*2 - 180 + 2
+  call deg2grid(dlong,dlat,grid6)
+  grid=grid6(:4)
+  if(grid(1:2).eq.'KA') then
+     read(grid(3:4),*) n
+     n=n-50
+     write(grid,1001) n
+1001 format(i3.2)
+     if(grid(1:1).eq.' ') grid(1:1)='+'
+  else if(grid(1:2).eq.'LA') then
+     read(grid(3:4),*) n
+     n=n-50
+     write(grid,1002) n
+1002 format('R',i3.2)
+     if(grid(2:2).eq.' ') grid(2:2)='+'
+  endif
+  go to 900
 
- 10   n=ng-NGBASE-1
-      if(n.ge.1 .and.n.le.30) then
-         write(grid,1012) -n
- 1012    format(i3.2)
-      else if(n.ge.31 .and.n.le.60) then
-         n=n-30
-         write(grid,1022) -n
- 1022    format('R',i3.2)
-      else if(n.eq.61) then
-         grid='RO'
-      else if(n.eq.62) then
-         grid='RRR'
-      else if(n.eq.63) then
-         grid='73'
-      endif
+10 n=ng-NGBASE-1
+  if(n.ge.1 .and.n.le.30) then
+     write(grid,1012) -n
+1012 format(i3.2)
+  else if(n.ge.31 .and.n.le.60) then
+     n=n-30
+     write(grid,1022) -n
+1022 format('R',i3.2)
+  else if(n.eq.61) then
+     grid='RO'
+  else if(n.eq.62) then
+     grid='RRR'
+  else if(n.eq.63) then
+     grid='73'
+  endif
 
- 100  return
-      end
+900 return
+end subroutine unpackgrid
 
diff --git a/lib/unpackmsg.f b/lib/unpackmsg.f
deleted file mode 100644
index f9d3962fd..000000000
--- a/lib/unpackmsg.f
+++ /dev/null
@@ -1,100 +0,0 @@
-      subroutine unpackmsg(dat,msg)
-
-      parameter (NBASE=37*36*10*27*27*27)
-      parameter (NGBASE=180*180)
-      integer dat(12)
-      character c1*12,c2*12,grid*4,msg*22,grid6*6,psfx*4,junk2*4
-      logical cqnnn
-
-      cqnnn=.false.
-      nc1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+
-     +  ishft(dat(4),4) + iand(ishft(dat(5),-2),15)
-
-      nc2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) + 
-     +  ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) + 
-     +  iand(ishft(dat(10),-4),3)
-
-      ng=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12)
-
-      if(ng.gt.32768) then
-         call unpacktext(nc1,nc2,ng,msg)
-         go to 100
-      endif
-
-      call unpackcall(nc1,c1,iv2,psfx)
-      if(iv2.eq.0) then
-! This is an "original JT65" message
-         if(nc1.eq.NBASE+1) c1='CQ    '
-         if(nc1.eq.NBASE+2) c1='QRZ   '
-         nfreq=nc1-NBASE-3
-         if(nfreq.ge.0 .and. nfreq.le.999) then
-            write(c1,1002) nfreq
- 1002       format('CQ ',i3.3)
-            cqnnn=.true.
-         endif
-      endif
-
-      call unpackcall(nc2,c2,junk1,junk2)
-      call unpackgrid(ng,grid)
-
-      if(iv2.gt.0) then
-! This is a JT65v2 message
-         n1=len_trim(psfx)
-         n2=len_trim(c2)
-         if(iv2.eq.1) msg='CQ '//psfx(:n1)//'/'//c2(:n2)//' '//grid
-         if(iv2.eq.2) msg='QRZ '//psfx(:n1)//'/'//c2(:n2)//' '//grid
-         if(iv2.eq.3) msg='DE '//psfx(:n1)//'/'//c2(:n2)//' '//grid
-         if(iv2.eq.4) msg='CQ '//c2(:n2)//'/'//psfx(:n1)//' '//grid
-         if(iv2.eq.5) msg='QRZ '//c2(:n2)//'/'//psfx(:n1)//' '//grid
-         if(iv2.eq.6) msg='DE '//c2(:n2)//'/'//psfx(:n1)//' '//grid
-         if(iv2.eq.7) msg='DE '//c2(:n2)//' '//grid
-         go to 100
-      else
-         
-      endif
-
-      grid6=grid//'ma'
-      call grid2k(grid6,k)
-      if(k.ge.1 .and. k.le.450)   call getpfx2(k,c1)
-      if(k.ge.451 .and. k.le.900) call getpfx2(k,c2)
-
-      i=index(c1,char(0))
-      if(i.ge.3) c1=c1(1:i-1)//'            '
-      i=index(c2,char(0))
-      if(i.ge.3) c2=c2(1:i-1)//'            '
-
-      msg='                      '
-      j=0
-      if(cqnnn) then
-         msg=c1//'          '
-         j=7                                  !### ??? ###
-         go to 10
-      endif
-
-      do i=1,12
-         j=j+1
-         msg(j:j)=c1(i:i)
-         if(c1(i:i).eq.' ') go to 10
-      enddo
-      j=j+1
-      msg(j:j)=' '
-
- 10   do i=1,12
-         if(j.le.21) j=j+1
-         msg(j:j)=c2(i:i)
-         if(c2(i:i).eq.' ') go to 20
-      enddo
-      if(j.le.21) j=j+1
-      msg(j:j)=' '
-
- 20   if(k.eq.0) then
-         do i=1,4
-            if(j.le.21) j=j+1
-            msg(j:j)=grid(i:i)
-         enddo
-         if(j.le.21) j=j+1
-         msg(j:j)=' '
-      endif
-
- 100  return
-      end
diff --git a/lib/unpackmsg.f90 b/lib/unpackmsg.f90
new file mode 100644
index 000000000..8b9c5fad8
--- /dev/null
+++ b/lib/unpackmsg.f90
@@ -0,0 +1,100 @@
+subroutine unpackmsg(dat,msg)
+
+  parameter (NBASE=37*36*10*27*27*27)
+  parameter (NGBASE=180*180)
+  integer dat(12)
+  character c1*12,c2*12,grid*4,msg*22,grid6*6,psfx*4,junk2*4
+  logical cqnnn
+
+  cqnnn=.false.
+  nc1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+         &
+       ishft(dat(4),4) + iand(ishft(dat(5),-2),15)
+
+  nc2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) +                   &
+       ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) +         &
+       iand(ishft(dat(10),-4),3)
+
+  ng=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12)
+
+  if(ng.gt.32768) then
+     call unpacktext(nc1,nc2,ng,msg)
+     go to 100
+  endif
+
+  call unpackcall(nc1,c1,iv2,psfx)
+  if(iv2.eq.0) then
+! This is an "original JT65" message
+     if(nc1.eq.NBASE+1) c1='CQ    '
+     if(nc1.eq.NBASE+2) c1='QRZ   '
+     nfreq=nc1-NBASE-3
+     if(nfreq.ge.0 .and. nfreq.le.999) then
+        write(c1,1002) nfreq
+1002    format('CQ ',i3.3)
+        cqnnn=.true.
+     endif
+  endif
+
+  call unpackcall(nc2,c2,junk1,junk2)
+  call unpackgrid(ng,grid)
+
+  if(iv2.gt.0) then
+! This is a JT65v2 message
+     n1=len_trim(psfx)
+     n2=len_trim(c2)
+     if(iv2.eq.1) msg='CQ '//psfx(:n1)//'/'//c2(:n2)//' '//grid
+     if(iv2.eq.2) msg='QRZ '//psfx(:n1)//'/'//c2(:n2)//' '//grid
+     if(iv2.eq.3) msg='DE '//psfx(:n1)//'/'//c2(:n2)//' '//grid
+     if(iv2.eq.4) msg='CQ '//c2(:n2)//'/'//psfx(:n1)//' '//grid
+     if(iv2.eq.5) msg='QRZ '//c2(:n2)//'/'//psfx(:n1)//' '//grid
+     if(iv2.eq.6) msg='DE '//c2(:n2)//'/'//psfx(:n1)//' '//grid
+     if(iv2.eq.7) msg='DE '//c2(:n2)//' '//grid
+     go to 100
+  else
+     
+  endif
+
+  grid6=grid//'ma'
+  call grid2k(grid6,k)
+  if(k.ge.1 .and. k.le.450)   call getpfx2(k,c1)
+  if(k.ge.451 .and. k.le.900) call getpfx2(k,c2)
+
+  i=index(c1,char(0))
+  if(i.ge.3) c1=c1(1:i-1)//'            '
+  i=index(c2,char(0))
+  if(i.ge.3) c2=c2(1:i-1)//'            '
+
+  msg='                      '
+  j=0
+  if(cqnnn) then
+     msg=c1//'          '
+     j=7                                  !### ??? ###
+     go to 10
+  endif
+
+  do i=1,12
+     j=j+1
+     msg(j:j)=c1(i:i)
+     if(c1(i:i).eq.' ') go to 10
+  enddo
+  j=j+1
+  msg(j:j)=' '
+
+10 do i=1,12
+     if(j.le.21) j=j+1
+     msg(j:j)=c2(i:i)
+     if(c2(i:i).eq.' ') go to 20
+  enddo
+  if(j.le.21) j=j+1
+  msg(j:j)=' '
+
+20 if(k.eq.0) then
+     do i=1,4
+        if(j.le.21) j=j+1
+        msg(j:j)=grid(i:i)
+     enddo
+     if(j.le.21) j=j+1
+     msg(j:j)=' '
+  endif
+
+100 return
+end subroutine unpackmsg
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 04b7626f6..555e5db69 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -1,4 +1,4 @@
-//--------------------------------------------------------------- MainWindow
+//---------------------------------------------------------------- MainWindow
 #include "mainwindow.h"
 #include "ui_mainwindow.h"
 #include "devsetup.h"