home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / SYSLIB / SLIB1.LBR / SCRC2.Z80 < prev    next >
Text File  |  2000-06-30  |  3KB  |  115 lines

  1. ;
  2. ; SYSLIB Module Name:  SCRC2
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    crc2clr,crc2done,crc2upd
  8.  
  9. ;
  10. ;         These subroutines will compute and check a true 16-bit
  11. ;    Cyclic Redundancy Code for a message of arbitrary length.
  12. ;
  13. ;    The  use  of this scheme will guarantee detection of all
  14. ;    single and double bit errors, all  errors  with  an  odd
  15. ;    number  of  error bits, all burst errors of length 16 or
  16. ;    less, 99.9969% of all 17-bit error bursts, and  99.9984%
  17. ;    of  all  possible  longer  error bursts.  (Ref: Computer
  18. ;    Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)
  19. ;
  20. ;    These routines are typically used as follows:
  21. ;      CRC$MAKE:        ; ROUTINE TO ESTABLISH CRC VALUE
  22. ;        CALL    CRC2CLR    ; CLEAR CRC
  23. ;        <loop CALLing CRC2UPD>    ; ACQUIRE VALUES
  24. ;        CALL    CRC2DONE    ; GET VALUE
  25. ;        SHLD    CRCVAL    ; SAVE VALUE
  26. ;      CRC$CHECK:        ; ROUTINE TO CHECK CRC VALUE
  27. ;        CALL    CRC2CLR    ; CLEAR CRC
  28. ;        <loop CALLing CRC2UPD>    ; ACQUIRE VALUES
  29. ;        CALL    CRC2DONE    ; NOW DONE
  30. ;        XCHG        ; DE=RETURNED CRC
  31. ;        LHLD    CRCVAL    ; FROM BEFORE
  32. ;        CALL    COMPHD    ; COMPARE HL TO DE FOR EQUALITY
  33. ;        JNZ    ERROR    ; ERROR IF NOT EQUAL
  34. ;
  35.  
  36. ;
  37. ; CRC2CLR - Clear the CRC accumulator
  38. ;     This routine must be called at the start of each byte stream.
  39. ;
  40. ;     Input Parameters: None
  41. ;
  42. ;     Output Parameters: None
  43. ;
  44. CRC2CLR:
  45.     PUSH    HL
  46.     LD    HL,0    ;SET CRC TO ZERO
  47.     LD    (CRCVAL),HL
  48.     POP    HL
  49.     RET
  50.  
  51. ;
  52. ;  BUFFER FOR CRC VALUE
  53. ;
  54. CRCVAL:    DS    2
  55.  
  56. ;
  57. ; CRC2UPD - Update the CRC accumulator
  58. ;     This routine must be called once for each byte in the
  59. ;     byte stream for which the CRC is being calculated.
  60. ;
  61. ;     Input Parameters: A = byte to be included in CRC
  62. ;
  63. ;     Output Parameters: None
  64. ;
  65. ;    Adapted from Keith Petersen's CRCK 4.2 program.
  66. ;    Routine Originally By Fred Gutman.
  67. ;    From 'EDN' magazine, June 5, 1979 issue, page 84.
  68. ;
  69. CRC2UPD:
  70.     PUSH    HL    ;SAVE HL
  71.     PUSH    BC    ;SAVE BC
  72.     PUSH    AF    ;SAVE BYTE TO UPDATE
  73.     LD    B,A    ;SAVE BYTE IN B
  74.     LD    HL,(CRCVAL)    ;GET REMAINDER
  75.     LD    A,H
  76.     AND    128    ;Q-BIT MASK
  77.     PUSH    AF    ;SAVE STATUS
  78.     ADD    HL,HL    ;2 X R(X)
  79.     LD    A,B    ;GET BYTE
  80.     ADD    A,L
  81.     LD    L,A
  82.     POP    AF
  83.     JP    Z,CRCU1    ;IF Q-BIT IS ZERO
  84. ;
  85.     LD    A,H
  86.     XOR    0A0H    ;MS HALF OF GEN. POLY
  87.     LD    H,A
  88.     LD    A,L
  89.     XOR    97H    ;LS HALF OF GEN. POLY
  90.     LD    L,A
  91. ;
  92. CRCU1:
  93.     LD    (CRCVAL),HL    ;SAVE RESULT
  94.     POP    AF    ;RESTORE REGS
  95.     POP    BC
  96.     POP    HL
  97.     RET
  98.  
  99. ;
  100. ; CRC2DONE - Complete the CRC calculation
  101. ;    This routine is called after the last byte of the byte stream
  102. ;    has passed thru CRCUPD, and it returns the calculated
  103. ;    CRC bytes, which must be transmitted as the final
  104. ;    two bytes of the message (first H, then L).
  105. ;
  106. ;     Input Parameters: None
  107. ;
  108. ;     Output Parameters:  HL = calculated CRC bytes
  109. ;
  110. CRC2DONE:
  111.     LD    HL,(CRCVAL)    ;RETURN CRC VALUE IN HL
  112.     RET
  113.  
  114.     END
  115.