;* 	Processzor = PIC16F877A 	órajel = 4 MHz *

		errorlevel -302, -305, -202
;
		LIST P=16F877A, R=DEC
        #include <P16F877A.INC>
        __config  	_XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _CPD_OFF & _BODEN_OFF
;------------------------[ ÁLLANDÓK ]-----------------------------
CR		equ 0x0d
CTRZ	equ	0x1a
;------------------------[ VÁLTOZÓK ]-----------------------------
	cblock 0x20
	flag
	szovcim
	pch
	W_temp			;megszakítás használatakor w átmeneti tárolója
	STA_temp		;status regiszter átmeneti tárolója
	endc
;------------------------[ MAKRÓK ]-------------------------------
bank0 macro						; bank váltó makrók
			bcf		STATUS,RP0
	endm
bank1 macro
			bsf		STATUS,RP0
	endm
;========================[PROGRAM KEZDETE]========================
			org		0x0000
			clrf	PCLATH
			goto	ini_main			
;
;========================[ MEGSZAKÍTÁSVEKTOR ]====================
			org		0x0004
;			clrf	PCLATH
;			movwf	W_temp				;w, STATUS regiszterek mentése, akkor kell feltétlenül 
;			swapf	STATUS,W
;			bank0
;			movwf	STA_temp
			btfsc	INTCON,INTF			;INT megszakítás vizsgálata
			goto	inti				;ugrás, ha a INT bemenet változott
 	;
	;ide jöhet még más megszakítás vizsgálata is
	;
 			goto	IntRet				;nincs aktív jelzőbit
;-----------------------------------------------------------------
inti									;ide jöhet az amit a megszakításra kell csinálni
			bsf		flag,0				;flag 0. bitje jelzi, hogy INT megszakítás volt
inti_vege	
			bcf		INTCON,INTF
;			goto	IntRet				;ha más megszakítást is kell kezelni, azokat a kódrészeket át lehet ugorni
;-----------------------------------------------------------------
IntRet
;			swapf	STA_temp,W			;tárolt w és STATUS regiszterek visszatöltése
;			movwf 	STATUS
; 			swapf 	W_temp,F
;			swapf 	W_temp,W
 	 		retfie 						;visszatérés a megszakításból
;-----------------------------------------------------------------
ini_main
;----------PORTOK beállítása-----------------------
;----------PORT B C-----------------------
       		clrf	PORTB
			clrf	PORTC		
			bank1
			movlw	b'11111111'			;RB0/INT bemenet
			movwf	TRISB				
			movlw 	b'10111111'			;RC7/RX be-, RC6/TX kimenet
       		movwf 	TRISC
; ----------USART beállítása------------------------
; Boot Baud Rate = 19200, No Parity, 1 Stop Bit
        	movlw 	0x0c              	;az érték 4MHz-es oszcillátornál 0x0c,3.6864MHz-nél 0x0b
        	movwf 	SPBRG
      		movlw 	b'00100100'       	;brgh = high 
		    movwf 	TXSTA    	        ;enable Async Transmission, set brgh
 			bank0						
			movlw 	b'10010000'		    ;enable Async Reception
      		movwf 	RCSTA
;---------------------------------------------------
;
;--------Megszakítások beállítása-------------------
			bcf		flag,0	
			clrf	INTCON
			movlw	b'10011000'			;GIE,0,0,INTE,0000 engedélyezése, jelzőbitek törlése
			movlw	b'10010000'			;globális, INT megszakítás engedélyezése, jelzőbitek törlése
			movwf	INTCON
;------------------------[ PROGRAM TÉNYLEGES KEZDETE ]------------
lab_01		
			sleep						;szunyóka addig, amíg nincs megszakítás
			nop							
			btfss	flag,0				;ébredés után INT megszakítás ellenőrzése
			goto	lab_01				;ha mégsem az volt, újra sleep
			bcf		INTCON,GIE			;megszakítás tiltása addig, amíg sms-ezünk
			bcf		flag,0				;flag törlése
; -------------------------------------------------------------
										;jöhet a szöveg kiküldése a soros portra
			movlw	0x06				;a szöveget pl a 0x0600 címetől elhelyezve így kell meghívni 
			movwf	pch					;a pch változóba a cím felső byte-ja, ami majd a PCLATH regiszterbe kerül
			movlw	sms_sms1-1			
			call 	sub_szovegki
			bsf		INTCON,GIE			;ha kiment a szöveg, megszakítás újra engedélyezve
			goto	lab_01				;újra sleep
; -------------------------------------------------------------
;========================[ SZUBRUTINOK ]==========================
sub_szovegki
			movwf 	szovcim
lab_002		
			call 	sub_pcl					;a szubrutin a dt-vel eltárolt szöveg következő karakterével tér vissza
			xorlw 	CTRZ					;a karatkter vizsgálata 
			btfsc 	STATUS,Z
			goto	sub_ctrz				;ha CTRZ volt, akkor return
			xorlw	CTRZ
			xorlw	0xff					;a szöveg végét 0xff jelzi, annak vizsgálata
			btfsc	STATUS,Z
			return
			xorlw 	0xff
			call 	sub_kuldes
			goto 	lab_002
; -------------------------------------------------------------
sub_pcl		movfw	pch
			movwf	PCLATH
			incf 	szovcim,F
			movfw 	szovcim
			movwf 	PCL
; -------------------------------------------------------------
sub_ctrz	movlw	CTRZ
			goto	sub_kuldes				
; -------------------------------------------------------------
sub_vetel							;ezt a rutint is betettem, de a program nem nézi, mit válaszol a telefon
			bank0
			btfss	RCSTA,OERR
			goto	$+3
			bcf		RCSTA,CREN
			bsf 	RCSTA,CREN
			btfss 	PIR1,RCIF
			goto 	$-1
			movfw 	RCREG
			return
; -------------------------------------------------------------
sub_kuldes
			movwf 	TXREG       		
		 	bank1						
		  	btfss 	TXSTA,TRMT 
        	goto 	$-1
        	bank0			
        	return
; -------------------------------------------------------------
;----------- szövegek -----------------------------------------
				org	0x0600
sms_sms1		dt	"AT PARANCS",CR,0xff		;így lehet a szöveget tárolni a program memóriában
;				dt	"valami szoveg ctrz-vel befejezve",CTRZ		;itt nem kell 0xff
;				dt		
		end