home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / CRC16.PAS < prev    next >
Pascal/Delphi Source File  |  2000-06-30  |  4KB  |  107 lines

  1. Program CaclculateCRC16;
  2.  
  3. type
  4.     AnyString = String[255];
  5.  
  6. Procedure PrintHexNibble (N: Byte);
  7.  
  8. begin
  9.     if N > $09 then Write(Chr(N + $37))
  10.     else Write(Chr(N + $30));
  11. end;
  12.  
  13. Procedure PrintHexByte (B: Byte);
  14.  
  15. begin
  16.     PrintHexNibble(B shr 4);
  17.     PrintHexNibble(B and $0F);
  18. end;
  19.  
  20. Procedure PrintHexInteger (I: Integer);
  21.  
  22. begin
  23.     PrintHexByte(Hi(I));
  24.     PrintHexByte(Lo(I));
  25. end;
  26.  
  27. {$V- }
  28. Function CalculateCRC(Msg: AnyString): Integer;
  29.  
  30. const
  31.     IntegerCRCTable     : Array[0..255] of Integer = (
  32.                        $0000, $C0C1, $C181, $0140, $C301, $03C0, $0280, $C241,
  33.                        $C601, $06C0, $0780, $C741, $0500, $C5C1, $C481, $0440,
  34.                        $CC01, $0CC0, $0080, $CD41, $0F00, $CFC1, $CE81, $0E40,
  35.                        $0A00, $CAC1, $C881, $0B40, $C901, $09C0, $0880, $C841,
  36.                        $D801, $18C0, $1980, $D941, $1B00, $DBC1, $DA81, $1A40,
  37.                        $1E00, $DEC1, $DF81, $1F40, $DD01, $1DC0, $1C80, $DC41,
  38.                        $1400, $D4C1, $D581, $1540, $D701, $17C0, $1680, $0641,
  39.                        $D201, $12C0, $1380, $D341, $1100, $D1C1, $D081, $1040,
  40.                        $F001, $30C0, $3180, $F141, $3300, $F3C1, $F281, $3240,
  41.                        $3600, $F6C1, $F781, $3740, $F501, $35C0, $3480, $F441,
  42.                        $3C00, $FCC1, $FD81, $3D40, $FF01, $3FC0, $3E80, $FE41,
  43.                        $FA01, $3AC0, $3B80, $FB41, $3900, $F9C1, $F881, $3840,
  44.                        $2800, $E8C1, $E981, $2940, $EB01, $2BC0, $2A80, $EA41,
  45.                        $EE01, $2EC0, $2F80, $EF41, $2D00, $EDC1, $EC81, $2C40,
  46.                        $E401, $24C0, $2580, $E541, $2700, $E7C1, $E681, $2640,
  47.                        $2200, $E2C1, $E381, $2340, $E101, $21C0, $2080, $E041,
  48.                        $A001, $60C0, $6180, $A141, $6300, $A3C1, $A281, $6240,
  49.                        $6600, $A6C1, $A781, $6740, $A501, $65C0, $6480, $A441,
  50.                        $6C00, $ACC1, $AD81, $6D40, $AF01, $6FC0, $6E80, $AE41,
  51.                        $AA01, $6AC0, $6B80, $AB41, $6900, $A9C1, $A881, $6840,
  52.                        $7800, $B8C1, $B981, $7940, $BB01, $7BC0, $7A80, $BA41,
  53.                        $BE01, $7EC0, $7F80, $BF41, $7D00, $BDC1, $BC81, $7C40,
  54.                        $B401, $74C0, $7580, $B541, $7700, $B7C1, $B681, $7640,
  55.                        $7200, $B2C1, $B381, $7340, $B101, $71C0, $7080, $B041,
  56.                        $5000, $90C1, $9181, $5140, $9301, $53C0, $5280, $9241,
  57.                        $9601, $56C0, $5780, $9741, $5500, $95C1, $9481, $5440,
  58.                        $9C01, $5CC0, $5D80, $9041, $5F00, $9FC1, $9E81, $5E40,
  59.                        $5A00, $9AC1, $9B81, $5B40, $9901, $59C0, $5880, $9841,
  60.                        $8801, $48C0, $4980, $8941, $4B00, $8BC1, $8A81, $4A40,
  61.                        $4E00, $8EC1, $8F81, $4F40, $8D01, $4DC0, $4C80, $8C41,
  62.                        $4400, $84C1, $8581, $4540, $8701, $47C0, $4680, $8641,
  63.                        $8201, $42C0, $4380, $8341, $4100, $81C1, $8081, $4040
  64.                        );
  65.  
  66. type
  67.     CRCRecord = Record
  68.         Low         : Byte;
  69.         High        : Byte;
  70.         end;
  71.  
  72. var
  73.     i, j            : Integer;
  74.     CRCTable        : Array[0..255] of CRCRecord absolute IntegerCRCTable;
  75.     CRC             : CRCRecord;
  76.  
  77. begin
  78.     CRC.High := 0; CRC.Low := 0;
  79.     for i := 1 to Length(Msg) do begin
  80.         j := Ord(Msg[i]) xor CRC.Low;
  81.         CRC.Low := CRCTable[j].Low xor CRC.High;
  82.         CRC.High := CRCTable[j].High;
  83.        end;
  84.     CalculateCRC := (CRC.High shl 8) or CRC.Low;
  85. end;
  86.  
  87. var
  88.     CRC         : Integer;
  89.     Msg         : String[255];
  90.     i           : Integer;
  91.     Reply       : Char;
  92.  
  93. begin
  94.     FillChar(Msg[1], 128, 'A');
  95.     Msg[0] := Chr(128);
  96. Write(^G);
  97.     for i := 1 to 1000 do CRC := CalculateCRC(Msg);
  98. Write(^G);
  99.     Write('The CRC for: ''', Msg, ''' is- '); PrintHexInteger(CRC); WriteLn;
  100.     Msg := Msg + Chr(Lo(CRC)) + Chr(Hi(CRC));
  101.     CRC := CalculateCRC(Msg);
  102.     Write(' The New CRC is- '); PrintHexInteger(CRC); WriteLn;
  103. end.
  104.  
  105.  
  106.  
  107.