		LIST		p=16F877
#include	"P16f877.inc"
		__config	0x39B9
		org		0x0000
	
	
	cblock	0x20
		bflag
		WREG_TEMP
		STATUS_TEMP
		PCLATH_TEMP
		DATAIN
		DATAOUT
		RX_TEMP
		RDOUT
	endc

;err000		equ		portc,4


Bank0		MACRO
			bcf		STATUS,RP0
			bcf		STATUS,RP1
			ENDM

Bank1		MACRO
			bsf		STATUS,RP0
			bcf		STATUS,RP1
			ENDM

Bank2		MACRO
			bcf		STATUS,RP0
			bsf		STATUS,RP1
			ENDM

Bank3		MACRO
			bsf		STATUS,RP0
			bsf		STATUS,RP1
			ENDM

;portb,7		equ					
			
			
		org		0x0000
		goto	main


		org		0x0004											; Megszakítás szubrutin
		goto	reqstart

reqstart

	movwf		WREG_TEMP			;
	movf		STATUS,W			;Regiszterek kimentése hogy
	movwf		STATUS_TEMP			;a szubrutin által okozott
	movf		PCLATH,W			;változások ne legyenek hatással
	movwf		PCLATH_TEMP			;a fő program futására!!
	clrf		PCLATH				;

;---------------------------------------------------------------Soros adas-vétel kiválasztó-------------------!!tesztelni kell!!-------------------------
reqteszt							;ki okozta a megszakítást??


fogad_teszt
	bank0							;váltás bank 0-ra
	btfss		PIR1,RCIF			;RCREG(vétel) okozta a megszakítást?
	goto		reqend
	call		rxdata
;	goto		vetel_req_teszt		;ha igen tovább tesztel
;	goto		adas_teszt

;	vetel_req_teszt
;		bank1
;		btfsc		PIE1,RCIE			;Be van állítva egyáltalán,vagy fals adat?
;		goto		vetel_ok			;Be is van állítva,megszakít is=>kiolvas
;		goto		vetel_nem_ok		;ha ez okozta a req-t de nincs beállítva az is hiba

;	vetel_ok
;		call		rxdata			;vétel
;		goto		vez
;		goto		reqend			;kilépés szubrutinból

;	vetel_nem_ok
;		goto		hiba_RX_TX		;hiba


adas_teszt
	bank0							;Váltás bank0-ra
	btfss		PIR1,TXIF			;TXREG okozta a megszakítást?  ha TXIF=1 akkor buffer empty ha 0 akkor full
	call		txdata
	goto		reqend
;	goto		kuldes_req_teszt	;ha igen akkor tovább tesztel
;	goto		hiba_RX_TX			;ha nem akkor hiba van mert se az adás sem a vétel nem okozta

;	kuldes_req_teszt
;		bank1
;		btfsc		PIE1,TXIE			;Be van állíva egyáltalán vagy fals adat?
;		goto		adas_ok				;Be is van állítva, megszakít is=>adás
;		goto		adas_nem_ok			;ha ez okozta a req-t de nincs beállítva az is hiba

;	adas_ok
;		call		txdata			;adas
;		goto		reqend			;kilépés szubrutinból

;	adas_nem_ok
;		goto		hiba_RX_TX		;hiba




;hiba_RX_TX
	
;	bank0
;	movlw		b'00001000'			;mivel a megszakításban nem működik valami jól ezért hiba generálódik:
;	movwf		portc				;					RC3=1
;	goto		reqend

;--------------------------------------------Soros adás-vétel kiválasztó vége---------------------------------------------------------------












