-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmovimento 01.asm
165 lines (130 loc) · 6.76 KB
/
movimento 01.asm
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
.text
main:
# Inicialização do display e registradores
lui $8, 0x1001 # Carrega 0x10010000 no registrador $8 (endereço base do display)
addi $9, $0, 32768 # Inicializa $9 com 512 (contador de unidades para o loop)
ori $4, $0, 0xff0000 # Carrega 0x0000FFFF em $5 (parte baixa definida) aqui define a cor, que tem que star em $a0 para ser impressa na tela
sll $5, $5, 8 # Desloca 8 bits para a esquerda: $5 <= 0x00FFFF00 (cor configurada)
# Loop para desenhar uma linha de pixels na tela
for1: beq $9, $0, fimScr # Se o contador $9 for 0, sai do loop e vai para fimScr
addi $4, $4, 0x000001
sw $4, 0($8) # Escreve o valor de $4 na posição atual do display ($8)
#sw $4, 2048($8) # Escreve o mesmo valor na linha seguinte (distância de 2048 bytes)
addi $8, $8, 4 # Incrementa $8 para mover 4 bytes (próximo pixel horizontal)
addi $9, $9, -1 # Decrementa o contador $9
j for1 # Retorna ao início do loop
fimScr:
loopShift:
lui $8, 0x1001
addi $11, $0, 128 # Número de linhas na tela (128 linhas)
addi $12, $0, 1024 # Bytes por linha (256 unidades * 4 bytes por unidade)
linhaShift:
beq $11, $0, repetirShift
# Calcula o início da linha atual ($8 já aponta para o início)
move $14, $8 # $14 mantém o endereço inicial da linha atual
#add $15, $14, $12 # $15 aponta para o fim da linha atual
# Salva a última unidade da linha para realocar no início da linha
#lw $16, -4($15) # Carrega o último valor da linha (última unidade)
addi $13, $0, 0 # Reinicia o contador para o deslocamento
# Desloca todas as unidades para a esquerda
deslocarLinha:
beq $13, $12, proximaLinha # Se $13 == $12 (todas as unidades deslocadas), vá para o reposicionamento
lw $18, 4($14) # Carrega o valor da próxima unidade
sw $18, 0($14) # Escreve o valor na posição atual
addi $14, $14, 4 # Move para o próximo endereço
addi $13, $13, 4 # Incrementa o contador
j deslocarLinha # Continua o deslocamento
# Reposiciona a última unidade no início da linha
#reposicionarFim:
# sw $16, 0($14) # Escreve o último valor salvo no início da linha
# Avança para a próxima linha
proximaLinha:
addi $8, $8, 1024 # Move para o endereço da próxima linha
addi $11, $11, -1 # Decrementa o número de linhas restantes
j linhaShift # Volta ao início do loop para a próxima linha
# Reinicia o loop principal para efeito infinito
repetirShift:
j loopShift # Reinicia o loop principal
fimShiftBg:
addi $2, $0, 10 # Finaliza o programa (nunca será alcançado neste caso)
syscall
#loopShift:
lui $8, 0x1001 # Carrega 0x10010000 no registrador $8 (endereço base do display)
addi $9, $0, 0 # Inicializa $9 com 512 (contador de pixels para o loop)
addi $22, $0, 1024
# addi $8, $8, -131072
shiftBg:
lw $23, 0($8)
addi $8, $8, 4
midshiftBg:
lw $21, 0($8)
sw $23, 0($8)
lw $23, 4($8)
sw $21, 4($8)
addi $8, $8, 4
div $9, $22
mflo $10
addi $9, $9, 1
beq $9, 32768, loopShift # Se o contador $9 for 32768, sai do loop e vai para fimScr
j midshiftBg
bne $10, $0, midshiftBg
doShift:
sw $23, 0($8)
addi $8, $8, 4 # Incrementa $8 para mover 4 bytes (próximo pixel horizontal)
j shiftBg
j loopShift
#fimShiftBg:
addi $2, $0, 10
syscall
# Configuração inicial para o loop interativo
lui $8, 0x1001 # Recarrega o endereço base do display no registrador $8
ori $20, $0, 0xffffff # Define $20 como cor branca (0xFFFFFF)
addi $10, $0, 512 # Inicializa $10 com 512 (usado para interação/movimento)
lui $21, 0xffff # Configura $21 como endereço base da entrada do teclado
addi $25, $0, 32 # Define $25 com o valor ASCII para espaço (' ')
addi $10, $0, 4 # Define passo padrão como 4 pixels
addi $11, $0, 'a' # Define o caractere 'a' (mover para a esquerda)
addi $12, $0, 'd' # Define o caractere 'd' (mover para a direita)
addi $13, $0, 's' # Define o caractere 's' (mover para baixo)
addi $14, $0, 'w' # Define o caractere 'w' (mover para cima)
# Loop interativo para controlar os pixels
for2:
sw $20, 0($8) # Desenha um pixel na posição atual ($8)
jal timer # Chama a função timer para criar um atraso
lw $9, 2048($8) # Lê o valor do pixel na linha abaixo
sw $9, 0($8) # Move o pixel lido para a posição atual
add $8, $8, $10 # Move o ponteiro $8 de acordo com o passo $10
# ações do teclado
lw $22, 0($21) # Lê a entrada do teclado no endereço $21
beq $22, $0, cont # Se não houver entrada, continua o loop
lw $23, 4($21) # Lê o último caractere pressionado
beq $23, $25, fim # Se espaço for pressionado, termina o programa
beq $23, $11, esq # Se 'a' for pressionado, move para a esquerda
beq $23, $12, dir # Se 'd' for pressionado, move para a direita
beq $23, $13, baixo # Se 's' for pressionado, move para baixo
beq $23, $14, cima # Se 'w' for pressionado, move para cima
j cont
# Blocos de controle de direção
esq: addi $10, $0, -4 # Ajusta o passo para mover para a esquerda (4 pixels para trás)
j cont
dir: addi $10, $0, 4 # Ajusta o passo para mover para a direita (4 pixels para frente)
j cont
baixo: addi $10, $0, 1024 # Ajusta o passo para mover para baixo (1024 bytes para baixo)
j cont
cima: addi $10, $0, -1024 # Ajusta o passo para mover para cima (N bytes para cima)
j cont
cont: j for2 # Volta ao início do loop interativo
fim: addi $2, $0, 10 # Prepara syscall 10 (encerrar programa)
syscall # Finaliza o programa
# Função timer para criar atraso
timer: sw $16, 0($29) # Salva o valor do registrador $16 na pilha
addi $29, $29, -4 # Ajusta o ponteiro da pilha para armazenar mais dados
addi $16, $0, 10000 # Inicializa o contador do timer com 100000
forT: beq $16, $0, fimT # Se o contador chegar a 0, sai do loop
nop # Instrução de preenchimento
nop # Instrução de preenchimento
addi $16, $16, -1 # Decrementa o contador
j forT # Continua o loop do timer
fimT: addi $29, $29, 4 # Ajusta o ponteiro da pilha de volta
lw $16, 0($29) # Recupera o valor original de $16 da pilha
jr $31 # Retorna para o chamador