.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