/* -----------------------------------------------------------------------------
* 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: 04000137       li x2 , 0x04000000          # сохраняем базовый адрес hex-контроллера
 8: 0001c1b7       li x3 , 0x0001c200          # устанавливаем бодрейт 115200
 c: 20018193
10: 0030a623       sw x3 , 0x0c(x1)
14: 00100213       li x4 , 0x00000001          # устанавливаем parity_bit
18: 0040a823       sw x4 , 0x10(x1)
1c: 03400293       la x5, trap_handler         # псевдоинструкция la аналогично li загружает число,
20: 00028293                                   # только в случае la — это число является адресом
                                               # указанного места (адреса обработчика перехвата)
                                               # данная псевдоинструкция будет разбита на две
                                               # инструкции: lui и addi
24: 30529073       csrw mtvec, x5              # устанавливаем вектор прерывания
28: 000102b7       li x5 , 0x00010000          # подготавливаем маску прерывания единственного
                                               # (нулевого) входа
2c: 30429073       csrw mie, x5                # загружаем маску в регистр маски

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