	LIST P=18f4525
	#include <P18F4525.INC>

CBLOCK
	SERIAL_RX_BYTE
	SLAVE_ADDRESS
	EEPROM_HIGH_ADDRESS
	EEPROM_LOW_ADDRESS
	EEPROM_DATA	
	CIKLUS_VALTOZO
	CIKLUS_VALTOZO_2	
	BUFFER0
	BUFFER1
	BUFFER2
	BUFFER3
	BUFFER4
	BUFFER5
	BUFFER6
	BUFFER7
	BUFFER8
	BUFFER9
	BUFFER10
	BUFFER11
	BUFFER12
	BUFFER13
	BUFFER14
	BUFFER15
	BUFFER16
	BUFFER17
	BUFFER18
	BUFFER19
	BUFFER20
	BUFFER21
	BUFFER22
	BUFFER23
	BUFFER24
	BUFFER25
	BUFFER26
	BUFFER27
	BUFFER28
	BUFFER29
	BUFFER30
	BUFFER31
	WREG_TEMP
	STATUS_TEMP	
ENDC

ORG	0
GOTO	START

ORG	8
GOTO	MEGSZAKITAS

START
	NOP
	CALL	I2C_EEPROM_INIT
	CALL	SERIAL_INIT	
		
	IDE:
		NOP
	BRA	IDE
	
;------------------------------------------------------------------------
;INICIALIZÁLÁS
;------------------------------------------------------------------------	
I2C_EEPROM_INIT:
	BSF	SSPSTAT,SMP
	BSF	SSPCON1,SSPEN
	BSF	SSPCON1,SSPM3	
	MOVLW	0X09		;4MHz ESETÉN 100kHz BEÁLLÍTÁSA
	MOVWF	SSPADD
	
	MOVLW	0XA0
	MOVWF	SLAVE_ADDRESS
	
	BSF	TRISC,3		
	BSF	PORTC,3		
	BSF	TRISC,4		
	BSF	PORTC,4	
RETURN
;------------------------------------------------------------------------
;SLAVE ÉBRESZTÉSE=START JEL+HARDVERES CÍM ELKÜLDÉSE
;------------------------------------------------------------------------	
WAKE_SLAVE:
	BSF	SSPCON2,SEN
	BTFSC	SSPCON2,SEN	
	GOTO	$-2				;START JEL KÜLDÉSE

	WAKE_SLAVE_IDE:
	BCF	PIR1,SSPIF	
	NOP
	MOVFF	SLAVE_ADDRESS,SSPBUF	;SLAVE ADDRESS ELKULDESE
	BTFSS	PIR1,SSPIF				;KÜLDÉS BEFEJEZÉSÉNEK ELLENŐRZÉSE
	GOTO	$-2	

	BTFSS	SSPCON2,ACKSTAT			;ACK BEÉRKEZETT-E?
	RETURN		

	BSF	SSPCON2,RSEN				;START JEL ISMÉTELT KIKÜLDÉSE
	BTFSC	SSPCON2,RSEN			;ELLENŐRIZEM HOGY KIKÜLDTE-E
	GOTO	$-2	

BRA	WAKE_SLAVE_IDE
;-------------------------------------------------------------------------
;STOP JEL
;-------------------------------------------------------------------------	
STOP:
	BSF	SSPCON2,PEN
	BTFSC	SSPCON2,PEN	
	GOTO	$-2	
RETURN
;-------------------------------------------------------------------------
;EEPROM ADDRESS
;-------------------------------------------------------------------------
WRITE_ADDRESS:
	BCF	PIR1,SSPIF

	MOVFF	EEPROM_HIGH_ADDRESS,SSPBUF
	BTFSS	PIR1,SSPIF	
	GOTO	$-2	

	BTFSC	SSPCON2,ACKSTAT	
	GOTO	$-2		
	
	BCF	PIR1,SSPIF

	MOVFF	EEPROM_LOW_ADDRESS,SSPBUF
	BTFSS	PIR1,SSPIF	
	GOTO	$-2	

	BTFSC	SSPCON2,ACKSTAT	
	GOTO	$-2		
RETURN	
;-------------------------------------------------------------------------
;BYTE KÜLDÉSE
;-------------------------------------------------------------------------
WRITE_DATA:
	BCF	PIR1,SSPIF
	MOVFF	EEPROM_DATA,SSPBUF	
	BTFSS	PIR1,SSPIF	
	GOTO	$-2	
	BTFSC	SSPCON2,ACKSTAT	
	GOTO	$-2	
