;=======================================================
; Проект 32. Приём по USART с эхо
; ATmega8, 8 МГц, 9600 бод
; Принятый символ возвращается обратно и дублируется
; на светодиоды PORTB
;=======================================================
.include "m8def.inc"

.def tmp  = r16
.def data = r17

.cseg
.org 0x0000
        rjmp    RESET

RESET:
        ldi     tmp, low(RAMEND)
        out     SPL, tmp
        ldi     tmp, high(RAMEND)
        out     SPH, tmp

        ldi     tmp, 0xFF
        out     DDRB, tmp               ; светодиоды — выходы
        rcall   UsartInit

MAIN:
        rcall   UsartRecv               ; ждём символ
        out     PORTB, data             ; показываем его код
        mov     tmp, data
        rcall   UsartSend               ; отправляем обратно (эхо)
        rjmp    MAIN

UsartInit:
        ldi     tmp, 0
        out     UBRRH, tmp
        ldi     tmp, 51
        out     UBRRL, tmp
        ldi     tmp, (1<<TXEN)|(1<<RXEN)
        out     UCSRB, tmp
        ldi     tmp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
        out     UCSRC, tmp
        ret

;--- ожидание и приём байта в data ---
UsartRecv:
        sbis    UCSRA, RXC              ; принят ли байт?
        rjmp    UsartRecv
        in      data, UDR
        ret

UsartSend:
        sbis    UCSRA, UDRE
        rjmp    UsartSend
        out     UDR, tmp
        ret
