-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmath.s43
140 lines (118 loc) · 3.58 KB
/
math.s43
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "msp430.h" ; #define controlled include file
MODULE math
PUBLIC divideR5ByR6, calculateBPM
RSEG CSTACK ; pre-declaration of segment
RSEG CODE ; place program in 'CODE' segment
;Objetivo: calcula la division
;Precondiciones: debes pasar el dividendo en R5 y el divisor en R6
;Postcondiciones: retorna el cociente en R8 y el residuo en R9
;Autor: Kenneth Rosario
;Fecha: 13/marzo/2021
divideR5ByR6:
push R5; quotient
push R6
mov #0, R8
cmp #0, R6
jeq divideCleanUp
divideLoop:
cmp R6, R5 ; compara dividendo y divisor
jl divideCleanUp ; si el dividendo es menor que el divisor terminaste
sub R6, R5
inc R8
jmp divideLoop
divideCleanUp:
mov R5, R9
pop R6
pop R5
ret
;Objetivo: Calcular el BPM en los siguientes casos: 0-6 seg, 6-12 seg, 12-18 seg, 18-24 seg, 24-30 seg
;Precondiciones: Se debe pasar los beats al R7 y los ticks al R8
;Postcondiciones: Almacena el BPM en el R10
;Autor: Gustavo A. Roman
;Fecha: 15/Abril/2021
calculateBPM:
;R7 -> Beats, R8 -> Ticks, R9 -> R10 -> BPM, R11 -> auxiliary, R12 -> BPM temp
push R7 ;Push R7, R8, R9 y R11 para evitar efectos secundarios
push R8
push R11 ;NOTA: Se hizo push para facilitar el proceso de calcular los BPM que mult. con decimales
push R12
mov #0, R10
mov #0, R11
mov #0, R12
calculateBPMLoop:
cmp #30, R8 ;BPM durante 0-6 seg (Se multiplica beats por 10)
jeq multBeatsByTen
cmp #60, R8 ;BPM durante 6-12 seg (Se multiplica beats por 5)
jeq multBeatsByFive
cmp #90, R8 ;BPM durante 12-18 seg (Se multiplica beats por ~ 3.3)
jeq multBeatsByThreePointThree
cmp #120, R8 ;BPM durante 18-24 seg (Se multiplica beats por 2.5)
jeq multBeatsByTwoPointFive
cmp #150, R8 ;BPM durante 24-30 seg (Se multiplica beats por 2)
jeq multBeatsByTwo
multBeatsByTen:
cmp #10, R10
jeq calculateBPMcleanup ;Funcion que retorna el BPM en R10
add R7, R12
inc R10
jmp multBeatsByTen
multBeatsByFive:
cmp #5, R10
jeq calculateBPMcleanup ;Funcion que retorna el BPM en R10
add R7, R12
inc R10
jmp multBeatsByFive
multBeatsByThreePointThree:
call #divideByThree ;Funcion que calcula el 0.3 de beats y lo almacena en R11
add r11, r12
multBeatsByThreePointThreeLoop:
cmp #3, R10
jeq calculateBPMcleanup ;Funcion que retorna el BPM en R10
add R7, R12
inc R10
jmp multBeatsByThreePointThreeLoop
multBeatsByTwoPointFive:
call #divideByTwo ;Funcion que calcula el 0.5 de beats y lo almacena en R11
add r11, r12
multBeatsByTwoPointFiveLoop:
cmp #2, R10
jeq calculateBPMcleanup ;Funcion que retorna el BPM en R10
add R7, R12
inc R10
jmp multBeatsByTwoPointFiveLoop
multBeatsByTwo:
cmp #2, R10
jeq calculateBPMcleanup ;Funcion que retorna el BPM en R10
add R7, R12
inc R10
jmp multBeatsByTwo
divideByThree:
push R5
push R6
mov R7, R5
mov #3, R6
call #divideR5ByR6
mov R8, R11
pop R6
pop R5
ret
divideByTwo:
push R5
push R6
mov R7, R5
mov #2, R6
call #divideR5ByR6
mov R8, R11
pop R6
pop R5
ret
calculateBPMcleanup:
; Adding r11 again
;add R11, R12
mov R12, R10
pop R12
pop R11
pop R8
pop R7
ret
END