; ARM assembly tutorial for Asmonite, example 09: names for the numbers (Raspberry Pi Pico 2, Arm Cortex-M33).
; Adapted from the ARM-ASM-Tutorial by Niklas Guertler (example BlinkConstants); see LICENSE.txt.
;
; "name equ value" gives a number a name; the line writes no bytes. The names can be used wherever a number
; stands: in an instruction (#PAD_ISO), in an address ([r0, #SIO_GPIO_OUT_SET]), in dd, and in expressions
; (RESETS_BASE + ALIAS_CLR, 1 << 25). The program is the same as 06_blink_registers.asm.
.target pico2
.arch thumb
.imagebase 0x20000000

RESETS_BASE         equ 0x40020000
RESETS_RESET        equ 0x00
RESETS_RESET_DONE   equ 0x08
RESET_IO_BANK0      equ 1 << 6
RESET_PADS_BANK0    equ 1 << 9
IO_BANK0_BASE       equ 0x40028000
GPIO25_CTRL         equ 0xcc
FUNCSEL_SIO         equ 5
PADS_BANK0_BASE     equ 0x40038000
PADS_GPIO25         equ 0x68
PAD_ISO             equ 1 << 8
SIO_BASE            equ 0xd0000000
SIO_GPIO_OUT_SET    equ 0x18
SIO_GPIO_OUT_CLR    equ 0x20
SIO_GPIO_OE_SET     equ 0x38
ALIAS_CLR           equ 0x3000      ; +0x3000: the alias of a register that clears bits
LED_PIN             equ 25
DELAY_COUNT         equ 1000000

_start:
    ldr  r1, lit_resets_clr
    ldr  r0, lit_reset_bits
    str  r0, [r1, #RESETS_RESET]
    ldr  r1, lit_resets
wait_reset:
    ldr  r2, [r1, #RESETS_RESET_DONE]
    and  r2, r2, r0
    cmp  r2, r0
    bne  wait_reset
    ldr  r1, lit_pads_clr
    mov  r0, #PAD_ISO
    str  r0, [r1, #PADS_GPIO25]
    ldr  r1, lit_io_bank0
    movs r0, #FUNCSEL_SIO
    str  r0, [r1, #GPIO25_CTRL]

    ldr  r0, lit_sio
    ldr  r1, lit_led_bit
    str  r1, [r0, #SIO_GPIO_OE_SET]
    ldr  r3, lit_delay_value
blink_loop:
    str  r1, [r0, #SIO_GPIO_OUT_SET]
    mov  r4, r3
delay1:
    subs r4, r4, #1
    bne  delay1
    str  r1, [r0, #SIO_GPIO_OUT_CLR]
    mov  r4, r3
delay2:
    subs r4, r4, #1
    bne  delay2
    b    blink_loop

    align 4
lit_resets:      dd RESETS_BASE
lit_resets_clr:  dd RESETS_BASE + ALIAS_CLR
lit_reset_bits:  dd RESET_IO_BANK0 | RESET_PADS_BANK0
lit_pads_clr:    dd PADS_BANK0_BASE + ALIAS_CLR
lit_io_bank0:    dd IO_BANK0_BASE
lit_sio:         dd SIO_BASE
lit_led_bit:     dd 1 << LED_PIN
lit_delay_value: dd DELAY_COUNT
