-
Notifications
You must be signed in to change notification settings - Fork 2
/
cronometro.s
130 lines (112 loc) · 3.31 KB
/
cronometro.s
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
.equ DISPLAY_7SEG_ADDRESS, 0x10000020
.global CRONOMETRO
CRONOMETRO:
# ------------------------- Prologo ------------------------- #
addi sp, sp, -40 # make a 36-byte frame
stw ra, 36(sp)
stw fp, 32(sp)
# -------- Registradores de próposito geral (caller) -------- #
stw r8, 28(sp)
stw r9, 24(sp)
stw r10, 20(sp)
stw r11, 16(sp)
stw r12, 12(sp)
stw r13, 8(sp)
stw r14, 4(sp)
stw r15, 0(sp)
# ----------------------------------------------------------- #
addi fp, sp, 32
movia r8, DISPLAY_7SEG_ADDRESS
movia r9, DISPLAY_CRONOMETRO_CONTROL
movia r12, DISPLAY_7SEG_MAP
movi r15, 9 # tamanho maximo para contagem
ldw r10, 0(r9)
bgt r10, r15, INCREMENTA_DEZENA # se unidade > 9, incrementa dezena e reseta unidade
br DISPLAY_CRONOMETRO
INCREMENTA_DEZENA:
ldw r10, 4(r9)
stw r0, 0(r9) # unidade = 0
addi r10, r10, 1 # dezena++
/*
M C D U
Se x x++ 10 0
*/
bgt r10, r15, INCREMENTA_CENTENA # se dezena > 9 incrementa centena e reseta dezena
stw r10, 4(r9) # senao escreve no cronometro
br DISPLAY_CRONOMETRO
INCREMENTA_CENTENA:
ldw r10, 8(r9)
stw r0, 4(r9) # dezena = 0
addi r10, r10, 1 # centena++
/*
M C D U
Se x++ x 10 0
*/
bgt r10, r15, INCREMENTA_MILHAR # se centena > 9 incrementa centena e reseta
stw r10, 8(r9) # senao escreve no cronometro
br DISPLAY_CRONOMETRO
INCREMENTA_MILHAR:
ldw r10, 12(r9)
stw r0, 8(r9) # centena = 0
addi r10, r10, 1 # milhar++
/*
M C D U
Se x++ x 10 0
*/
bgt r10, r15, RESET # se milhar > 9 incrementa centena e reseta
stw r10, 12(r9) # senao escreve no cronometro
br DISPLAY_CRONOMETRO
RESET:
stw r0, 0(r9)
stw r0, 4(r9)
stw r0, 8(r9)
stw r0, 12(r9)
DISPLAY_CRONOMETRO:
movia r9, DISPLAY_CRONOMETRO_CONTROL
movi r14, 0 # valor inicial do contador de displays
movi r15, 4 # maximo uso 4 displays
LOOP_CRONOMETRO_DISPLAY:
bge r14, r15, FIM_LOOP_CRONOMETRO_DISPLAY
ldw r10, 0(r9) # obter valor do controle
add r13, r12, r10 # obter endereco mapeado na tabela
/* Inserir no display 7seg */
ldb r13, 0(r13)
stbio r13, 0(r8)
addi r9, r9, 4 # incrementar valor de controle
addi r8, r8, 1 # avancar no display
addi r14, r14, 1 # incrementar loop
br LOOP_CRONOMETRO_DISPLAY
FIM_LOOP_CRONOMETRO_DISPLAY:
/* Incrementar unidade em + 1 */
movia r9, DISPLAY_CRONOMETRO_CONTROL
ldw r10, 0(r9)
addi r10, r10, 1
stw r10, 0(r9)
# ------------------------- Epilogo ------------------------- #
ldw ra, 36(sp)
ldw fp, 32(sp)
ldw r8, 28(sp)
ldw r9, 24(sp)
ldw r10, 20(sp)
ldw r11, 16(sp)
ldw r12, 12(sp)
ldw r13, 8(sp)
ldw r14, 4(sp)
ldw r15, 0(sp)
addi sp, sp, 40
ret
/*
VALOR BINARIO 7 SEG
0 0111111 0x3f
1 0000110 0x6
2 1011011 0x5b
3 1001111 0x4f
4 1100110 0x66
5 1101101 0x6d
6 1111101 0x7d
7 0000111 0x7
8 1111111 0xff
9 1100111 0x67
*/
DISPLAY_7SEG_MAP:
.byte 0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0xff, 0x67