87 lines
1.3 KiB
Plaintext
87 lines
1.3 KiB
Plaintext
reset:
|
|
br always >main
|
|
nop
|
|
hardfault:
|
|
reti
|
|
nop
|
|
memfault:
|
|
reti
|
|
nop
|
|
|
|
.align
|
|
led_addr: .word 0x000F0000
|
|
switches_addr: .word 0x000F0004
|
|
base_prescaler: .word 0x1
|
|
|
|
main:
|
|
ldr r0,>led_addr //LED addr
|
|
addi r6,8 //outer counter top
|
|
clr r7 //wait counter
|
|
ldr r8,>base_prescaler
|
|
|
|
out_loop:
|
|
clr r1
|
|
st08 r0,r1
|
|
call >wait_prescaled
|
|
nop
|
|
|
|
fill:
|
|
lsh r1,r1,1
|
|
addi r1,1
|
|
st08 r0,r1
|
|
call >wait_prescaled
|
|
nop
|
|
|
|
addi r5,1
|
|
cmp neq r5,r6
|
|
br true >fill
|
|
nop
|
|
clr r5
|
|
|
|
flush:
|
|
lsh r1,r1,1
|
|
st08 r0,r1
|
|
call >wait_prescaled
|
|
nop
|
|
|
|
addi r5,1
|
|
cmp neq r5,r6
|
|
br true >flush
|
|
nop
|
|
clr r5
|
|
br always >out_loop
|
|
nop
|
|
|
|
wait_prescaled:
|
|
// Load value from the switches
|
|
ldr r11, >switches_addr
|
|
ld32 r9, r11
|
|
addi r9, 1
|
|
|
|
clr r11
|
|
add r11, r13, r11 // save link register
|
|
|
|
clr r10
|
|
inc_j:
|
|
call >wait
|
|
cmp neq r10,r9
|
|
br true >inc_j
|
|
addi r10,1
|
|
|
|
clr r13
|
|
add r13, r13, r11 // restore link register
|
|
|
|
ret
|
|
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
|