reset:
    br always >main
    nop

hardfault:
    reti
    nop

memfault:
    reti
    nop

switches_interrupt:
    br >switches_interrupt_handler
    nop

can_interrupt:
    br >can_interrupt_handler
    nop

.align
led_addr: .word 0x000F0000
switches_addr: .word 0x000F0004
dmem_start_addr: .word 0x00000400
dmem_end_addr: .word 0x000004FC
priority_mask: .word 0xFFFFFF03

main:
    // Initialize stack pointer to the end of the data memory
    ldr r12, >dmem_end_addr

    // Set runtime priority
    ldr r0, >priority_mask
    and r14, r0, r14

    ldr r0, >led_addr
    ldr r1, >switches_addr

loop:
    br >loop
    nop

switches_interrupt_handler:
    ld32 r2, r1

    // Set LED to pattern
    st08 r0, r2
    
    reti
    nop

can_interrupt_handler:
    reti
    nop
