Листинг 10. Программа обработки прерываний от кнопок


.include "key_codes.s"

.extern KEY_PRESSED

.extern PATTERN

/*******************************************************************************

Обработчик прерываний от кнопок

*******************************************************************************/

.global PUSHBUTTON_ISR

PUSHBUTTON_ISR:

subi sp, sp, 20 /* Сохраняем регистры в стеке*/

stw ra, 0(sp)

stw r10, 4(sp)

stw r11, 8(sp)

stw r12, 12(sp)

stw r13, 16(sp)

movia r10, 0x10000050

ldwio r11, 0xC(r10) /* Считываем значение из edge-capture регистра*/

stwio r0, 0xC(r10) /* Сбрасываем прерывание */

movia r10, KEY_PRESSED

CHECK_KEY1:

andi r13, r11, 0b0010 /* Если была нажата кнопка key1 */

beq r13, zero, CHECK_KEY2

movi r12, KEY1

stw r12, 0(r10)

br END_PUSHBUTTON_ISR

CHECK_KEY2:

andi r13, r11, 0b0100 /* Если была нажата кнопка key2*/

beq r13, zero, DO_KEY3

movi r12, KEY2

stw r12, 0(r10)

br END_PUSHBUTTON_ISR

DO_KEY3:

movia r13, 0x10000040

ldwio r11, 0(r13) /* Считываем значение с переключателей */

movia r13, PATTERN

stw r11, 0(r13) /* Сохраняем измененный текст */

END_PUSHBUTTON_ISR:

ldw ra, 0(sp) /* Восстанавливаем регистры из стека */

ldw r10, 4(sp)

ldw r11, 8(sp)

ldw r12, 12(sp)

ldw r13, 16(sp)

addi sp, sp, 20

ret

.end



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: