
I2CCTR	EQU	10H
I2CAD	EQU	11H
REG3	EQU	12H
REG2	EQU	13H
REG1	EQU	14H
REG0	EQU	15H

GENR0	EQU	8H
GENR1	EQU	9H
BIT_COUNT EQU	9H
GENR2	EQU	0AH
BYTE_COUNT EQU	0AH


	movlw	4H
write
	MOVWF	BYTE_COUNT
	MOVLW	B8583W
WR_ABC
	MOVWF	I2CCTR
	MOVFW	GENR0
;
WR_MEM
	MOVWF	I2CAD
WR_MEM0
	MOVLW	IORA
	TRIS	RA
	BSF	RA,SCL
	MOVLW	I2CCTR+$20
	MOVWF	FSR
M_START
	NOP
	BTFSS	RA,SDA
	RETLW	0FFH
;	GOTO	^-1

	MOVLW	E2OUT
	TRIS	RA
	NOP
	BCF	RA,SDA		; to start
NXBY
WR_BYTE
	MOVLW	8H
	MOVWF	BIT_COUNT
BIT_LOOP
	nop
	RLF	0H
	BCF	RA,SCL
	BTFSS	3,0
	GOTO	^+3
	BSF	RA,SDA
	GOTO	^+2
	BCF	RA,SDA
	NOP
	NOP

	BSF	RA,SCL
	DECFSZ	BIT_COUNT
	GOTO	BIT_LOOP
	NOP
	NOP
	BCF	RA,SCL
	NOP
ACKG
	NOP
	MOVLW	IORA
	TRIS	RA
	BSF	RA,SCL
	NOP
	BTFSC	RA,SDA
	GOTO	ACKG

	INCF	FSR
	NOP
	bcf	RA,SCL
	MOVLW	E2OUT
	TRIS	RA
	DECFSZ	BYTE_COUNT
	GOTO	NXBY
;
W_STOP
	MOVLW	I2CAD+$0A2
	SUBWF	FSR,W
	BTFSS	3,0
	RETLW	0H
M_STOP
	BCF	RA,SDA
	NOP
	BSF	RA,SCL
	MOVLW	IORA
	NOP
	NOP
	NOP
	BSF	RA,SDA
	TRIS	RA
	RETLW	0H

;------------------------------
;
ST_CMEMAD
	MOVFW	GENR0
	MOVWF	I2CAD
	MOVLW	C02W
	MOVWF	I2CCTR
	MOVLW	C02R
	MOVWF	REG3
;
ST_MEMAD
	MOVLW	2
	MOVWF	BYTE_COUNT
	CALL	WR_MEM0
	MOVLW	1
	MOVWF	BYTE_COUNT
	MOVFW	REG3
	MOVWF	I2CCTR
	CALL	WR_MEM0
	RETLW	0H
;--------------------------

RD_BYTES
	MOVWF	BYTE_COUNT
	MOVLW	REG3+$20
	MOVWF	FSR
RNXTB
	BCF	RA,SCL
	MOVLW	IORA
	tris	RA
	MOVLW	8H
	MOVWF	BIT_COUNT
RNX
	BCF	RA,SCL
	NOP
	BCF	3H,0
	BTFSC	RA,SDA
	BSF	3H,0
	RLF	0H

	BSF	RA,SCL
	NOP
	DECFSZ	BIT_COUNT
	GOTO	RNX

	INCF	FSR
	MOVLW	E2OUT
	BCF	RA,SCL
	TRIS	RA
	DECFSZ	BYTE_COUNT
	GOTO	T_ACKG
R_STOP
	CALL	M_STOP
	RETLW	0H
;
T_ACKG
	BCF	RA,SDA
	NOP
	BSF	RA,SCL
	XORLW	0FFH
	XORLW	0FFH
	XORLW	0FFH
	GOTO	RNXTB
