home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / remote / crc.pas next >
Encoding:
Pascal/Delphi Source File  |  1993-08-06  |  2.5 KB  |  87 lines

  1. (* ====================================================== *)
  2. (*                        CRC.PAS                         *)
  3. (*   Berechnung einer Checksumme nach dem                 *)
  4. (*   Cyclical Redundancy Check                            *)
  5. (*         (c) 1993 Ralf Hensmann & DMV-Verlag            *)
  6. (* ====================================================== *)
  7. {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
  8. {$M 16384,0,655360}
  9.  
  10. UNIT Crc;
  11.  
  12. INTERFACE
  13.  
  14. VAR
  15.   CRC_Table : ARRAY [0..255] OF WORD;
  16.   CRC_16    : WORD;
  17.  
  18. CONST
  19.   CCitt  = $1021; { eigentlich $11021 }
  20.   BiSync = $1005; { eigentlich $11005 }
  21.  
  22.   PROCEDURE Make_CRC_Table(Gen_Poly : WORD);
  23.   (* Baut aus übergebenem Generatorpolynom die Tabelle    *)
  24.   (* auf. Auf das führende 1-Bit des Polynoms wurde ver-  *)
  25.   (* zichtet, um nicht einen LongInt übergeben zu müssen. *)
  26.  
  27.   PROCEDURE Build_CRC(VAR Buf; Size : WORD);
  28.   (* Berechnet CRC-Summe aus alter Summe und Buffer. Wenn *)
  29.   (* Sie neu beginnen, müssen Sie vorher CRC_16 auf 0     *)
  30.   (* setzen! Das Ergebnis ist in CRC_16 abgelegt. Der     *)
  31.   (* Aufbau geschah so, um mehrere Blöcke hintereinander  *)
  32.   (* mit einer CRC-Checksumme zu berechnen.               *)
  33.  
  34. IMPLEMENTATION
  35.  
  36.   PROCEDURE Make_CRC_Table(Gen_Poly : WORD);
  37.   VAR
  38.     Lauf, Temp, DivLauf, DivHigh : BYTE;
  39.     DivCRC, TempCRC              : WORD;
  40.   BEGIN
  41.     FOR Lauf := 0 TO 255 DO BEGIN
  42.       Temp    := Lauf;
  43.       TempCRC := 0;
  44.       DivHigh := Hi(Gen_Poly SHR 1) OR $80;
  45.       DivCRC  := Gen_Poly SHL 7;
  46.       DivLauf := $80;
  47.       WHILE Temp <> 0 DO BEGIN
  48.         IF Temp >= DivLauf THEN BEGIN
  49.           Temp    := Temp    XOR DivHigh;
  50.           TempCRC := TempCRC XOR DivCRC;
  51.         END;
  52.         DivLauf := DivLauf SHR 1;
  53.         IF Odd(Divhigh) THEN
  54.           DivCRC := (DivCRC SHR 1) OR $8000
  55.         ELSE
  56.           DivCRC := (DivCRC SHR 1);
  57.         Divhigh := Divhigh SHR 1;
  58.       END;
  59.       CRC_Table[Lauf] := TempCRC;
  60.     END;
  61.   END;
  62.  
  63.   PROCEDURE Build_CRC(VAR Buf; Size : WORD); ASSEMBLER;
  64.   ASM
  65.     MOV   AX,CRC_16
  66.     MOV   CX,Size
  67.     LES   SI,Buf
  68.     LEA   DI,CRC_Table
  69.   @Buffer_Loop:
  70.     MOV   BL,ES:[SI]
  71.     INC   SI
  72.     SUB   BH,BH
  73.     XOR   BL,AH
  74.     MOV   AH,AL
  75.     SUB   AL,AL
  76.     SHL   BX,1
  77.     XOR   AX,[BX+DI]
  78.     LOOP  @Buffer_Loop
  79.     MOV   CRC_16,AX
  80.   END;
  81.  
  82. BEGIN
  83.   Make_CRC_Table(CCitt);
  84. END.
  85. (* ====================================================== *)
  86. (*                        CRC.PAS                         *)
  87.