TestRecord bsf STATUS,RP1 ;#2
bcf STATUS,C ;clear carry for shift
rlf RecordNum+1,W ;record address = RecordNum*2
movwf EEADRH
rlf RecordNum,W
movwf EEADR
movlw low DataAddress ;add on base address of data
addwf EEADR,F
btfsc STATUS,C
incf EEADRH,F
movlw high DataAddress
addwf EEADRH,F
bsf STATUS,RP0 ;#3
bsf EECON1,EEPGD ;Program memory
bsf EECON1,RD ;Read
nop
nop
bcf STATUS,RP0 ;#2
movfw EEDAT
xorwf Record1,W ;check first byte of record
btfss STATUS,Z
goto NoMatch ;exit Z=0
movfw EEDATH
xorwf Record2,W ;check second byte
andlw 0x0f ;but only lower nibble
btfss STATUS,Z
goto NoMatch ;exit Z=0
incf EEADR,F ;move to other half of record
btfsc STATUS,Z ;crossed page boundary
incf EEADRH,F ;yes
bsf STATUS,RP0 ;#3
bsf EECON1,RD
nop
nop
bcf STATUS,RP0 ;#2
movfw EEDAT
xorwf Record3,W ;check third byte
btfss STATUS,Z
goto NoMatch ;exit Z=0
swapf Record2,W ;get unchecked nibble
xorwf EEDATH,W ;check against memory
andlw 0x0f ;ignore upper nibble
; here zero flag will be set as the records match
movlw 1
bcf STATUS,RP1 ;#0
return
NoMatch movlw 0
bcf STATUS,RP1 ;#0
return
DataAddress
dw 0x412,0x356 ;record = 0x123456
dw 0x745,0x689 ;record = 0x456789