1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
.section .text
.align 2
.global delay
.include "memory_map.inc"
# a0 is delay-in-milliseconds argument
delay:
addi sp, sp, -16 # Allocate stack frame
sw ra, 12(sp) # save return address to the stack
li t0, MTIME # load the timer register
lw t1, 0(t0) # load low value of the timer
lw t2, 4(t0) # load high value of the timer
li t3, MTIME_FREQUENCY # get clock freq (approx.)
mul t3, t3, a0 # multiply milliseconds with freq
add t4, t1, t3 # target mtime is now in t4
li t0, MTIMECMP # load address of MTIMECMP register
sw t2, 4(t0) # set higher 32bits of MTIMECMP
sw t4, 0(t0) # store target time to MTIMECMP register. This only stores 32 bits so I am not sure if that is correct...
lw ra, 12(sp) # load return address
addi sp, sp, 16 # deallocate stack frame
ret
|