home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* CRC.PAS *)
- (* Berechnung einer Checksumme nach dem *)
- (* Cyclical Redundancy Check *)
- (* (c) 1993 Ralf Hensmann & DMV-Verlag *)
- (* ====================================================== *)
- {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
- {$M 16384,0,655360}
-
- UNIT Crc;
-
- INTERFACE
-
- VAR
- CRC_Table : ARRAY [0..255] OF WORD;
- CRC_16 : WORD;
-
- CONST
- CCitt = $1021; { eigentlich $11021 }
- BiSync = $1005; { eigentlich $11005 }
-
- PROCEDURE Make_CRC_Table(Gen_Poly : WORD);
- (* Baut aus übergebenem Generatorpolynom die Tabelle *)
- (* auf. Auf das führende 1-Bit des Polynoms wurde ver- *)
- (* zichtet, um nicht einen LongInt übergeben zu müssen. *)
-
- PROCEDURE Build_CRC(VAR Buf; Size : WORD);
- (* Berechnet CRC-Summe aus alter Summe und Buffer. Wenn *)
- (* Sie neu beginnen, müssen Sie vorher CRC_16 auf 0 *)
- (* setzen! Das Ergebnis ist in CRC_16 abgelegt. Der *)
- (* Aufbau geschah so, um mehrere Blöcke hintereinander *)
- (* mit einer CRC-Checksumme zu berechnen. *)
-
- IMPLEMENTATION
-
- PROCEDURE Make_CRC_Table(Gen_Poly : WORD);
- VAR
- Lauf, Temp, DivLauf, DivHigh : BYTE;
- DivCRC, TempCRC : WORD;
- BEGIN
- FOR Lauf := 0 TO 255 DO BEGIN
- Temp := Lauf;
- TempCRC := 0;
- DivHigh := Hi(Gen_Poly SHR 1) OR $80;
- DivCRC := Gen_Poly SHL 7;
- DivLauf := $80;
- WHILE Temp <> 0 DO BEGIN
- IF Temp >= DivLauf THEN BEGIN
- Temp := Temp XOR DivHigh;
- TempCRC := TempCRC XOR DivCRC;
- END;
- DivLauf := DivLauf SHR 1;
- IF Odd(Divhigh) THEN
- DivCRC := (DivCRC SHR 1) OR $8000
- ELSE
- DivCRC := (DivCRC SHR 1);
- Divhigh := Divhigh SHR 1;
- END;
- CRC_Table[Lauf] := TempCRC;
- END;
- END;
-
- PROCEDURE Build_CRC(VAR Buf; Size : WORD); ASSEMBLER;
- ASM
- MOV AX,CRC_16
- MOV CX,Size
- LES SI,Buf
- LEA DI,CRC_Table
- @Buffer_Loop:
- MOV BL,ES:[SI]
- INC SI
- SUB BH,BH
- XOR BL,AH
- MOV AH,AL
- SUB AL,AL
- SHL BX,1
- XOR AX,[BX+DI]
- LOOP @Buffer_Loop
- MOV CRC_16,AX
- END;
-
- BEGIN
- Make_CRC_Table(CCitt);
- END.
- (* ====================================================== *)
- (* CRC.PAS *)
-