; ARM assembly tutorial for Asmonite, example 06: keep the values in registers (Raspberry Pi Pico 2, Arm Cortex-M33).
; Adapted from the ARM-ASM-Tutorial by Niklas Guertler (example BlinkDelay2); see LICENSE.txt.
;
; The loop of 05_blink_delay.asm loads the same values again and again. Here they are loaded once into
; r0 .. r3 before the loop; "mov r4, r3" copies the count for each waiting loop.
.target pico2
.arch thumb
.imagebase 0x20000000

_start:
    ldr  r1, resets_clr
    ldr  r0, reset_bits
    str  r0, [r1]
    ldr  r1, resets_done
wait_reset:
    ldr  r2, [r1]
    and  r2, r2, r0
    cmp  r2, r0
    bne  wait_reset
    ldr  r1, pad25_clr
    mov  r0, #0x100
    str  r0, [r1]
    ldr  r1, gpio25_ctrl
    movs r0, #5
    str  r0, [r1]
    ldr  r1, sio_oe_set
    ldr  r0, led_bit
    str  r0, [r1]

    ldr  r0, sio_base           ; r0 = 0xd0000000, the SIO
    ldr  r1, led_bit            ; r1 = bit 25
    ldr  r3, delay_count        ; r3 = the count of a waiting loop
blink_loop:
    str  r1, [r0, #0x18]        ; GPIO_OUT_SET (0xd0000018): LED on
    mov  r4, r3
delay1:
    subs r4, r4, #1
    bne  delay1
    str  r1, [r0, #0x20]        ; GPIO_OUT_CLR (0xd0000020): LED off
    mov  r4, r3
delay2:
    subs r4, r4, #1
    bne  delay2
    b    blink_loop

    align 4
resets_clr:  dd 0x40023000
reset_bits:  dd 0x00000240
resets_done: dd 0x40020008
pad25_clr:   dd 0x4003b068
gpio25_ctrl: dd 0x400280cc
sio_oe_set:  dd 0xd0000038
sio_base:    dd 0xd0000000
led_bit:     dd 0x02000000
delay_count: dd 1000000
