;
; From Dallas Application note 27
;
; CRC-16 (x^16+x^15+x^2+x^0)
; No tables, No loops, No temporary registers used.
;
; This code is from Dallas Semiconductor Application Note 27:
;
; Understanding and Using Cyclic Redundancy Checks
; with Dallas Semiconductor iButton(TM) Products.
;
; This routine that calculates the same CRC as the hardware
; in the DS5001/2 secure micro.
;-----------------------------------------------------------------------
NAME CRC_test
?DT?CRC_test SEGMENT DATA
rseg ?DT?CRC_test
CRCH: ds 1
CRCL: ds 1
?CO?CRC_test SEGMENT CODE
RSEG ?CO?CRC_test
public CRC_test
CRC_test:
mov CRCH,#0
mov CRCL,#0
mov A,#080H
call CRC16
mov A,#075H
call CRC16
mov A,#08AH
call CRC16
mov A,#00BH
call CRC16
mov A,#075H
call CRC16
mov A,#0C7H
call CRC16
mov A,#0AAH
call CRC16
mov A,#075H
call CRC16
mov A,#0C7H
call CRC16
mov A,#055H
call CRC16
mov A,#043H
call CRC16
ljmp CRC_test
;CALCULATE CRC16 IN PARALLEL TO THE GREATEST EXTENT PRACTICAL
; INPUT: BYTE TO BE INCUDED IN CRC CALCULATION IS IN ACC
; OUTPUT: CRCH:CRCL UPDATED TO INCLUDE THE NEW BYTE
;
CRC16:
PUSH ACC ;save this in case the caller needs it
XRL A,CRCL
MOV CRCL,CRCH ;put the high byte of the crc in its dest..
MOV CRCH,A ;save data xor low(crc) for later
MOV C,P
JNC CRC0
XRL CRCL,#001H
CRC0:
RRC A ;get the low bit in c
JNC CRC1
XRL CRCL,#040H
CRC1:
MOV C,ACC.7
XRL A,CRCH ;compute the results for bits P...U
RRC A ;shift them into place
MOV CRCH,A ;and save them
JNC CRC2
XRL CRCL,#080H
CRC2:
POP ACC ;and restore everything and return
RET
end
Interested: