diff options
Diffstat (limited to 'assembly/rrxing2/util.S')
| -rw-r--r-- | assembly/rrxing2/util.S | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/assembly/rrxing2/util.S b/assembly/rrxing2/util.S new file mode 100644 index 0000000..9dda1ab --- /dev/null +++ b/assembly/rrxing2/util.S @@ -0,0 +1,43 @@ +.macro digiline_send channel msg + la a0,(\channel) + la a1,(\msg) + li a7,129 + ecall +.endm + +.macro set_timeri time + li t0,0x80 + csrs mie,t0 # unmask timer interrupt + ld t1,2(gp) # read mtime + li t0,(\time) + add t1,t1,t0 # calculate target value (lower half) + sltu t0,t1,t0 # check if it overflowed + add t2,t2,t0 # add the overflow into the high half if there was any + sd t1,10(gp) # set mtimecmp to the target value +.endm + +.macro stop_timer + li t1,0xffffffff + li t2,0xffffffff + sd t1,10(gp) # set mtime to far in the future + li t1,0x80 + csrc mie,t1 # mask timer interrupt +.endm + +.macro set_timer_to label + cm.push {ra},-16 + la a0,(\label) + lbu a0,0(a0) + call set_timer + cm.pop {ra},16 +.endm + +set_timer: +li t0,0x80 +csrs mie,t0 # unmask timer interrupt +ld t1,2(gp) # read mtime +add t1,t1,a0 # calculate target value (lower half) +sltu t0,t1,a0 # check if it overflowed +add t2,t2,t0 # add the overflow into the high half if there was any +sd t1,10(gp) # set mtimecmp to the target value +ret |
