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

! First, handle signal reports in the original range, -01 to -30 dB
  if(grid(1:1).eq.'-') then
     read(grid(2:3),*,err=800,end=800) n
     if(n.ge.1 .and. n.le.30) then
        ng=NGBASE+1+n
        go to 900
     endif
     go to 10
  else if(grid(1:2).eq.'R-') then
     read(grid(3:4),*,err=800,end=800) n
     if(n.ge.1 .and. n.le.30) then
        ng=NGBASE+31+n
        go to 900
     endif
     go to 10
! Now check for RO, RRR, or 73 in the message field normally used for grid
  else if(grid(1:4).eq.'RO  ') then
     ng=NGBASE+62
     go to 900
  else if(grid(1:4).eq.'RRR ') then
     ng=NGBASE+63
     go to 900
  else if(grid(1:4).eq.'73  ') then
     ng=NGBASE+64
     go to 900
  endif

! Now check for extended-range signal reports: -50 to -31, and 0 to +49.
10 n=99
  c1=grid(1:1)
  read(grid,*,err=20,end=20) n
  go to 30
20 read(grid(2:4),*,err=30,end=30) n
30 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
     go to 40
  endif

! Maybe it's free text ?
  if(grid(1:1).lt.'A' .or. grid(1:1).gt.'R') text=.true.
  if(grid(2:2).lt.'A' .or. grid(2:2).gt.'R') text=.true.
  if(grid(3:3).lt.'0' .or. grid(3:3).gt.'9') text=.true.
  if(grid(4:4).lt.'0' .or. grid(4:4).gt.'9') text=.true.
  if(text) go to 900

! OK, we have a properly formatted grid locator
40 call grid2deg(grid//'mm',dlong,dlat)
  long=int(dlong)
  lat=int(dlat+ 90.0)
  ng=((long+180)/2)*180 + lat
  go to 900

90 ng=NGBASE + 1
  go to 900

800 text=.true.
900 continue

  return
end subroutine packgrid