summaryrefslogtreecommitdiff
path: root/software/first/delay.S
blob: 039d9249647cb65595b13bb891eb6fd5e3b3838c (plain)
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