67 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
| subroutine genmsk_short(msg,msgsent,ichk,itone,itype)
 | |
| 
 | |
|   use hashing
 | |
|   character*22 msg,msgsent
 | |
|   character*3 crpt,rpt(0:7)
 | |
|   logical first
 | |
|   integer itone(35)
 | |
|   integer ig24(0:4096-1)                  !Codewords for Golay (24,12) code
 | |
|   integer b11(11)
 | |
|   data b11/1,1,1,0,0,0,1,0,0,1,0/         !Barker 11 code
 | |
|   data rpt /'26 ','27 ','28 ','R26','R27','R28','RRR','73 '/
 | |
|   data first/.true./
 | |
|   save first,ig24
 | |
| 
 | |
|   if(first) then
 | |
|      call golay24_table(ig24)             !Define the Golay(24,12) codewords
 | |
|      first=.false.
 | |
|   endif
 | |
| 
 | |
|   itype=-1
 | |
|   msgsent='*** bad message ***'
 | |
|   itone=0
 | |
|   i1=index(msg,'>')
 | |
|   if(i1.lt.9) go to 900
 | |
|   call fmtmsg(msg,iz)
 | |
|   crpt=msg(i1+2:i1+5)
 | |
|   do i=0,7
 | |
|      if(crpt.eq.rpt(i)) go to 10
 | |
|   enddo
 | |
|   go to 900
 | |
| 
 | |
| 10 irpt=i                               !Report index, 0-7
 | |
|   if(ichk.lt.10000) then
 | |
|      call hash(msg(2:i1-1),i1-2,ihash)  
 | |
|      ihash=iand(ihash,511)                 !9-bit hash for the two callsigns
 | |
|      ig=8*ihash + irpt                     !12-bit message information
 | |
|   else
 | |
|      ig=ichk-10000
 | |
|   endif
 | |
|   ncodeword=ig24(ig)
 | |
|   itone(1:11)=b11                       !Insert the Barker-11 code
 | |
|   n=2**24
 | |
|   do i=12,35                            !Insert codeword into itone array
 | |
|      n=n/2
 | |
|      itone(i)=0
 | |
|      if(iand(ncodeword,n).ne.0) itone(i)=1
 | |
|   enddo 
 | |
|   msgsent=msg
 | |
|   itype=7
 | |
| 
 | |
|   n=count(itone(1:35).eq.0)
 | |
|   if(mod(n,2).ne.0) stop 'Parity error in genmsk_short.'
 | |
| 
 | |
| 900 return
 | |
| end subroutine genmsk_short
 | |
| 
 | |
| subroutine hash_calls(calls,ih9)
 | |
| 
 | |
|   use hashing
 | |
|   character*(*) calls
 | |
|   i1=index(calls,'>')
 | |
|   call hash(calls(2:i1-1),i1-2,ih9)
 | |
|   ih9=iand(ih9,511)                      !9-bit hash for the two callsigns
 | |
| 
 | |
|   return
 | |
| end subroutine hash_calls
 |