; F:\AVR\CRC8.ALS 29-Apr-00 07:53:22am ; --------------- ; ;Library subroutine CRC8 ;Calculates CRC-8 of a string ;runs on any Atmel AVR microcontroller that has SRAM stack ;(result matches Dallas Semiconductor's One-Wire [DOW] CRC8 algorithm) ;(use this subroutine to check the CRC8 on serial numbers from Dallas iButtons) ; ;written by E. Nicholas Cupery Farba Research 29 April 2000 ; ;on input: ; X register must point to the string in SRAM ; rCount register must hold the byte-count of the string [0 means 256] ;on exit: ; rCRC8 holds the CRC-8 result ; all other registers are preserved ; c-bit is indeterminate ; CRC8: push XH ;save XH push XL ;save XL push rChar ;save rChar push rCount ;save rCount push rBitCount ;save rBitCount push rTemp ;save rTemp clr rCRC8 ;start with a zero CRC-8 ;begin loop to do each byte in the string CRC8BYT:ld rChar,X+ ;fetch next string byte and bump pointer ldi rBitCount,8 ;load the bit-counter for this byte ;begin loop to do each bit in the byte CRC8BIT:mov rTemp,rChar ;get a temporary copy of current data eor rTemp,rCRC8 ;XOR the data byte with the current CRC lsr rCRC8 ;position to the new CRC lsr rChar ;position to next bit of this byte lsr rTemp ;get low bit of old result into c-bit brcc CRC8NA ;br if low bit was clear (no adjustment) ldi rTemp,$8C ;magical value needed for CRC-8s eor rCRC8,rTemp ;fold in the magic CRC8 value CRC8NA: dec rBitCount ;count the previous bit done brne CRC8BIT ;br if not done all bits in this byte ;end loop to do each bit in the byte dec rCount ;count this byte done brne CRC8BYT ;br if not done all bytes in the string ;end loop to do each byte in the string pop rTemp ;restore rTemp pop rBitCount ;restore rBitCount pop rCount ;restore rCount pop rChar ;restore rChar pop XL ;restore XL pop XH ;restore XH ret ;return to caller ; ;END OF SUBROUTINE CRC8