#include	<p16f877a.inc>

etx			EQU 0x38
stx			EQU 0x39
IICflags 	EQU 0xA0
slvadr		EQU 0xA1
iicrcdp		EQU 0xA2
iicrcdsa	EQU 0xA3
RXBUFA		EQU 0x41
RXBUFD		EQU 0x40
RXTMP		EQU 0x42
cmda		EQU 0x43
cmdd		EQU 0x44

	ORG H'0000'
	GOTO init

	ORG H'0004'
	GOTO IntR

init
	bcf	STATUS,RP0
	bcf	STATUS,RP1
		clrf RCSTA
	bsf	STATUS,RP0
	bcf	STATUS,RP1
		movlw B'00000111'
		movfw CMCON
		movlw 0x00
		movfw CVRCON
	BCF STATUS, RP0 
	BCF STATUS, RP1 ; Bank0
		clrf ADCON0
		CLRF PORTA 
	BSF STATUS, RP0 
	BCF STATUS, RP1 ; Bank1
		movlw b'00000110'
		movwf ADCON1
		movlw b'00111111'
		movwf TRISA
		BCF STATUS, RP0 
	BCF STATUS, RP1 ; Bank0
		CLRF PORTE 
	BSF STATUS, RP0 
	BCF STATUS, RP1 ; Bank1
		bcf 0x89,4
		bsf 0x89,2
		bsf 0x89,1
		bsf 0x89,0
		movlw 0x87
		movwf OPTION_REG
		clrf INTCON
		clrf PIE1 
		clrf PIE2
	BCF STATUS, RP0 
	BCF STATUS, RP1 ; Bank0
		CLRF PORTB 
	BSF STATUS, RP0 
	BCF STATUS, RP1 ; Bank1
		movlw b'11111111'
		movwf TRISB
	BCF STATUS, RP0 
	BCF STATUS, RP1 ; Bank0
		CLRF PORTD 
	BSF STATUS, RP0 
	BCF STATUS, RP1 ; Bank1
		movlw b'11111111'
		movfw TRISD
	BCF STATUS, RP0 
	BCF STATUS, RP1 ; Bank0
		CLRF PORTC 
	BSF STATUS, RP0 
	BCF STATUS, RP1 ; Bank1
		movlw b'11111111'
		movwf TRISC
		clrf TXSTA
		movlw .25
		movwf SPBRG
	bcf	STATUS,RP0
	bcf	STATUS,RP1
		movlw 0x90
		movwf RCSTA
	bsf	STATUS,RP0
	bcf	STATUS,RP1
		movlw 0x24
		movwf TXSTA
	bcf	STATUS,RP0
	bcf	STATUS,RP1
		movlw 'H' 
		movwf 0x20
		movlw 'o' 
		movwf 0x21
		movlw 'b' 
		movwf 0x22
		movlw 's' 
		movwf 0x23
		movlw 'i' 
		movwf 0x24
		movlw ' ' 
		movwf 0x25
		movlw 'm' 
		movwf 0x26
		movlw 'o' 
		movwf 0x27
		movlw 'n' 
		movwf 0x28
		movlw 'i' 
		movwf 0x29
		movlw 't' 
		movwf 0x2A
		movlw 'o' 
		movwf 0x2B
		movlw 'r' 
		movwf 0x2C
		movlw 'i' 
		movwf 0x2D
		movlw 'n' 
		movwf 0x2E
		movlw 'g' 
		movwf 0x2F
		movlw ' ' 
		movwf 0x30
		movlw 's' 
		movwf 0x31
		movlw 'y' 
		movwf 0x32
		movlw 's' 
		movwf 0x33
		movlw 't' 
		movwf 0x34
		movlw 'e' 
		movwf 0x35
		movlw 'm' 
		movwf 0x36
		movwf 0x36
		movlw 0x36
		movwf etx
		movlw 0x20
		movwf FSR
		movlw 0x20
		movwf stx
		movlw .246
		movwf TMR0		
		bsf INTCON,0x05	
		bsf INTCON,0x07
		GOTO  Main


;-----------



IntR
	bcf INTCON,7




	btfss INTCON,2
	goto ENDI

	bcf	STATUS,RP0
	bcf	STATUS,RP1
		btfss PIR1,0x04
		goto rx
		btfss 0x37,0x05
		goto tx1
		bcf 0x37,0x05
		goto ENDIT
tx1
		movfw stx
		movwf FSR
		movfw FSR
		bcf STATUS,C
		subwf etx,0
		btfss STATUS,C 
		goto endbuf
		movfw INDF
		movwf TXREG	
		incf stx,1
endbuf
	bsf 0x37,7
	
rx
	bcf	STATUS,RP0
	bcf	STATUS,RP1
	bcf STATUS,IRP
	BTFSS PIR1,5
	GOTO ENDIT
	btfsc	RCSTA,OERR	;if overrun error occurred
	goto	ErrSerialOverr	; then go handle error
	btfsc	RCSTA,FERR	;if framing error occurred
	goto	ErrSerialFrame	; then go handle error	
	movfw RCREG
	movwf FSR
	nop
	movfw INDF
	movwf TXREG
	 	
ENDIT
	movlw .246
	movwf TMR0
	bcf INTCON,2
ENDI
	bsf INTCON,7
	RETFIE
;-------------------------------------------------------



ErrSerialOverr:	
		bcf	STATUS,RP0
		bcf	STATUS,RP1
		bcf	RCSTA,CREN	;reset the receiver logic
		bsf	RCSTA,CREN	;enable reception again
		goto ENDIT
ErrSerialFrame:	
		bcf	STATUS,RP0
		bcf	STATUS,RP1
		movf	RCREG,W		;discard received data that has error
		goto ENDIT
;----------------
Main

	GOTO	Main
	END