;----------------------kiolvasás--------!!!!!!!!!hibakezelés még nincs kész!!!!!!------------------
rxdata
	
		bank0										;váltás bank0-ra							;DATAIN-be
		movlw		h'030'							;Indirekt címzés!!!!
		movwf		FSR								;H 0x30-ra címezem az első byte-ot

	kiolvas
		movf		RCREG,w							;RCREG-et beletesszük a 0x30-as RAM-ba
		movwf		INDF							;mert FSR adja a címet amire INDF-el hivatkozok
		nop											;nop hogy RCIF billenni tudjon
		nop											;
		btfss		PIR1,RCIF						;RCIF==1, vagyis van még adat a pufferben?
		return										;ha nem akkor visszatérés szubrutinból
		incf		FSR								;ha van akkor növelem FSR-t
		goto		kiolvas							;és újra beolvasom a növelt címre





;--------------------------------küldés-------------------!!!!!tx led!!!!!-----------------------------------

txdata
		bank0
		btfss	PIR1,TXIF			;megnézi hogy üres-e a TXREG
		goto	tx_wait				;ha nem üres(TXIF=0) vár
		goto	tx_go				;ha üres(TXIF=1) beír

			tx_wait					;még nem írható TXREG
				nop					;
				nop					;úgyhogy várakozás van
				goto	txdata		;újratesztel
		
			tx_go
				movf	dataout,w			;adat bemozgatása
				movwf	TXREG				;TXREG-be
		
					kesz
						bank1
						btfss	TXSTA,TRMT	;ki lett shiftelve TX pin-en??
						goto	kesz		;nem mert TRMT=0, újratesztel=>vár
						return				;igen, kilépés a szubrutinból.



;-----------------------------------------------PARANCSSZÓ DEKÓDOLÁS ÉS VEZÉRLÉS----------!!!hozzáigazítani az indirekthez!!------------------------------------------------

vez
		bank0													;váltás bank0-ra
		clrf	bflag											;bflag nullázása
		clrf	portc											;hibaüzenetek nullázása
;		clrf	RDOUT


;		movf	portd,w											;Kimenetek aktuális állapotát Temp-be rakom 
;		movwf	RX_TEMP											;Zsoltinak nyugta üzenetként.
		movf	INDF,w											;beérkező adat mozgatása w-be				
		andlw	b'00001111'										;levágni az elejét mert nem kell
		movwf	bflag											;azt bemozgatni bflagbe



;------------------------------------Parancs vizsgálat----!!!!hibakezelés!!!!------------------------------------------

Vizsg
		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000000'										;összehasonlítja a '0000' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor hibás parancs mert '0000'
		goto	hiba_0000										;nem lehet

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000001'										;összehasonlítja a '0001' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0001' parancs
		goto	com_0001										;meghívja com_0001 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000010'										;összehasonlítja a '0010' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0010' parancs
		goto	com_0010										;meghívja com_0010 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000011'										;összehasonlítja a '0011' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0011' parancs
		goto	com_0011										;meghívja com_0011 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000100'										;összehasonlítja a '0100' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0100' parancs
		goto	com_0100										;meghívja com_0100 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000101'										;összehasonlítja a '0101' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0101' parancs
		goto	com_0101										;meghívja com_0101 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000110'										;összehasonlítja a '0110' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0110' parancs
		goto	com_0110										;meghívja com_0110 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00000111'										;összehasonlítja a '0111' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '0111' parancs
		goto	com_0111										;meghívja com_0111 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00001000'										;összehasonlítja a '1000' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '1000' parancs
		goto	com_1000										;meghívja com_1000 kimenetvezérlő szubrutint

		movf	bflag,w											;Beleteszi bflag-et w-be és
		xorlw	b'00001001'										;összehasonlítja a '1001' értékkel
		btfsc	STATUS,Z										;ha egyenlő akkor '1001' parancs
		goto	com_1001										;meghívja com_1001 kimenetvezérlő szubrutint

;-----------------------------------------Parancs vizsgálat vége!!---------------------------------------


;--------------------------------Kimenet vezérlő szubrutinok-----------------------------

hiba_0000
		bsf		portc,4											;0000-ás hiba beáll
		goto	reqend											;vége a megszakításnak

com_0001
		bsf		portd,1											;beállítások kódtábla szerint
		goto	reqend											;vége a megszakításnak

