/* -----------------------------------------------------------------------------
* Project Name   : Architectures of Processor Systems (APS) lab work
* Organization   : National Research University of Electronic Technology (MIET)
* Department     : Institute of Microdevices and Control Systems
* Author(s)      : Andrei Solodovnikov
* Email(s)       : hepoh@org.miet.ru

See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
* ------------------------------------------------------------------------------
*/
_start:
# Инициализируем начальные значения регистров
 0: 050000b7      li x1 , 0x05000000          # сохраняем базовый адрес uart_rx
 4: 06000137      li x2 , 0x06000000          # сохраняем базовый адрес uart_tx
 8: 0001c1b7      li x3 , 0x0001c200          # устанавливаем бодрейт 115200
 c: 20018193
10: 0030a623      sw x3 , 0x0c(x1)
14: 00312623      sw x3 , 0x0c(x2)
18: 00100213      li x4 , 0x00000001          # устанавливаем parity_bit
1c: 0040a823      sw x4 , 0x10(x1)
20: 00412823      sw x4 , 0x10(x2)
24: 03c00293      la x5, trap_handler         # псевдоинструкция la аналогично li загружает число,
28: 00028293                                  # только в случае la — это число является адресом
                                              # указанного места (адреса обработчика перехвата)
                                              # данная псевдоинструкция будет разбита на две
                                              # инструкции: lui и addi
2c: 30529073      csrw mtvec, x5              # устанавливаем вектор прерывания
30: 000102b7      li x5 , 0x00010000          # подготавливаем маску прерывания единственного
                                              # (нулевого) входа
34: 30429073      csrw mie, x5                # загружаем маску в регистр маски

# Вызов функции main
main:
38: 00000063      beq x0, x0, main            # бесконечный цикл, аналогичный while (1);
# ОБРАБОТЧИК ПЕРЕХВАТА
# Без стороннего вмешательства процессор никогда не перейдет к инструкциям ниже,
# однако в случае прерывания в программный счетчик будет загружен адрес первой
# нижележащей инструкции.
# Сохраняем используемые регистры на стек
trap_handler:
3c: 0000a383      lw x7, 0(x1)                # загружаем пришедший байт
40: 00712023      sw x7, 0(x2)
44: 30200073      mret