RETURN
;-------------------------------------------------------------------------
;EGY BYTE ÍRÁSA A MEGADOTT CÍMRE
;-------------------------------------------------------------------------
WRITE_BYTE_EEPROM:
	BCF	SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	CALL	WRITE_ADDRESS
	CALL	WRITE_DATA
	CALL	STOP
RETURN
;-------------------------------------------------------------------------
;WRITE PAGE EEPROM A MEGADOTT CÍMTŐL A BUFFERBŐL
;-------------------------------------------------------------------------
WRITE_PAGE_EEPROM:	
	MOVLW	LOW(BUFFER0)
	MOVWF	FSR0L
	CLRF	FSR0H
			
	BCF	SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	CALL	WRITE_ADDRESS
	
	MOVLW	0X20
	MOVWF	CIKLUS_VALTOZO
	
	PAGE_IDE:	
		MOVFF	POSTINC0,EEPROM_DATA
		CALL	WRITE_DATA
	DECFSZ	CIKLUS_VALTOZO,F
		GOTO	PAGE_IDE
	CALL	STOP
RETURN
;-------------------------------------------------------------------------
;RANDOM READ OLVASÁSA EGY BÁJTNAK EGY BIZONYOS CÍMRŐL
;-------------------------------------------------------------------------
READ_RANDOM_EEPROM:
	BCF		SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	CALL	WRITE_ADDRESS
		
	BSF		SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	
	BCF		PIR1,SSPIF
	BSF		SSPCON2,RCEN
	BTFSS	PIR1,SSPIF
	GOTO	$-2
	
	BSF		SSPCON2,ACKDT
	BSF		SSPCON2,ACKEN
	
	BTFSC	SSPCON2,ACKEN
	GOTO	$-2
	
	BSF		SSPCON2,PEN
	BTFSC	SSPCON2,PEN
	GOTO	$-2
	
	MOVFF	SSPBUF,EEPROM_DATA
	BCF		SSPCON2,RCEN
RETURN
;----------------------------------------------------------------------------
;EEPROM CURRENT ADDRESS READ
;----------------------------------------------------------------------------
READ_CURRENT_EEPROM:
	BCF		PIR1,SSPIF
	BSF		SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	
	BSF		SSPCON2,RCEN
	BTFSS	PIR1,SSPIF
	GOTO	$-2
	MOVFF	SSPBUF,EEPROM_DATA
	BSF		SSPCON2,ACKDT
	CALL	STOP	
	
RETURN
;----------------------------------------------------------------------------
;EEPROM SZEKVENCIÁLIS OLVASÁSA EGY MEGADOT CÍMTŐL KEZDVE
;----------------------------------------------------------------------------
SEQUENTIAL_READ_EEPROM:
	MOVLW	LOW(BUFFER0)
	MOVWF	FSR0L
	CLRF	FSR0H
	
	MOVLW	0X20
	MOVWF	CIKLUS_VALTOZO

	BCF		SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	CALL	WRITE_ADDRESS
		
	BSF		SLAVE_ADDRESS,0
	CALL	WAKE_SLAVE
	
	OLVAS_VISSZA:
	BCF		PIR1,SSPIF
	BSF		SSPCON2,RCEN
	BTFSS	PIR1,SSPIF
	GOTO	$-2
	
	BCF		SSPCON2,ACKDT
	BSF		SSPCON2,ACKEN
	
	BTFSC	SSPCON2,ACKEN
	GOTO	$-2
	
	MOVFF	SSPBUF,POSTINC0
	BCF		SSPCON2,RCEN	
	DECFSZ	CIKLUS_VALTOZO,F
		GOTO OLVAS_VISSZA
	
	BCF		PIR1,SSPIF
	BSF		SSPCON2,RCEN
	BTFSS	PIR1,SSPIF
	GOTO	$-2
	
	BSF		SSPCON2,ACKDT
	BSF		SSPCON2,ACKEN
	
	BTFSC	SSPCON2,ACKEN
	GOTO	$-2
	
	MOVFF	SSPBUF,BUFFER31
	BCF		SSPCON2,RCEN
	
	CALL	STOP
