| 
									
										
										
										
											2020-05-04 13:13:49 -05:00
										 |  |  | subroutine get_crc14(mc,len,ncrc)
 | 
					
						
							|  |  |  | !
 | 
					
						
							|  |  |  | ! 1. To calculate 14-bit CRC, mc(1:len-14) is the message and mc(len-13:len) are zero.
 | 
					
						
							|  |  |  | ! 2. To check a received CRC, mc(1:len is the received message plus CRC.
 | 
					
						
							|  |  |  | !    ncrc will be zero if the received message/CRC are consistent
 | 
					
						
							|  |  |  | !  
 | 
					
						
							| 
									
										
										
										
											2020-02-09 16:13:52 -06:00
										 |  |  |   character c14*14
 | 
					
						
							| 
									
										
										
										
											2020-05-04 13:13:49 -05:00
										 |  |  |   integer*1 mc(len)
 | 
					
						
							|  |  |  |   integer*1 r(15),p(15)
 | 
					
						
							| 
									
										
										
										
											2020-02-09 16:13:52 -06:00
										 |  |  |   integer ncrc
 | 
					
						
							|  |  |  | ! polynomial for 14-bit CRC 0x6757
 | 
					
						
							|  |  |  |   data p/1,1,0,0,1,1,1,0,1,0,1,0,1,1,1/
 | 
					
						
							|  |  |  |   
 | 
					
						
							|  |  |  | ! divide by polynomial
 | 
					
						
							|  |  |  |   r=mc(1:15)
 | 
					
						
							| 
									
										
										
										
											2020-05-04 13:13:49 -05:00
										 |  |  |   do i=0,len-15
 | 
					
						
							| 
									
										
										
										
											2020-02-09 16:13:52 -06:00
										 |  |  |     r(15)=mc(i+15)
 | 
					
						
							|  |  |  |     r=mod(r+r(1)*p,2)
 | 
					
						
							|  |  |  |     r=cshift(r,1)
 | 
					
						
							|  |  |  |   enddo
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   write(c14,'(14b1)') r(1:14)
 | 
					
						
							|  |  |  |   read(c14,'(b14.14)') ncrc
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end subroutine get_crc14
 |