-
Notifications
You must be signed in to change notification settings - Fork 0
/
Pong.s
240 lines (197 loc) · 4.41 KB
/
Pong.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
.data
.global _start
# .equ <nome> <valor hex>
# Este bloco armazena os valores, em hexadecimal, correspondentes ao que deve ser printado no display
.equ Um, 0x31
.equ Dois, 0x32
.equ Tres, 0x33
.equ Quatro, 0x34
.equ Cinco, 0x35
.equ clear, 0x01
.equ space, 0x20
.text
# r2 guarda recebe os resultados da intrução customizada do lcd
# r3 guarda valores temporários
# r4 controla o valor do placar do jogador 1
# r5 controla o valor do placar do jogador 2
# r6 endereço dos botões
# r7 guarda valores temporários
# r8 guarda endereços de instruções temporariamente
# r10 é usado para fazer contadores em loops
# r11 é usado para fazer contadores em loops
# r13 é usado para acessar o endereço de memória da bola e das barras esquerda e direita
# r14 contêm o valor 1 (um)
_start:
addi r14, r0, 1
movia r6, 0x3030 # endereço de memórios dos botões
movia r4, 0x2020
movia r5, 0x2030
init_lcd:
movia r3, 0x30
custom 0, r2, r0, r3
custom 0, r2, r0, r3
movia r3, 0x39
custom 0, r2, r0, r3
movia r3, 0x14
custom 0, r2, r0, r3
movia r3, 0x56
custom 0, r2, r0, r3
movia r3, 0x6D
custom 0, r2, r0, r3
movia r3, 0x70
custom 0, r2, r0, r3
movia r3, 0x0C
custom 0, r2, r0, r3
movia r3, 0x06
custom 0, r2, r0, r3
movia r3, 0x01
custom 0, r2, r0, r3
start_game:
addi r10, r0, 0
movia r11, 400000
call delay #chama label delay
movia r3, clear
custom 0, r2, r0, r3 # Limpa o display
call write_player
movia r3, Um
call player_x
movi r3, 0xC0 # Move o cursor para a posição 40
call write_player
movia r3, Dois
call player_x
br game
write_player:
custom 0, r2, r0, r3 #Altera a posição do cursor
movia r3, 0x50 # P
custom 0, r2, r14, r3
movia r3, 0x4C # L
custom 0, r2, r14, r3
movia r3, 0x41 # A
custom 0, r2, r14, r3
movia r3, 0x59 # Y
custom 0, r2, r14, r3
movia r3, 0x45 # E
custom 0, r2, r14, r3
movia r3, 0x52 # R
custom 0, r2, r14, r3
movia r3, space
custom 0, r2, r14, r3
ret
write_won:
movia r3, space
custom 0, r2, r14, r3
movia r3, 0x57 # W
custom 0, r2, r14, r3
movia r3, 0x4F # O
custom 0, r2, r14, r3
movia r3, 0x4E # N
custom 0, r2, r14, r3
ret
player_x:
custom 0, r2, r14, r3 # Escreve o ID do jogador
movia r3, 0x3A # doisPontos
custom 0, r2, r14, r3
subi sp, sp,4
stw ra, 0(sp)
mov r7, r4
call converse_number
custom 0, r2, r14, r3
ldw ra, 0(sp)
addi sp, sp, 4
ret
updateScore_p1:
subi sp, sp,4
stw ra, 0(sp)
movi r3, 0x89
custom 0, r2, r0, r3 # Move o cursor para a posição 11 (0B)
ldbuio r7, 0(r4)
call converse_number
custom 0, r2, r14, r3 # Escreve o novo placar
movi r3, 5
beq r7, r3, player1_won
ldw ra, 0(sp)
addi sp, sp, 4
ret
updateScore_p2:
subi sp, sp,4
stw ra, 0(sp)
movi r3, 0xC9
custom 0, r2, r0, r3 # Move o cursor para a posição 51 (4B)
ldbuio r7, 0(r5)
call converse_number
custom 0, r2, r14, r3 # Escreve o novo placar
movi r3, 5
beq r7, r3, player2_won
ldw ra, 0(sp)
addi sp, sp, 4
ret
converse_number:
beq r7, r0, lcd_hex0
beq r7, r14, lcd_hex1
movi r3, 2
beq r7, r3, lcd_hex2
movi r3, 3
beq r7, r3, lcd_hex3
movi r3, 4
beq r7, r3, lcd_hex4
movi r3, 5
beq r7, r3, lcd_hex5
lcd_hex0:
movia r3, 0x30
ret
lcd_hex1:
movia r3, Um
ret
lcd_hex2:
movia r3, Dois
ret
lcd_hex3:
movia r3, Tres
ret
lcd_hex4:
movia r3, Quatro
ret
lcd_hex5:
movia r3, Cinco
ret
delay:
addi r10, r10, 1
ble r10, r11, delay
ret
player1_won:
addi r10, r0, 0
movia r11, 900000
call delay #chama label delay
movia r3, clear # Limpa o display
custom 0, r2, r0, r3
call write_player
movia r3, Um
custom 0, r2, r14, r3
call write_won
addi r10, r0, 0
movia r11, 5000000
call delay #chama label delay
br start_game
player2_won:
addi r10, r0, 0
movia r11, 900000
call delay #chama label delay
movia r3, clear # Limpa o display
custom 0, r2, r0, r3
movi r3, 0xC0 # Move o cursor para a posição 40
custom 0, r2, r0, r3
call write_player
movia r3, Dois
custom 0, r2, r14, r3
call write_won
addi r10, r0, 0
movia r11, 5000000
call delay #chama label delay
br start_game
game:
addi r10, r0, 0
movia r11, 400000
call delay #chama label delay
call updateScore_p1
call updateScore_p2
br game