; ARM assembly tutorial for Asmonite, example 05: blink with a waiting loop (Raspberry Pi Pico 2, Arm Cortex-M33).
; Adapted from the ARM-ASM-Tutorial by Niklas Guertler (example BlinkDelay); see LICENSE.txt.
;
; Between on and off the program counts r2 down from 1000000 to 0. "subs" subtracts and sets the flags;
; "bne" (branch if not equal) jumps back as long as the result is not 0.
.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]

blink_loop:
    ldr  r1, sio_out_set
    ldr  r0, led_bit
    str  r0, [r1]               ; LED on
    ldr  r2, delay_count
delay1:
    subs r2, r2, #1
    bne  delay1                 ; count down to 0

    ldr  r1, sio_out_clr
    ldr  r0, led_bit
    str  r0, [r1]               ; LED off
    ldr  r2, delay_count
delay2:
    subs r2, r2, #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_out_set: dd 0xd0000018
sio_out_clr: dd 0xd0000020
led_bit:     dd 0x02000000
delay_count: dd 1000000