com_0010
		bcf		portd,0											;beállítások kódtábla szerint
		bcf		portd,1		
		goto	reqend											;vége a megszakításnak

com_0011
		bsf		portd,0											;beállítások kódtábla szerint
		bsf		portd,1		
		goto	reqend											;vége a megszakításnak

com_0100
		bcf		portd,2											;beállítások kódtábla szerint
		bcf		portd,3
		bcf		portd,4		
		goto	reqend											;vége a megszakításnak

com_0101
		bsf		portd,2											;beállítások kódtábla szerint
		bsf		portd,3
		bcf		portd,4		
		goto	reqend											;vége a megszakításnak

com_0110
		bsf		portd,2											;beállítások kódtábla szerint
		bcf		portd,3
		bsf		portd,4		
		goto	reqend											;vége a megszakításnak

com_0111
		bcf		portd,7											;beállítások kódtábla szerint
		bcf		portd,6
		bcf		portd,5		
		goto	reqend											;vége a megszakításnak

com_1000
		bcf		portd,7											;beállítások kódtábla szerint
		bsf		portd,6
		bsf		portd,5		
		goto	reqend											;vége a megszakításnak

com_1001
		bsf		portd,7											;beállítások kódtábla szerint
		bcf		portd,6
		bsf		portd,5		
		goto	reqend											;vége a megszakításnak



			
					
												
								
		reqend
	
				fsr_vizsg
						movlw	h'030'							;utolsó lépés:
						xorwf	FSR,w							;megnézi hogy az fsr a kezdő címen van-e
						btfsc	STATUS,Z						;ha igen akkor
						goto	vege							;!!!!!Itt a VÉGE a Vez-nek!!!!

							fsr_nagy
									decf	FSR					;ha nem akkor egyel csökkenti az fsr-t
									goto	vez					;és újra kódolás
		vege			
	
			movf	portd,w									;nyugtaként visszaküldeni
			movwf	dataout									;Zsoltinak
			call	txdata									;feltétel nékül.

		
				bank0											;bankváltás bank0-ra
				clrf		STATUS								;
				movf		PCLATH_TEMP,W						;Regiszterek visszaállítása amit az
				movwf		PCLATH								;elején kimentettünk. A végén azért 
				movf		STATUS_TEMP,W						;swapf mert az nincs hatással a 
				movwf		STATUS								;Zero bitre.
				swapf		WREG_TEMP,F							;
				swapf		WREG_TEMP,W							;
				retfie											;vissszatérés megszakításból


;------------------------------------------PARANCSSZÓ KÓDOLÁS ÉS VEZÉRLÉS VÉGE-----------------------------------------------------------------

main
		bank0
		movlw	b'11011111'			;T0CKI porta bemenet
		movwf	OPTION_REG
		movlw	b'11000000'			;GIE,PIE RB7-RB4 ON 
		movwf	INTCON				;többi megszakítása OFF
		movlw	b'00110000'			;RX,TX megszakítás ON többi OFF
		movwf	PIE1				;
		call	init_comport		;comport beállítása
		call	init_IOports		;I/O portok beállítása		
		call	loop				;ciklus

init_comport
		bank1
		movlw	b'00100100'			;TXSTA beállítása:8bit mode,transmit enable,async mode,BRGH=1(high)
		movwf	TXSTA
		movlw	d'25'				;táblázat szerint baudrate:9615 bps=> hiba=0,16%
		movwf	SPBRG				;
		bank0
		movlw	b'10010000'			;RCSTA beállítása:soros port enabled,8bit mode, folyamatos mód, nincs cím figyelés,
		movwf	RCSTA				;
		return

init_IOports
		bank1
		movlw	b'11110000'			;Portb7-4 bemenet, 
		movwf	trisb
		movlw	b'00000000'			;Portd kimenet mind, ez megy izzó 
		movwf	trisd				;vezérlésekre
		movlw	b'11000000'			;portc,7,6 RX;TX
		movwf	trisc				;portc is
		bank0
		clrf	portd
		return



loop
		goto	loop
			

end