crc.mod 5.1 KB

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