RETURN
;---------------------------------------------------------------------------------------------------
SERIAL_INIT:
	BSF		TRISC,7
	BCF		TRISC,6
	MOVLW	D'25'	; 9600 ha a 4 MHz a kristály
	MOVWF	SPBRG
	
	BSF	TXSTA,TXEN
	BSF	TXSTA,BRGH	
	
	BSF	RCSTA,SPEN	
	BSF	RCSTA,CREN
	BCF	PIR1,RCIF
	BSF	PIE1,RCIE	;SOROS PORTI VÉTEL MEGSZAKÍTÁS ENGEDÉLYEZÉSE
	BSF	INTCON,PEIE	;PERIFÉRIÁK ENGEDÉLYEZÉSE
	BSF	INTCON,GIE	

RETURN
;---------------------------------------------------------------------------------------------------
SERIAL_SEND:
	MOVLW	LOW(BUFFER0)
	MOVWF	FSR0L
	CLRF	FSR0H
	
	MOVLW	0X20
	MOVWF	CIKLUS_VALTOZO
	
	SOROS_KULD_VISSZA:
		BTFSS	PIR1,TXIF
		GOTO	SOROS_KULD_VISSZA
		MOVFF	POSTINC0,TXREG
	DECFSZ	CIKLUS_VALTOZO,F
		GOTO SOROS_KULD_VISSZA
RETURN
;----------------------------------------------------------------------------------------------------
SERIAL_RECIVE:
	MOVLW	LOW(BUFFER0)
	MOVWF	FSR0L
	CLRF	FSR0H
	
	MOVLW	0X20
	MOVWF	CIKLUS_VALTOZO
	
	SOROS_FOGAD_VISSZA:
		BTFSS	PIR1,RCIF
			GOTO	$-2
		MOVFF	RCREG,POSTINC0
	DECFSZ	CIKLUS_VALTOZO,F
		bra SOROS_FOGAD_VISSZA
RETURN
;----------------------------------------------------------------------------------------------------
MEGSZAKITAS:
	MOVFF	RCREG,SERIAL_RX_BYTE
	
	MOVLW	0X01
	XORWF	SERIAL_RX_BYTE,W
	BZ		OLVAS
	
	MOVLW	0X02
	XORWF	SERIAL_RX_BYTE,W
	BZ		IR
		
	IR:
		BCF		PIE1,RCIE		
		CLRF	EEPROM_HIGH_ADDRESS
		CLRF	EEPROM_LOW_ADDRESS
		MOVLW	0X00
		MOVWF	CIKLUS_VALTOZO_2
		
		IR_IDE_VISSZA:			
			;SERIAL_RECIVE	
			MOVLW	LOW(BUFFER0)
			MOVWF	FSR0L
			CLRF	FSR0H
	
			MOVLW	0X20
			MOVWF	CIKLUS_VALTOZO
	
			SOROS_FOGAD_VISSZA_IDE:
				BTFSS	PIR1,RCIF
			GOTO	$-2
			MOVFF	RCREG,POSTINC0
			DECFSZ	CIKLUS_VALTOZO,F
			BRA SOROS_FOGAD_VISSZA_IDE	
			;---------------------------------	
			CALL	WRITE_PAGE_EEPROM			
			;---------------------------------
			MOVLW	0X20
			ADDWF	EEPROM_LOW_ADDRESS,F
			CLRF	WREG			
			XORWF	EEPROM_LOW_ADDRESS,W
			BNZ	IDE_NEM_NULLA_2
			INCF	EEPROM_HIGH_ADDRESS
			IDE_NEM_NULLA_2:
			
			;--------------------------------
			MOVLW	0X03			
			FOLYTAT_KULD_VISSZA:
				BTFSS	PIR1,TXIF
			GOTO	FOLYTAT_KULD_VISSZA
			MOVWF	TXREG				
		DECFSZ	CIKLUS_VALTOZO_2,F
			GOTO IR_IDE_VISSZA
		BSF		PIE1,RCIE
		RETFIE
	
	OLVAS:
		CLRF	EEPROM_HIGH_ADDRESS
		CLRF	EEPROM_LOW_ADDRESS
		MOVLW	0X00
		MOVWF	CIKLUS_VALTOZO_2
		
		OLVAS_IDE_VISSZA:
			CALL	SEQUENTIAL_READ_EEPROM
			CALL	SERIAL_SEND
			
			CLRF	WREG			
			XORWF	EEPROM_LOW_ADDRESS,W
			BNZ	IDE_NEM_NULLA
			INCF	EEPROM_HIGH_ADDRESS
			IDE_NEM_NULLA:
			MOVLW	0X20
			ADDWF	EEPROM_LOW_ADDRESS,F			
			
		DECFSZ	CIKLUS_VALTOZO_2,F
			GOTO OLVAS_IDE_VISSZA	
RETFIE
	
END