IMPLEMENTATION MODULE CRC; (* * REPERTOIRE * Release 1.6 * By Charles Bradford and Cole Brecheen * (c) Copyright 1985-1992 PMI * Green Bay, Wisconsin * All rights reserved * (414) 468-6040 * * $Header: D:/logfiles/mods/crc.mov 1.5 10 Mar 1991 15:25:48 coleb $ * * * Written and contributed by David Tingler of * Telepath Systems, Inc., in Norman, Oklahoma. * **** JDM October 3, 1989 fix (I hope) bug in AddCRC **** JDM/MBC March 21, 1990. Add CalcCRCChain to permit multiple buffers **** to be processed with successive calls. *) IMPORT LowLevel; IMPORT SYSTEM; VAR Initialized : BOOLEAN; VAR crctab: ARRAY [0..255] OF BITSET; (*$S-*) (*$R-*) (*$T-*) PROCEDURE CalcCRCChain ( lastCRC : CARDINAL; (* in - 0 first time, last otherwise *) BufAdr: SYSTEM.ADDRESS; BufSize: CARDINAL ): CARDINAL; VAR segm, offs, h, i: CARDINAL; BEGIN i := 0; h := BufSize - 1; segm := LowLevel.seg( BufAdr ); offs := LowLevel.ofs( BufAdr ); FOR i := 0 TO h DO AddCRC(lastCRC, LowLevel.PeekByte(segm, offs + i)); END; RETURN lastCRC; END CalcCRCChain; (**** end of "new" procedure. *) PROCEDURE CalcCRC( BufAdr: SYSTEM.ADDRESS; BufSize: CARDINAL ): CARDINAL; VAR segm, offs, h, i, crc: CARDINAL; BEGIN crc := 0; i := 0; h := BufSize - 1; segm := LowLevel.seg( BufAdr ); offs := LowLevel.ofs( BufAdr ); FOR i := 0 TO h DO AddCRC(crc, LowLevel.PeekByte(segm, offs + i)); END; RETURN crc; END CalcCRC; PROCEDURE AddCRC(VAR crc: CARDINAL; ch: SYSTEM.BYTE); VAR CRC, c: BITSET; tab: CARDINAL; BEGIN c := BITSET( ORD(ch) ); CRC := BITSET( crc ); tab := CARDINAL( (CRC / c) * {0..7} ); (* (crc XOR c) AND 0FFH *) (* CRC := (BITSET(CARDINAL(CRC) * 256) * {0..7}) / crctab[tab]; *) CRC := BITSET(CARDINAL(CRC) DIV 256) / crctab[tab]; (* SHIFT(crc, 8) XOR crctab[tab] *) crc := CARDINAL(CRC); END AddCRC; VAR i: CARDINAL; PROCEDURE InitNum(x: CARDINAL); BEGIN crctab[i] := BITSET(x); INC(i); END InitNum; PROCEDURE Init(); BEGIN IF Initialized THEN RETURN; ELSE Initialized := TRUE; END; LowLevel.Init(); i := 0; InitNum(00000H); InitNum(0C0C1H); InitNum(0C181H); InitNum(00140H); InitNum(0C301H); InitNum(003C0H); InitNum(00280H); InitNum(0C241H); InitNum(0C601H); InitNum(006C0H); InitNum(00780H); InitNum(0C741H); InitNum(00500H); InitNum(0C5C1H); InitNum(0C481H); InitNum(00440H); InitNum(0CC01H); InitNum(00CC0H); InitNum(00D80H); InitNum(0CD41H); InitNum(00F00H); InitNum(0CFC1H); InitNum(0CE81H); InitNum(00E40H); InitNum(00A00H); InitNum(0CAC1H); InitNum(0CB81H); InitNum(00B40H); InitNum(0C901H); InitNum(009C0H); InitNum(00880H); InitNum(0C841H); InitNum(0D801H); InitNum(018C0H); InitNum(01980H); InitNum(0D941H); InitNum(01B00H); InitNum(0DBC1H); InitNum(0DA81H); InitNum(01A40H); InitNum(01E00H); InitNum(0DEC1H); InitNum(0DF81H); InitNum(01F40H); InitNum(0DD01H); InitNum(01DC0H); InitNum(01C80H); InitNum(0DC41H); InitNum(01400H); InitNum(0D4C1H); InitNum(0D581H); InitNum(01540H); InitNum(0D701H); InitNum(017C0H); InitNum(01680H); InitNum(0D641H); InitNum(0D201H); InitNum(012C0H); InitNum(01380H); InitNum(0D341H); InitNum(01100H); InitNum(0D1C1H); InitNum(0D081H); InitNum(01040H); InitNum(0F001H); InitNum(030C0H); InitNum(03180H); InitNum(0F141H); InitNum(03300H); InitNum(0F3C1H); InitNum(0F281H); InitNum(03240H); InitNum(03600H); InitNum(0F6C1H); InitNum(0F781H); InitNum(03740H); InitNum(0F501H); InitNum(035C0H); InitNum(03480H); InitNum(0F441H); InitNum(03C00H); InitNum(0FCC1H); InitNum(0FD81H); InitNum(03D40H); InitNum(0FF01H); InitNum(03FC0H); InitNum(03E80H); InitNum(0FE41H); InitNum(0FA01H); InitNum(03AC0H); InitNum(03B80H); InitNum(0FB41H); InitNum(03900H); InitNum(0F9C1H); InitNum(0F881H); InitNum(03840H); InitNum(02800H); InitNum(0E8C1H); InitNum(0E981H); InitNum(02940H); InitNum(0EB01H); InitNum(02BC0H); InitNum(02A80H); InitNum(0EA41H); InitNum(0EE01H); InitNum(02EC0H); InitNum(02F80H); InitNum(0EF41H); InitNum(02D00H); InitNum(0EDC1H); InitNum(0EC81H); InitNum(02C40H); InitNum(0E401H); InitNum(024C0H); InitNum(02580H); InitNum(0E541H); InitNum(02700H); InitNum(0E7C1H); InitNum(0E681H); InitNum(02640H); InitNum(02200H); InitNum(0E2C1H); InitNum(0E381H); InitNum(02340H); InitNum(0E101H); InitNum(021C0H); InitNum(02080H); InitNum(0E041H); InitNum(0A001H); InitNum(060C0H); InitNum(06180H); InitNum(0A141H); InitNum(06300H); InitNum(0A3C1H); InitNum(0A281H); InitNum(06240H); InitNum(06600H); InitNum(0A6C1H); InitNum(0A781H); InitNum(06740H); InitNum(0A501H); InitNum(065C0H); InitNum(06480H); InitNum(0A441H); InitNum(06C00H); InitNum(0ACC1H); InitNum(0AD81H); InitNum(06D40H); InitNum(0AF01H); InitNum(06FC0H); InitNum(06E80H); InitNum(0AE41H); InitNum(0AA01H); InitNum(06AC0H); InitNum(06B80H); InitNum(0AB41H); InitNum(06900H); InitNum(0A9C1H); InitNum(0A881H); InitNum(06840H); InitNum(07800H); InitNum(0B8C1H); InitNum(0B981H); InitNum(07940H); InitNum(0BB01H); InitNum(07BC0H); InitNum(07A80H); InitNum(0BA41H); InitNum(0BE01H); InitNum(07EC0H); InitNum(07F80H); InitNum(0BF41H); InitNum(07D00H); InitNum(0BDC1H); InitNum(0BC81H); InitNum(07C40H); InitNum(0B401H); InitNum(074C0H); InitNum(07580H); InitNum(0B541H); InitNum(07700H); InitNum(0B7C1H); InitNum(0B681H); InitNum(07640H); InitNum(07200H); InitNum(0B2C1H); InitNum(0B381H); InitNum(07340H); InitNum(0B101H); InitNum(071C0H); InitNum(07080H); InitNum(0B041H); InitNum(05000H); InitNum(090C1H); InitNum(09181H); InitNum(05140H); InitNum(09301H); InitNum(053C0H); InitNum(05280H); InitNum(09241H); InitNum(09601H); InitNum(056C0H); InitNum(05780H); InitNum(09741H); InitNum(05500H); InitNum(095C1H); InitNum(09481H); InitNum(05440H); InitNum(09C01H); InitNum(05CC0H); InitNum(05D80H); InitNum(09D41H); InitNum(05F00H); InitNum(09FC1H); InitNum(09E81H); InitNum(05E40H); InitNum(05A00H); InitNum(09AC1H); InitNum(09B81H); InitNum(05B40H); InitNum(09901H); InitNum(059C0H); InitNum(05880H); InitNum(09841H); InitNum(08801H); InitNum(048C0H); InitNum(04980H); InitNum(08941H); InitNum(04B00H); InitNum(08BC1H); InitNum(08A81H); InitNum(04A40H); InitNum(04E00H); InitNum(08EC1H); InitNum(08F81H); InitNum(04F40H); InitNum(08D01H); InitNum(04DC0H); InitNum(04C80H); InitNum(08C41H); InitNum(04400H); InitNum(084C1H); InitNum(08581H); InitNum(04540H); InitNum(08701H); InitNum(047C0H); InitNum(04680H); InitNum(08641H); InitNum(08201H); InitNum(042C0H); InitNum(04380H); InitNum(08341H); InitNum(04100H); InitNum(081C1H); InitNum(08081H); InitNum(04040H); END Init; BEGIN Initialized := FALSE; Init(); END CRC.