Code: Select all
MODULE CRC16CCITT8408;
(*
A. V. Shiryaev, 2013.09
http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
*)
IMPORT SYSTEM;
CONST
init* = 0FFFFH;
(*
Name: CRC-16 CCITT
Poly: $8408
Init: $FFFF
Revert: FALSE
XorOut: $0000
Check: $6F91 ("123456789")
MaxLen: 4095 bytes (32767 bits) --- detection of single, double, triple, and all odd errors
*)
PROCEDURE* Update* (VAR cs: INTEGER; x: CHAR);
BEGIN
(* ASSERT 0 <= cs <= 0FFFFH *)
x := CHR(SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, ORD(x)) / SYSTEM.VAL(SET, cs MOD 100H)));
x := CHR(SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, ORD(x)) / SYSTEM.VAL(SET, ORD(x) * 16)));
cs := SYSTEM.VAL(INTEGER,
( SYSTEM.VAL(SET, ORD(x) * 100H) + SYSTEM.VAL(SET, cs DIV 100H) )
/ SYSTEM.VAL(SET, ORD(x) DIV 16) / SYSTEM.VAL(SET, ORD(x) * 8)
)
END Update;
(* BEGIN ASSERT(LEN(CHAR) = 1); ASSERT(LEN(INTEGER) >= 4); ASSERT(LEN(SET >= 4)) *)
END CRC16CCITT8408.