CRC.MOD 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. IMPLEMENTATION MODULE CRC;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/crc.mov 1.5 10 Mar 1991 15:25:48 coleb $
  12. *
  13. *
  14. * Written and contributed by David Tingler of
  15. * Telepath Systems, Inc., in Norman, Oklahoma.
  16. *
  17. **** JDM October 3, 1989 fix (I hope) bug in AddCRC
  18. **** JDM/MBC March 21, 1990. Add CalcCRCChain to permit multiple buffers
  19. **** to be processed with successive calls.
  20. *)
  21. IMPORT LowLevel;
  22. IMPORT SYSTEM;
  23. VAR
  24. Initialized : BOOLEAN;
  25. VAR
  26. crctab: ARRAY [0..255] OF BITSET;
  27. (*$S-*)
  28. (*$R-*)
  29. (*$T-*)
  30. PROCEDURE CalcCRCChain
  31. ( lastCRC : CARDINAL; (* in - 0 first time, last otherwise *)
  32. BufAdr: SYSTEM.ADDRESS;
  33. BufSize: CARDINAL
  34. ): CARDINAL;
  35. VAR
  36. segm, offs, h, i: CARDINAL;
  37. BEGIN
  38. i := 0;
  39. h := BufSize - 1;
  40. segm := LowLevel.seg( BufAdr );
  41. offs := LowLevel.ofs( BufAdr );
  42. FOR i := 0 TO h DO
  43. AddCRC(lastCRC, LowLevel.PeekByte(segm, offs + i));
  44. END;
  45. RETURN lastCRC;
  46. END CalcCRCChain;
  47. (**** end of "new" procedure. *)
  48. PROCEDURE CalcCRC( BufAdr: SYSTEM.ADDRESS; BufSize: CARDINAL ): CARDINAL;
  49. VAR
  50. segm, offs, h, i, crc: CARDINAL;
  51. BEGIN
  52. crc := 0;
  53. i := 0;
  54. h := BufSize - 1;
  55. segm := LowLevel.seg( BufAdr );
  56. offs := LowLevel.ofs( BufAdr );
  57. FOR i := 0 TO h DO
  58. AddCRC(crc, LowLevel.PeekByte(segm, offs + i));
  59. END;
  60. RETURN crc;
  61. END CalcCRC;
  62. PROCEDURE AddCRC(VAR crc: CARDINAL; ch: SYSTEM.BYTE);
  63. VAR
  64. CRC, c: BITSET;
  65. tab: CARDINAL;
  66. BEGIN
  67. c := BITSET( ORD(ch) );
  68. CRC := BITSET( crc );
  69. tab := CARDINAL( (CRC / c) * {0..7} );
  70. (* (crc XOR c) AND 0FFH *)
  71. (* CRC := (BITSET(CARDINAL(CRC) * 256) * {0..7}) / crctab[tab]; *)
  72. CRC := BITSET(CARDINAL(CRC) DIV 256) / crctab[tab];
  73. (* SHIFT(crc, 8) XOR crctab[tab] *)
  74. crc := CARDINAL(CRC);
  75. END AddCRC;
  76. VAR i: CARDINAL;
  77. PROCEDURE InitNum(x: CARDINAL);
  78. BEGIN
  79. crctab[i] := BITSET(x);
  80. INC(i);
  81. END InitNum;
  82. PROCEDURE Init();
  83. BEGIN
  84. IF Initialized THEN
  85. RETURN;
  86. ELSE
  87. Initialized := TRUE;
  88. END;
  89. LowLevel.Init();
  90. i := 0;
  91. InitNum(00000H); InitNum(0C0C1H); InitNum(0C181H); InitNum(00140H);
  92. InitNum(0C301H); InitNum(003C0H); InitNum(00280H); InitNum(0C241H);
  93. InitNum(0C601H); InitNum(006C0H); InitNum(00780H); InitNum(0C741H);
  94. InitNum(00500H); InitNum(0C5C1H); InitNum(0C481H); InitNum(00440H);
  95. InitNum(0CC01H); InitNum(00CC0H); InitNum(00D80H); InitNum(0CD41H);
  96. InitNum(00F00H); InitNum(0CFC1H); InitNum(0CE81H); InitNum(00E40H);
  97. InitNum(00A00H); InitNum(0CAC1H); InitNum(0CB81H); InitNum(00B40H);
  98. InitNum(0C901H); InitNum(009C0H); InitNum(00880H); InitNum(0C841H);
  99. InitNum(0D801H); InitNum(018C0H); InitNum(01980H); InitNum(0D941H);
  100. InitNum(01B00H); InitNum(0DBC1H); InitNum(0DA81H); InitNum(01A40H);
  101. InitNum(01E00H); InitNum(0DEC1H); InitNum(0DF81H); InitNum(01F40H);
  102. InitNum(0DD01H); InitNum(01DC0H); InitNum(01C80H); InitNum(0DC41H);
  103. InitNum(01400H); InitNum(0D4C1H); InitNum(0D581H); InitNum(01540H);
  104. InitNum(0D701H); InitNum(017C0H); InitNum(01680H); InitNum(0D641H);
  105. InitNum(0D201H); InitNum(012C0H); InitNum(01380H); InitNum(0D341H);
  106. InitNum(01100H); InitNum(0D1C1H); InitNum(0D081H); InitNum(01040H);
  107. InitNum(0F001H); InitNum(030C0H); InitNum(03180H); InitNum(0F141H);
  108. InitNum(03300H); InitNum(0F3C1H); InitNum(0F281H); InitNum(03240H);
  109. InitNum(03600H); InitNum(0F6C1H); InitNum(0F781H); InitNum(03740H);
  110. InitNum(0F501H); InitNum(035C0H); InitNum(03480H); InitNum(0F441H);
  111. InitNum(03C00H); InitNum(0FCC1H); InitNum(0FD81H); InitNum(03D40H);
  112. InitNum(0FF01H); InitNum(03FC0H); InitNum(03E80H); InitNum(0FE41H);
  113. InitNum(0FA01H); InitNum(03AC0H); InitNum(03B80H); InitNum(0FB41H);
  114. InitNum(03900H); InitNum(0F9C1H); InitNum(0F881H); InitNum(03840H);
  115. InitNum(02800H); InitNum(0E8C1H); InitNum(0E981H); InitNum(02940H);
  116. InitNum(0EB01H); InitNum(02BC0H); InitNum(02A80H); InitNum(0EA41H);
  117. InitNum(0EE01H); InitNum(02EC0H); InitNum(02F80H); InitNum(0EF41H);
  118. InitNum(02D00H); InitNum(0EDC1H); InitNum(0EC81H); InitNum(02C40H);
  119. InitNum(0E401H); InitNum(024C0H); InitNum(02580H); InitNum(0E541H);
  120. InitNum(02700H); InitNum(0E7C1H); InitNum(0E681H); InitNum(02640H);
  121. InitNum(02200H); InitNum(0E2C1H); InitNum(0E381H); InitNum(02340H);
  122. InitNum(0E101H); InitNum(021C0H); InitNum(02080H); InitNum(0E041H);
  123. InitNum(0A001H); InitNum(060C0H); InitNum(06180H); InitNum(0A141H);
  124. InitNum(06300H); InitNum(0A3C1H); InitNum(0A281H); InitNum(06240H);
  125. InitNum(06600H); InitNum(0A6C1H); InitNum(0A781H); InitNum(06740H);
  126. InitNum(0A501H); InitNum(065C0H); InitNum(06480H); InitNum(0A441H);
  127. InitNum(06C00H); InitNum(0ACC1H); InitNum(0AD81H); InitNum(06D40H);
  128. InitNum(0AF01H); InitNum(06FC0H); InitNum(06E80H); InitNum(0AE41H);
  129. InitNum(0AA01H); InitNum(06AC0H); InitNum(06B80H); InitNum(0AB41H);
  130. InitNum(06900H); InitNum(0A9C1H); InitNum(0A881H); InitNum(06840H);
  131. InitNum(07800H); InitNum(0B8C1H); InitNum(0B981H); InitNum(07940H);
  132. InitNum(0BB01H); InitNum(07BC0H); InitNum(07A80H); InitNum(0BA41H);
  133. InitNum(0BE01H); InitNum(07EC0H); InitNum(07F80H); InitNum(0BF41H);
  134. InitNum(07D00H); InitNum(0BDC1H); InitNum(0BC81H); InitNum(07C40H);
  135. InitNum(0B401H); InitNum(074C0H); InitNum(07580H); InitNum(0B541H);
  136. InitNum(07700H); InitNum(0B7C1H); InitNum(0B681H); InitNum(07640H);
  137. InitNum(07200H); InitNum(0B2C1H); InitNum(0B381H); InitNum(07340H);
  138. InitNum(0B101H); InitNum(071C0H); InitNum(07080H); InitNum(0B041H);
  139. InitNum(05000H); InitNum(090C1H); InitNum(09181H); InitNum(05140H);
  140. InitNum(09301H); InitNum(053C0H); InitNum(05280H); InitNum(09241H);
  141. InitNum(09601H); InitNum(056C0H); InitNum(05780H); InitNum(09741H);
  142. InitNum(05500H); InitNum(095C1H); InitNum(09481H); InitNum(05440H);
  143. InitNum(09C01H); InitNum(05CC0H); InitNum(05D80H); InitNum(09D41H);
  144. InitNum(05F00H); InitNum(09FC1H); InitNum(09E81H); InitNum(05E40H);
  145. InitNum(05A00H); InitNum(09AC1H); InitNum(09B81H); InitNum(05B40H);
  146. InitNum(09901H); InitNum(059C0H); InitNum(05880H); InitNum(09841H);
  147. InitNum(08801H); InitNum(048C0H); InitNum(04980H); InitNum(08941H);
  148. InitNum(04B00H); InitNum(08BC1H); InitNum(08A81H); InitNum(04A40H);
  149. InitNum(04E00H); InitNum(08EC1H); InitNum(08F81H); InitNum(04F40H);
  150. InitNum(08D01H); InitNum(04DC0H); InitNum(04C80H); InitNum(08C41H);
  151. InitNum(04400H); InitNum(084C1H); InitNum(08581H); InitNum(04540H);
  152. InitNum(08701H); InitNum(047C0H); InitNum(04680H); InitNum(08641H);
  153. InitNum(08201H); InitNum(042C0H); InitNum(04380H); InitNum(08341H);
  154. InitNum(04100H); InitNum(081C1H); InitNum(08081H); InitNum(04040H);
  155. END Init;
  156. BEGIN
  157. Initialized := FALSE;
  158. Init();
  159. END CRC.