; TITLE "SCRC1 - Syslib 4.0" NAME ('CRC1') ;================================================================= ; The Libraries, Version 4, (C) 1989 by Alpha Systems Corp. ;----------------------------------------------------------------- ; Author : Harold F. Bower ; Derived from SCRC1.MAC Ver 1.1 by Richard Conn ; Date : 17 Sep 89 ; Version : 1.2 ; Module : SCRC1 ; Abstract: This module contains the routines CRC1CLR, CRC1DONE ; and CRC1UPD which implement 16-bit Cyclic Redundancy Code ; for error checking with the X^16 + X^15 + X^2 + 1 poly- ; nomial as recommended by CCITT. It will guarantee detec- ; tion of al single and double bit errors, all errors with ; an odd number of error bits, all burst errors of length ; 16 or less, 99.9969% of all 17-bit error bursts, and ; 99.9984% of all possible longer error bursts. (Ref: ; Computer Networks, Andrew S Tanenbaum, Prentiss-Hall, 1981). ; These routines are typically used as follows: ; CRC1$MAKE: ; ROUTINE TO ESTABLISH CRC VALUE ; CALL CRC1CLR ; CLEAR CRC ; ; ACQUIRE VALUES ; CALL CRC1DONE ; GET VALUE ; LD (CRC1VAL),HL ; SAVE VALUE ; CRC1$CHECK: ; ROUTINE TO CHECK CRC VALUE ; CALL CRC1CLR ; CLEAR CRC1 ; ; ACQUIRE VALUES ; CALL CRC1DONE ; NOW DONE ; EX DE,HL ; VALUE IN DE ; LD HL,(CRC1VAL) ; FROM BEFORE ; CALL COMPHD ; COMPARE HL TO DE (SYSLIB ROUTINE) ; JP NZ,ERROR ; ERROR IF NOT EQUAL ; Revision: ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Module Entry Points PUBLIC CRC1CLR, CRC1DONE, CRC1UPD .Z80 CSEG ;=============================================================== ; NAME - CRC1CLR ; Entry: - None ; Exit : - None ; Uses : None ; Special Requirements: None ;=============================================================== CRC1CLR: PUSH HL LD HL,0 ; Set CRC to zero LD (CRCVAL),HL POP HL RET ;=============================================================== ; NAME - CRC1UPD ; Entry: A - Contains the byte to add to the CRC calculation ; Exit : - None ; Uses : - None ; Special Requirements: None ;=============================================================== CRC1UPD: PUSH AF ; Save all regs PUSH BC PUSH HL LD B,8 ; Rotate 8 bits LD C,A ; Byte in C LD HL,(CRCVAL) ; HL = Old CRC value UPDLOOP: RL C ; Rotate HLC as a 24-bit Acc left 1 bit ADC HL,HL JR NC,SKIPIT LD A,H ; The generator is X^16 + X^15 + X^2 + 1 XOR 80H ; as recommended by CCITT. LD H,A ; An alternate generator which is often LD A,L ; used in synchronous transmission protocols XOR 05H ; is X^16 + X^12 + X^5 + 1. This may be LD L,A ; used by substituting XOR 10H for XOR 80H ; and XOR 21H for XOR 05H in the adjacent code. SKIPIT: DJNZ UPDLOOP ; Count down 8 bits LD (CRCVAL),HL ; Save new CRC value POP HL ; Restore all POP BC POP AF RET ;=============================================================== ; NAME - CRC1DONE ; Entry: - None ; Exit : HL - Contains the Final CRC bytes to send (first H then L) ; Uses : HL ; Special Requirements: None ;=============================================================== CRC1DONE: PUSH AF ; Save A XOR A ; Send out 2 zeroes CALL CRC1UPD CALL CRC1UPD LD HL,(CRCVAL) ; Return CRC value in HL POP AF RET ; Buffer for CRC value DSEG ; Put in Data Segment CRCVAL: DEFS 2 END