| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- 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.
|