.include "m8def.inc"	

#define F_CPU (8000000)	


.equ 	XTAL = F_CPU
.equ 	baudrate = 1200 
.equ 	bauddivider = XTAL/(16*baudrate)-1

.dseg


.cseg
;================================================================
; векторы прерываний
;================================================================
		 .ORG $0000      ; (RESET)
         RJMP   Reset
         .ORG $0001
         RETI             ; (INT0) External Interrupt Request 0
         .ORG $0002
         RETI             ; (INT1) External Interrupt Request 1
         .ORG $00003
         RETI	      ; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG $0004
         RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG $0005
         RETI	     ; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG $0006
         RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG $0007
         RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG $0008
         RETI             ; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG $0009
         RETI             ; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG $000a
         RETI             ; (SPI,STC) Serial Transfer Complete
         .ORG $000b
         RETI    	     ; (USART,RXC) USART, Rx Complete
         .ORG $000c
         RETI             ; (USART,UDRE) USART Data Register Empty
         .ORG $000d
         RETI             ; (USART,TXC) USART, Tx Complete
         .ORG $000e
         RETI	    	 ; (ADC) ADC Conversion Complete
         .ORG $00f
         RETI             ; (EE_RDY) EEPROM Ready
         .ORG $0010
         RETI             ; (ANA_COMP) Analog Comparator
         .ORG $0011
         RETI             ; (TWI) 2-wire Serial Interface
         .ORG $0012
         RETI             ; (SPM_RDY) Store Program Memory Ready

		.ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний


;================================================================


.macro ua_send
	ldi r16,@0
	rcall USART_Transmit
.endm

Reset:
ldi	r16, LOW(RAMEND)
out	spl, r16
ldi r16, HIGH(RAMEND)
out	sph, r16


uart_init:	LDI 	R16, low(bauddivider)
			OUT 	UBRRL,R16
			LDI 	R16, high(bauddivider)
			OUT 	UBRRH,R16
 
			LDI 	R16,0
			OUT 	UCSRA, R16
 
; Прерывания запрещены, прием-передача разрешен.
		LDI 	R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
		OUT 	UCSRB, R16	
 
; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор
		LDI 	R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
		OUT 	UCSRC, R16

;--------------------
main:

	

	ua_send '1'
	ua_send ' '
	ua_send ' '
	ua_send '3'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec

got_byte:
	LDI 	R16,0
	OUT 	UCSRA, R16
	rcall USART_Receive
	cpi r16,'1'
	breq byte_is
	ua_send 'n'
	ua_send 'o'
	ua_send 't'
	ua_send ' '
	ua_send 'O'
	ua_send 'N'
	ua_send 'E'
	ua_send ' '
	ua_send ' '
	ua_send ' '
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec
	rjmp got_byte
	
byte_is:
	ua_send 'G'
	ua_send 'o'
	ua_send 'o'
	ua_send 'd'
	rcall debug_wait_1_sec
	rcall debug_wait_1_sec
	
	rjmp main
	
	
	
;============================================================================
debug_wait_1_sec:
	push r16
	push r17
	push r18
	ldi r18,$aa
	ldi r17,$b0
	ldi r16,$28
L_D_1:
	dec r18
	brne L_D_1
	dec r17
	brne L_D_1
	dec r16
	brne L_D_1
	pop r18
	pop r17
	pop r16
ret
;===========================================================================
USART_Transmit:
	; Wait for empty transmit buffer
	sbis UCSRA,UDRE
	rjmp USART_Transmit
	; Put data (r16) into buffer, sends the data
	out UDR,r16
	ret
;==============================================================================
USART_Receive:
	; Wait for data to be received
	sbis UCSRA, RXC
	rjmp USART_Receive
	; Get and return received data from buffer
	in r16, UDR
	ret
;==============================================================================

	
	
	
	
	
	
	
