This repository has been archived by the owner on Jun 14, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrabajo.asm
297 lines (269 loc) · 8.25 KB
/
trabajo.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
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
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
fin .equ 0xFF01
pantalla .equ 0xFF00
teclado .equ 0xFF02
.globl programa
.globl contador_tablero
.globl intentos
.globl tablero_lista
.globl tablero_numero
.globl tablero_tamano
.globl imprime_cadena
.globl imprime_tablero
.globl limpia_pantalla
;Se utilizan para almacena la posicion de la letra y la letra
primera_letra_pos: .byte 0
primera_letra_char: .asciz ""
primera_letra_texto: .asciz "\033[93m\n\tPRIMERA LETRA\n\t-------------\033[0m"
segunda_letra_pos: .byte 0
segunda_letra_char: .asciz ""
segunda_letra_texto: .asciz "\033[93m\n\n\tSEGUNDA LETRA\n\t-------------\033[0m"
;Texto pregunta filas y columnas
;Almacena los resultados de [(fila-1)*ancho]+columna
pregunta_fil: .asciz "\tIntroduzca una fila: "
pregunta_col: .asciz "\n\tIntroduzca una columna: "
operacion_pos: .byte 0
;Indicador numero de tablero y intentos restantes
num_aciertos: .byte 0 ;Para pasar al siguiente tablero
contador_tablero: .byte 0
intentos: .byte 0
tablero_x: .asciz "XXXXXXXXXXXXXXXX"
enter: .asciz ") Pulse intro."
success: .asciz "\tEnhorabuena, has completado el tablero."
success_final: .asciz "\tENHORABUENA, has completado todos los tableros."
instrucciones_texto: .ascii ") El usuario debe elegir dos letras segun su fila y columna,"
.ascii "\n Si son iguales, estas dos letras quedaran reveladas."
.ascii "\n Si no son iguales, volveran a su puesto y se tapara con X."
.ascii "\n Si se completa el tablero, se pasara al siguiente y asi hasta que se completen todos,"
.asciz " entonces se volvera al primer tablero.\n\n"
menu: .asciz "\33[1;31mMEMORAMA (v.777)\n\n\33[1;34m1) Jugar\n2) Instrucciones\nS) Salir\33[0m\n"
programa:
lds #0xF000 ;Crea valor de pila
p_menu:
jsr limpia_pantalla
ldx #menu
jsr imprime_cadena
ldb teclado
;;;;;;;;
cmpb #'1
bne no_jugar
jsr jugar
;;;;;;;;
no_jugar:
cmpb #'2
beq instrucciones
;;;;;;;;
cmpb #'S
beq acabar
;;;;;;;;
jsr limpia_pantalla
bra p_menu
acabar:
sta fin
;//////////////;
;--SUBRUTINAS--;
;//////////////;
instrucciones:
ldx #instrucciones_texto
jsr imprime_cadena
jsr limpia_pantalla
bra p_menu
;///////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////
voltea_todas_x:
;-----------
pshs a,b
ldx #tablero_x
bucle_x:
;CARGA TODO EL TABLERO CON X
lda #'X
sta ,x+
;Asi compruebo si ha llegado a EOL
lda ,x
beq ret
bra bucle_x
ret:
puls a,b
rts
;///////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////
jugar:
;----
lda #0
sta num_aciertos
ldx #enter
jsr imprime_cadena
jsr limpia_pantalla
jsr voltea_todas_x
ldx #tablero_lista
jsr imprime_tablero
seguir1:
jsr limpia_pantalla
ldx #tablero_x
jsr imprime_tablero
;//////// PREGUNTA POSICION LETRA \\\\\\\\
primera_letra:
;-------------
ldx #primera_letra_texto
jsr imprime_cadena
lda #'\n
sta pantalla
ldx #pregunta_fil
jsr imprime_cadena
lda teclado
;Si se pulsa X se vuelve al programa
cmpa #'X
lbeq terminar_programa
;Si es menor que 1 filas vuelve
cmpa #'1
blt seguir1
;Si es mayor que 4 filas vuelve
cmpa #'4
bhi seguir1
suba #'0
;[(fila-1)*ancho]+columna
deca ; a = fila -1
ldb tablero_tamano ; b = 4
mul ; d = (fila-1)*4
std operacion_pos ; operacion_pos = d
columna1:
clra ;Me aseguro de que D = 0
clrb
ldx #pregunta_col
jsr imprime_cadena
ldb teclado
;Si se pulsa X se vuelve al programa
cmpb #'X
lbeq terminar_programa
;Si es menor que 1 filas vuelve
cmpb #'1
blt columna1
;Si es mayor que 4 filas vuelve
cmpb #'4
bhi columna1
subb #'0 ; b = columna
decb ; b = columna-1
addd operacion_pos ; d = d + operacion_pos
std primera_letra_pos ; primera_letra_pos = d
; (posicion numerica 1 letra)
;Comprueba que la letra no estaba ya cambiada
ldx #tablero_x
lda b,x
cmpa #'X
lbne seguir1
;---Muestra letra---
ldy #tablero_lista
lda b,y
sta b,x
sta primera_letra_char
seguir2:
jsr limpia_pantalla
ldx #tablero_x
jsr imprime_tablero
segunda_letra:
;-------------
ldx #segunda_letra_texto
jsr imprime_cadena
lda #'\n
sta pantalla
fila1:
ldx #pregunta_fil
jsr imprime_cadena
lda teclado
;Si se pulsa X se vuelve al programa
cmpa #'X
lbeq terminar_programa
;Si es menor que 1 filas vuelve
cmpa #'1
lblt segunda_letra
;Si es mayor que 4 filas vuelve
cmpa #'4
lbhi segunda_letra
suba #'0
;[(fila-1)*ancho]+columna
deca ; a = fila -1
ldb tablero_tamano ; b = 4
mul ; d = (fila-1)*4
std operacion_pos ; operacion_pos = d
columna2:
clra ;Me aseguro de que D = 0
clrb
ldx #pregunta_col
jsr imprime_cadena
ldb teclado
;Si se pulsa X se vuelve al programa
cmpb #'X
lbeq terminar_programa
;Si es menor que 1 filas vuelve
cmpb #'1
blt columna2
;Si es mayor que 4 filas vuelve
cmpb #'4
bhi columna2
subb #'0 ; b = columna
decb ; b = columna -1
addd operacion_pos ; b = b + operacion_pos
std segunda_letra_pos ; segunda_letra_pos = b
; (posicion numerica 2 letra)
;Comprueba que la letra no estaba ya cambiada
ldx #tablero_x
lda b,x
cmpa #'X
lbne segunda_letra
;---Muestra letra---
ldy #tablero_lista
lda b,y
sta b,x
sta segunda_letra_char
;
;//////// COMPARAR LAS LETRAS \\\\\\\\
; inc intentos
; lda primera_letra_char
; cmpa segunda_letra_char
; bne incorrecto
; bra correcto
; incorrecto:
; ;Cambia las letras erróneas a X otra vez
; ldx #tablero_x
; lda #'X
; ldb primera_letra_pos
; sta b,x
; ldb segunda_letra_pos ;Aqui hay basura ??
; sta b,x
; lbra seguir1
;
; correcto:
; ;Incrementa aciertos en 2
; clra
; inc num_aciertos
; ldb num_aciertos
; ;Comprueba si quedan parejas por completar
; cmpb #8
; lbne seguir1
; sgte_tab:
inc contador_tablero
; lda contador_tablero
; cmpa #7
; beq final
; jsr limpia_pantalla
; ldx #success
; jsr imprime_cadena
; ;Si ha terminado el tablero, incrementa el contador y va al menu
; inc contador_tablero
; bra terminar_programa
; final:
; jsr limpia_pantalla
; lda #0
; sta contador_tablero
; sta intentos
; ldx #success_final
; jsr imprime_cadena
; bra terminar_programa
terminar_programa:
clra
clrb
rts
;///////////////;
;///////////////;
.area FIJA(ABS)
.org 0xFFFE ; Vector de RESET
.word programa