; 
; 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: