Contributor: SEAN PALMER              

{
SEAN PALMER

Here are some that make their tables on the fly (to save echo space)

I believe crc should be inited to 0 at start

This CRC-16 is not identical to the one used by the Xmodem and Zmodem
File transfer protocols. The polynomial is the same
(X^16+X^12+X^5+X^0 or 0x8408) but the bit-ordering is the opposite,
and preconditioning and postconditioning is used as in 32-bit CRCs.
This method is also used by the European version of X.25.
}

Var
  crc16table : Array [Byte] of Word;

Procedure makeCRC16table;
Var
  crc : Word;
  i,n : Byte;
begin
  For i := 0 to 255 do
  begin
    crc := i;
    For n := 1 to 8 do
      if odd(crc) then
        crc := (crc shr 1) xor $8408
      else
        crc := crc shr 1;

    crc16table[i] := crc;
  end;
end;

Function updateCRC16(c : Byte; crc : Word) : Word;
begin
  updateCRC16 := crc16table[lo(crc) xor c] xor hi(crc);
end;

{this is the same crc used For zModem crc32}

Var
  crc32table : Array [Byte] of LongInt;

Procedure makeCRC32table;
Var
  crc : LongInt;
  i,n : Byte;
begin
  For i := 0 to 255 do
  begin
    crc := i;
    For n := 1 to 8 do
      if odd(crc) then
        crc := (crc shr 1) xor $EDB88320
      else
        crc := crc shr 1;

    crc32table[i] := crc;
  end;
end;

Function updateCRC32(c : Byte; crc : LongInt) : LongInt;
begin
  updateCRC32 := crc32table[lo(crc) xor c] xor (crc shr 8);
end;