/* ----------------------------------------------------------------------------- * 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: 0030a823 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