home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* PARCRC.PAS *)
- (* Datenübertragung mit CRC-Checksumme *)
- (* (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 ParCRC;
-
- INTERFACE
-
- USES ParData, Crc, Crt;
-
- PROCEDURE SendCRCBuf(VAR Buf; Size : WORD);
- (* SendCRCBuf überträgt einen Block mit anschließendem *)
- (* CRC-16-Wort. Ist die Übertragung nicht geglückt, *)
- (* wird wiederholt. Vor dem ersten Aufruf von *)
- (* SendCRCBuf muß die CRC-Tabelle gesetzt sein. *)
-
- PROCEDURE ReceiveCRCBuf(VAR Buf; Size : WORD);
- (* ReceiveCRCBuf empfängt einen Block mit anschließendem*)
- (* CRC-Wert. Die Größe muß bekannt sein, da sonst keine *)
- (* fehlerfreie Übertragung möglich ist. *)
-
- IMPLEMENTATION
-
- TYPE
- OS = RECORD (* oder LongRec aus Unit Objects *)
- o, s : WORD;
- END;
-
- PROCEDURE SendCRCBuf(VAR Buf; Size : WORD);
- VAR
- Answer : WORD;
- BufPtr : POINTER;
- Buffer : ARRAY [0..65530] OF BYTE ABSOLUTE Buf;
- i : WORD;
- BEGIN
- (* Bei Fehler Abbruch *)
- IF LastResult <> ReadyToTransfer THEN Exit;
- (* in 512-Byte Blöcke zerlegen, um bei Fehlern nicht *)
- (* ganzen Block neu zu übertragen. *)
- i := 0;
- WHILE Size > 512 DO BEGIN
- SendCRCBuf(Buffer[i], 512);
- IF LastResult <> ReadyToTransfer THEN Exit;
- Inc(i, 512); Dec(Size, 512);
- END;
- (* Adresse normalisieren *)
- BufPtr := @Buffer[i];
- OS(BufPtr).s := OS(BufPtr).s + OS(BufPtr).o SHR 4;
- OS(BufPtr).o := OS(BufPtr).o AND $F;
- (* CRC-Summe berechnen *)
- CRC_16 := 0;
- Build_crc(BufPtr^, Size);
- (* Übertragen *)
- REPEAT
- IF TransferMode = Transfer4 THEN BEGIN
- (* 4-Bit-Übetragung *)
- SendBlock4(BufPtr^, Size);
- SendBlock4(CRC_16, 2);
- ReceiveBlock4(Answer, 2);
- END ELSE BEGIN
- (* 8-Bit-Übertragung *)
- SendBlock(BufPtr^, Size);
- SendBlock(CRC_16, 2);
- ReceiveBlock(Answer, 2);
- END;
- UNTIL (Answer = 0) OR (LastResult <> ReadyToTransfer);
- END;
-
- PROCEDURE ReceiveCRCBuf(VAR Buf; Size : WORD);
- VAR
- Follow : WORD;
- BufPtr : POINTER;
- Buffer : ARRAY [0..65530] OF BYTE ABSOLUTE Buf;
- i : WORD;
- BEGIN
- IF LastResult <> ReadyToTransfer THEN Exit;
- (* Zerlegen wie oben *)
- i := 0;
- WHILE Size > 512 DO BEGIN
- ReceiveCRCBuf(Buffer[i], 512);
- IF LastResult <> ReadyToTransfer THEN Exit;
- Inc(i, 512); Dec(Size, 512);
- END;
- (* Adresse normalisieren *)
- BufPtr := @Buffer[i];
- OS(BufPtr).s := OS(BufPtr).s + OS(BufPtr).o SHR 4;
- OS(BufPtr).o := OS(BufPtr).o AND $F;
- REPEAT
- CRC_16 := 0;
- IF TransferMode = Transfer4 THEN BEGIN
- (* 4-Bit-Übetragung *)
- ReceiveBlock4(BufPtr^, Size);
- Build_crc(BufPtr^, Size);
- ReceiveBlock4(Follow, 2);
- CRC_16 := CRC_16 XOR Follow;
- SendBlock4(CRC_16, 2);
- END ELSE BEGIN
- (* 8-Bit-Übetragung *)
- ReceiveBlock(BufPtr^, Size);
- Build_crc(BufPtr^, Size);
- ReceiveBlock(Follow, 2);
- CRC_16 := CRC_16 XOR Follow;
- SendBlock(CRC_16, 2);
- END;
- UNTIL (CRC_16 = 0) OR (LastResult <> ReadyToTransfer);
- END;
-
- END.
- (* ====================================================== *)
- (* Ende von PARCRC.PAS *)
-