home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / PROTOCOL / TPHYD100.ZIP / CRC.PAS < prev    next >
Pascal/Delphi Source File  |  1993-08-18  |  6KB  |  125 lines

  1. {$A+,B-,D-,E-,F-,I-,L-,N-,O+,R-,S-,V-}
  2. (******************************************************************************)
  3. (*                      Hydra Bi-directional Protocol                         *)
  4. (*                        ─────────────────────────                           *)
  5. (*                                                                            *)
  6. (*                      CRC 16/32 Calculation Routines                        *)
  7. (*                                                                            *)
  8. (* BY: Adam Blake                                      Wandoo Valley Software *)
  9. (*     Arjen Lentz                                         and Lentz Software *)
  10. (* VER: 1.00                                                      Development *)
  11. (* DATE: 5th August 1993                                   (c) Copyright 1993 *)
  12. (* LANGUAGE: Turbo Pascal v6.0                  All Rights Reserved Worldwide *)
  13. (******************************************************************************)
  14. Unit Crc;
  15. Interface
  16.  
  17. type
  18.   Crc16Table     = ^Crc16TableType;
  19.   Crc16TableType = array[0..255] of word;
  20.  
  21.   Crc32Table     = ^Crc32TableType;
  22.   Crc32TableType = array[0..255] of longint;
  23.  
  24.  
  25. const
  26. (* CRC-16 used by ARC and LH, using Crc16___ routines                         *)
  27.   CRC16A_POLY      = $A001;              (* Generator polynomial number       *)
  28.   CRC16A_INIT      = $0;                 (* Initial CRC value for calculation *)
  29.   CRC16A_TEST      = $0;                 (* Result to test for at receiver    *)
  30.  
  31. (* CRC-16 CCITT proper                                                        *)
  32.   CRC16_POLY       = $8408;              (* Generator polynomial number       *)
  33.   CRC16_INIT       = $FFFF;              (* Initial CRC value for calculation *)
  34.   CRC16_TEST       = $F0B8;              (* Result to test for at receiver    *)
  35.  
  36. (* CRC-16 CCITT upside-down                                                   *)
  37.   CRC16R_POLY      = $1021;              (* Generator polynomial number       *)
  38.   CRC16R_INIT      = $0;                 (* Initial CRC value for calculation *)
  39.   CRC16R_TEST      = $0;                 (* Result to test for at receiver    *)
  40.  
  41. (* CRC-32 CCITT                                                               *)
  42.   CRC32_POLY      = $EDB88320;          (* Generator polynomial number        *)
  43.   CRC32_INIT      = $FFFFFFFF;          (* Initial CRC value for calculation  *)
  44.   CRC32_TEST      = $DEBB20E3;          (* Result to test for at receiver     *)
  45.  
  46. (* Number of items in CRC table                                               *)
  47.   CRC_TABSIZE = 256;                    (* Normal 256-entry table             *)
  48.  
  49.  
  50. (*** CRC-16 proper, used for both CCITT and the one used by ARC             ***)
  51. Procedure Crc16Init( CrcTab : CRC16Table; Poly : word );
  52. Function  Crc16Block( CrcTab : CRC16Table; Crc : word; Buf : pointer; Len : word ) : word;
  53. Function  Crc16Upd( CrcTab : CRC16Table; Crc : word; Buf : pointer; Ch : Byte ) : word;
  54. Function  Crc16Post( Crc : word ) : word;
  55.  
  56. (*** CRC-16 upside-down, transmitted high-byte first                        ***)
  57. Procedure Crc16RInit( CrcTab : CRC16Table; Poly : word );
  58. Function  Crc16RBlock( CrcTab : CRC16Table; Crc : word; Buf : pointer; Len : word ) : word;
  59. Function  Crc16RUpd( CrcTab : CRC16Table; Crc : word; Buf : pointer; Ch : Byte ) : word;
  60. Function  Crc16RPost( Crc : word ) : word;
  61.  
  62. (*** CRC-32                                                                 ***)
  63. Procedure Crc32Init( CrcTab : CRC32Table; Poly : longint );
  64. Function  Crc32Block( CrcTab : CRC32Table; Crc : longint; Buf : pointer; Len : word ) : longint;
  65. Function  Crc32Upd( CrcTab : CRC32Table; Crc : longint; Ch : Byte ) : longint;
  66. Function  Crc32Post( Crc : longint ) : longint;
  67.  
  68. (******************************************************************************)
  69. Implementation
  70.  
  71. {$L CRC.OBJ}
  72. Procedure  Crc16Init( CrcTab : CRC16Table; Poly : word ); external;
  73. Function   Crc16Block( CrcTab : CRC16Table; Crc : word; Buf : pointer; Len : word ) : word; external;
  74. Procedure  Crc16RInit( CrcTab : CRC16Table; Poly : word ); external;
  75. Function   Crc16RBlock( CrcTab : CRC16Table; Crc : word; Buf : pointer; Len : word ) : word; external;
  76. Procedure  Crc32Init( CrcTab : CRC32Table; Poly : longint ); external;
  77. Function   Crc32Block( CrcTab : CRC32Table; Crc : longint; Buf : pointer; Len : word ) : longint; external;
  78.  
  79.  
  80. Function Crc16APost( Crc : word ) : word;
  81. begin
  82.   Crc16APost := (not Crc);              (* CRC Postconditioning before xmit  *)
  83. end;
  84.  
  85.  
  86. Function Crc16Upd( CrcTab : CRC16Table; Crc : word; Buf : pointer; Ch : Byte ) : word;
  87. begin
  88.   Crc16Upd := CrcTab^[(Crc XOR Ch) AND $FF] XOR (Crc SHR 8);
  89. end;
  90.  
  91.  
  92. Function Crc16Post( Crc : word ) : word;
  93. begin
  94.   Crc16Post := (not Crc);               (* CRC Postconditioning before xmit  *)
  95. end;
  96.  
  97.  
  98. Function Crc16RUpd( CrcTab : CRC16Table; Crc : word; Buf : pointer; Ch : Byte ) : word;
  99. begin
  100.   Crc16RUpd := CrcTab^[((Crc SHR 8) XOR Ch) AND $FF] XOR (Crc SHL 8);
  101. end;
  102.  
  103.  
  104. Function Crc16RPost( Crc : word ) : word;
  105. begin
  106.   Crc16RPost := Crc;                    (* CRC Postconditioning before xmit  *)
  107. end;
  108.  
  109.  
  110. Function Crc32Upd( CrcTab : CRC32Table; Crc : longint; Ch : Byte ) : longint;
  111. begin
  112.   Crc32Upd := CrcTab^[(Crc XOR Ch) AND $FF] XOR (Crc SHR 8);
  113. end;
  114.  
  115.  
  116. Function Crc32Post( Crc : longint ) : longint;
  117. begin
  118.   Crc32Post := (not Crc);               (* CRC Postconditioning before xmit  *)
  119. end;
  120.  
  121. (**********************************MAINLINE************************************)
  122.  
  123. end.
  124.  
  125.