#define __SFR_OFFSET 0x00
#include "avr/io.h"

incr_msg:
    .ascii "Naik"
    .byte 10, 0

decr_msg:
    .ascii "Turun"
    .byte 10, 0

main:
    LDI   R16, lo8(RAMEND)
    OUT   SPL, R16
    LDI   R16, hi8(RAMEND)
    OUT   SPH, R16

    CLR   R21
    CLR   R22

    LDI   R16, (1 << 2) | (1 << 3)
    OUT   PORTD, R16
    LDI   R16, 0x00
    OUT   DDRD, R16

    RCALL init_serial

loop:
    SBIC  PIND, 2
    RJMP  check_decr
    
    RCALL increment_var
    RCALL print_incr
    RCALL delay_1sec

check_decr:
    SBIC  PIND, 3
    RJMP  loop
    
    RCALL decrement_var
    RCALL print_decr
    RCALL delay_1sec
    
    RJMP  loop

increment_var:
    LDI   R16, 1
    ADD   R21, R16
    LDI   R16, 0
    ADC   R22, R16
    RET

decrement_var:
    LDI   R16, 1
    SUB   R21, R16
    LDI   R16, 0
    SBC   R22, R16
    RET

init_serial:
    CLR   R24
    STS   UCSR0A, R24
    STS   UBRR0H, R24
    LDI   R24, 103
    STS   UBRR0L, R24
    LDI   R24, (1<<4) | (1<<3)
    STS   UCSR0B, R24
    LDI   R24, (1<<2) | (1<<1)
    STS   UCSR0C, R24
    RET

print_incr:
    LDI   R30, lo8(incr_msg)
    LDI   R31, hi8(incr_msg)
    RCALL print_string
    RCALL print_var_hex
    RET

print_decr:
    LDI   R30, lo8(decr_msg)
    LDI   R31, hi8(decr_msg)
    RCALL print_string
    RCALL print_var_hex
    RET

print_string:
str_loop:
    LPM   R18, Z+
    CPI   R18, 0
    BREQ  str_exit
    RCALL LCD_buffer
    STS   UDR0, R18
    RJMP  str_loop
str_exit:
    RET

print_var_hex:
    MOV   R16, R22
    RCALL ASCII_MSD
    RCALL LCD_buffer
    STS   UDR0, R16
    
    MOV   R16, R22
    RCALL ASCII_LSD
    RCALL LCD_buffer
    STS   UDR0, R16
    
    MOV   R16, R21
    RCALL ASCII_MSD
    RCALL LCD_buffer
    STS   UDR0, R16
    
    MOV   R16, R21
    RCALL ASCII_LSD
    RCALL LCD_buffer
    STS   UDR0, R16
    
    LDI   R16, 10
    RCALL LCD_buffer
    STS   UDR0, R16
    
    RET

ASCII_MSD:
    MOV   R23, R16
    ANDI  R16, 0xF0
    SWAP  R16
    SUBI  R16, -48
    MOV   R28, R16
    SUBI  R28, 58
    BRPL  A_F_D1
l1: RET

ASCII_LSD:
    MOV   R16, R23
    ANDI  R16, 0x0F
    SUBI  R16, -48
    MOV   R28, R16
    SUBI  R28, 58
    BRPL  A_F_D0
l2: RET    

A_F_D1:
    SUBI  R16, -7
    RJMP  l1

A_F_D0:
    SUBI  R16, -7
    RJMP  l2

LCD_buffer:
    LDS   R27, UCSR0A
    SBRS  R27, 5
    RJMP  LCD_buffer
    RET

delay_1sec:
    LDI   R17, 41
outer_loop:
    LDI   R18, 255
middle_loop:
    LDI   R19, 250
inner_loop:
    DEC   R19
    BRNE  inner_loop
    
    DEC   R18
    BRNE  middle_loop
    
    DEC   R17
    BRNE  outer_loop
    
    RET
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r