(*----------------------------------------------------------------------*)
(*       Kermit_CRC --- Update cyclic redundancy check for Kermit       *)
(*----------------------------------------------------------------------*)

FUNCTION Kermit_CRC( Old_CRC: INTEGER; B: BYTE ) : INTEGER;

(*----------------------------------------------------------------------*)
(*                                                                      *)
(*     Function:   Kermit_CRC                                           *)
(*                                                                      *)
(*     Purpose:    Computes cyclic redundancy check for 1 character     *)
(*                 for Kermit protocol.                                 *)
(*                                                                      *)
(*     Calling Sequence:                                                *)
(*                                                                      *)
(*        New_CRC := Kermit_CRC( Old_CRC : INTEGER;                     *)
(*                               B       : BYTE ) : INTEGER;            *)
(*                                                                      *)
(*           Old_CRC --- previous CRC value.                            *)
(*           B       --- character for which CRC is computed.           *)
(*           New_CRC --- updated CRC.                                   *)
(*                                                                      *)
(*     Calls:    None                                                   *)
(*                                                                      *)
(*----------------------------------------------------------------------*)

VAR
   C     : BYTE;
   CSave : BYTE;

CONST
   CrcTab:  ARRAY[0..15] OF INTEGER
            = ( $0000, $1081, $2102, $3183, $4204, $5285, $6306, $7387,
                $8408, $9489, $A50A, $B58B, $C60C, $D68D, $E70E, $F78F  );

   CrcTab2: ARRAY[0..15] OF INTEGER
            = ( $0000, $1189, $2312, $329B, $4624, $57AD, $6536, $74BF,
                $8C48, $9DC1, $AF5A, $BED3, $CA6C, $DBE5, $E97E, $F8F7  );

BEGIN (* Kermit_CRC *)

   C     := B XOR LO( Old_CRC );
   CSave := ( C AND $F0 ) SHR 4;
   C     := C AND $0F;

   Kermit_CRC   := ( Old_CRC SHR 8 ) XOR ( CrcTab[ CSave ] XOR CrcTab2[ C ] );

END   (* Kermit_CRC *);
