;******************************************************************
ow.RdBuf
movwf DigCtr ; save digit count (8 or 9) |B0
clrf CRC ; clear CRC var |B0
movlw owBuf ; address of 9 byte 'owBuf' |B0
movwf FSR ; setup indirect access |B0
ow.RdByte
movlw 8 ; |B0
movwf BitCtr ; bit counter = 8 |B0
ow.RxBit
DelayUS(tSlot-tClk-tRd) ; delay 50 usecs |B0
owRdBit ; returns C = data bit |B0
rrf INDF,F ; |B0
decfsz BitCtr,F ; all 8 bits? yes, skip, else |B0
goto ow.RxBit ; read next bit |B0
;
; crc ^= IOByte;
; for (i = 0; i < 8; i++)
; { if (crc & 1)
; crc = (crc >> 1) ^ 0x8C;
; else
; crc = crc >> 1;
; }
;
movf INDF,W ; W = current byte |B0
xorwf CRC,F ; |B0
bsf BitCtr,3 ; bit counter = 8 |B0
movlw h'8C' ; W = x8+x5+x4+1 polynomial |B0
NxtCRC
clrc ; |B0
rrf CRC,F ; |B0
skpnc ; |B0
xorwf CRC,F ; toggle b7, b3, and b2 bits |B0
decfsz BitCtr,F ; all done? yes, skip, else |B0
goto NxtCRC ; process next bit |B0
;
incf FSR,f ; inc 'owBuf' array postion |B0
decfsz DigCtr,F ; all 8/9 bytes? yes, skip, else |B0
goto ow.RdByte ; collect another byte |B0
return ; |B0