reset:
br always >main
nop
hardfault:
reti
nop
memfault:
reti
nop

.align
led_addr: .word 0x000F0000

number_array0:
    .word 0x03020100
number_array1:
    .word 0x07060504
number_array2:
    .word 0x0B0A0908
number_array3:
    .word 0x0F0E0D0C

segment_addr0: .word 0x000F00A0
segment_addr1: .word 0x000F00A4

random_value: .word 0xAA

w_cnt_top:  .word 0xFFFFFF // for real board
// w_cnt_top:    .word 0x100 //for simulation only

infamous_pattern0:
    .word 0x0F0E0E0B
infamous_pattern1:
    .word 0x0D0A0E0D

main:
    ldr r8, >w_cnt_top
    ldr r0, >led_addr

    // Set LEDs to some value
    ldr r4, >random_value
    st08 r0, r4

number_loop:
    // First 4
    ldr r4, >number_array0
    ldr r0, >segment_addr0
    st32 r0, r4

    // Second 4
    ldr r4, >number_array1
    ldr r0, >segment_addr1
    st32 r0, r4

    call >wait
    nop

    // First 4
    ldr r4, >number_array2
    ldr r0, >segment_addr0
    st32 r0, r4

    // Second 4
    ldr r4, >number_array3
    ldr r0, >segment_addr1
    st32 r0, r4

    call >wait
    nop

    // 0xDEADBEEF pattern:

    // First 4
    ldr r4, >infamous_pattern0
    ldr r0, >segment_addr0
    st32 r0, r4

    // Second 4
    ldr r4, >infamous_pattern1
    ldr r0, >segment_addr1
    st32 r0, r4

    call >wait
    nop

    br always >number_loop
    nop


//subroutine to iterate until counter overflow
wait:
    clr r7                //inititalize inner counter
    inc_i:
    cmp neq r7,r8
    br true >inc_i        //if i=cnt_top
    addi r7,1
    ret                    //else
    nop
