Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *--------------------------------------------------------------------------------------------
- * Title :EJEMPLO BÁSICO DE REPRESENTACIÓN DE UN MAPA MATRIZ 4x4 PARA EL JUEGO 2048
- * Written by :Fulgencio
- * Date :05/2015
- * Description: Se trata de a partir de un mapa de los elementos del tablero en la memoria, se representan
- * dichos elementos en la pantalla (PINTAMAPA) y se dibujan una rejilla gráfica separadora (REJILLA)
- * Está estructurado con subrutinas. Se ha añadido la subrutina que realiza un desplazamiento
- * hacia abajo de la fila que se señale con A1. Faltarían las subrutinas que realicen los desplazamientos
- * en las otras 3 direcciones
- *--------------------------------------------------------------------------------------------
- ORG $1000
- START: ; first instruction of program
- * Put program code here
- MOVE.L #CELDAS,A1 ;A1 apunta a la matrix 4x4
- JSR PINTAMAPA
- JSR REJILLA
- MOVE.L #CELDAS+8,A1 *Apuntamos a la 3ª fila (penúltima)
- JSR DOWNROW *Aquí solo hacemos un ejemplo de un solo desplazamiento de la penúltima fila pero
- *realmente para que sea completo hay que realizarlo con las 3 primeras filas y
- *a su vez repetirlo 3 veces para asegurar que se hacen todos los desplazamientos
- MOVE.L #5,D0
- TRAP #15 *Espera tecla que se almacena en D1 pero no se comprueba en este ejemplo
- MOVE.L #11,D0
- MOVE.L #0,D1
- TRAP #15 *Cursor al origen
- MOVE.L #CELDAS,A1
- JSR PINTAMAPA
- JSR REJILLA
- SIMHALT ; halt simulator
- PINTAMAPA
- MOVE.B #4,D4 ;Contador de columna. Cada 4 saltamos a otra fila
- BUCLE1
- MOVE.L #1,D1 ;Utilizamos el 1 de base para elevar a la potencia de 2 correspondiente
- MOVE.B (A1)+,D2 ;Cogemos un elemento de la matriz y lo pasamos a D2
- LSL.L D2,D1 ;Obtenemos la potencia de 2 (2^n equivale a desplazar el valor 1, n veces a izquierda)
- JSR IMPRIME *Imprime el valor calculado que tenemos en D1 o un vacío si es 1
- SUB.B #1,D4 *contador de columnas
- BNE BUCLE1 ¿Han salido ya 4 columnas? Entonces vamos a la siguiente línea
- CMP.L #CELDAS+16,A1 ;¿Estan todas las líneas dibujadas?
- BEQ COMPLETO ;Terminamos
- JSR SALTOLIN ;Avanza linea
- JMP PINTAMAPA ;Reinicia contador de columna
- COMPLETO
- JSR SALTOLIN
- JSR SALTOLIN
- RTS
- *************************************
- IMPRIME *Esta función imprime un elemento que puede ser un vacío o un valor numérico
- *Para que al imprimir, los elementos queden alineados verticalmente, utilizamos
- *los números se rellenan con espacios para ocupar siempre a 6 caracteres en total
- *input: D1 (valor numérico a imprimir. Si es 1, presenta un vacío)
- *Utiliza D0, D2 y A1 pero los guarda en la pila
- MOVEM.L D0/D2/A1,-(A7) salvaguardamos en la pila
- CMP.B #1,D1 ;¿ES UN VACIO? 1=vacio
- BEQ PRINVACIOS
- MOVE.L #20,D0
- MOVE.L #6,D2
- TRAP #15 ;Imprime números formateados a 6 espacios
- JMP RETPRIN
- PRINVACIOS
- MOVE.L #14,D0
- MOVE.L #VACIOS6,A1 ;cadena de 6 espacios
- TRAP #15
- RETPRIN
- MOVEM.L (A7)+,D0/D2/A1 recuperamos los registros de la pila
- RTS
- *************************************
- REJILLA *Dibuja una rejilla 4x4 para generar las celdas
- *Utiliza D0 a D4 pero los guarda en la pila
- MOVEM.L D0-D4,-(A7) salvaguardamos en la pila
- MOVE.L #87,D0 ;Linea gráfica de X1=D1,Y1=D2 a X2=D3,Y2=D4
- MOVE.W #0,D1
- MOVE.W #0,D2
- LOOPREJ1
- MOVE.W D1,D3 ;La línea es vertical por lo que X es igual en ambos extremos
- MOVE.W #112,D4
- TRAP #15 *Línea vertical de 112 de longitud
- ADD.W #50,D1 *Nos vamos 50 pixeles a la derecha. Ancho de columna
- CMP.W #250,D1 *coordenada X límite que ya no hay que dibujar. Solo 5 lineas
- BNE LOOPREJ1
- MOVE.W #0,D1
- MOVE.W #0,D2
- MOVE.W #200,D3 *Ancho de tablero
- LOOPREJ2
- MOVE.W D2,D4
- TRAP #15
- ADD.W #28,D2 *Tamaño de fila
- CMP.W #140,D2 *coordenada Y límite que ya no hay que dibujar
- BNE LOOPREJ2
- MOVEM.L (A7)+,D0-D4 recuperamos los registros de la pila
- RTS
- *************SUBRUTINAS AUXILIARES**************
- ESPACIO MOVE.L #6,D0
- MOVE.B #' ',D1 ;imprime un espacio
- TRAP #15
- RTS
- SALTOLIN *modifica D0 y A1
- MOVEM.L D0/A1,-(A7) salvaguardamos en la pila
- MOVE.L #14,D0
- MOVE.L #CRLF,A1 ;RETORNO CARRO + AVANCE DE LINEA
- TRAP #15
- TRAP #15 ;dos saltos de linea
- MOVEM.L (A7)+,D0/A1 recuperamos los registros de la pila
- RTS
- ********************************************************
- DOWNROW *Esta subrutina desplaza hacia abajo y la fusiona con la fila siguiente.
- *El registro A1 apunta al principio de la fila que se le hará valer CELDAS, CELDAS+4 o CELDAS+8
- *según la fila que se elija. Normalmente se empezará por la penúltima y se irá hacia atrás
- *input: A1 (dirección del principio de la fila a desplazar)
- MOVE.L A1,A2
- ADD.L #4,A2 ;A2 apunta a la siguiente fila (4 posiciones más)
- MASELEM
- MOVE.B (A1),D1 ;Tomamos el elemento de la fila que probaremos a desplazar hacia abajo
- CMP.B #0,4(A1) ;Comprobamos si hay hueco en la fila siguiente
- BEQ HAYHUECO ;Si está vacío se puede desplazar
- CMP.B 4(A1),D1 ;Compara si son iguales
- BEQ FUSION ; Si son iguales, hay fusión
- ADD.L #1,A1 ;Pasamos al siguiente
- JMP OTROELE
- HAYHUECO
- MOVE.B D1,4(A1) ;Mueve el elemento al hueco
- MOVE.B #0,(A1)+ ;Al desplazarse deja hueco en la fila y pasamos al siguiente elemento
- JMP OTROELE ;Para comprobar si quedan elementos por mover o ya ha acabado
- FUSION ADD.B #1,4(A1) ;Al fusionar, se incrementa la potencia de 2
- BSET #7,4(A1) *Marcamos el bit 7 que no se utiliza como indicador de que se ha producido una fusión
- *ya que no se puede producir otra con el resultado en el mismo movimiento
- *Al finalizar los movimientos hay que desactivar los indicadores
- MOVE.B #0,(A1)+ ;Al desplazarse deja hueco en la fila y pasamos al siguiente elemento
- OTROELE
- CMP.L A2,A1 ;¿Ha repasado los 4 elementos de la fila?
- BNE MASELEM ;Si no, va al siguiente
- RTS
- *******************************************************
- * Put variables and constants here
- ORG $5000
- *CELDAS CORRESPONDE AL MAPA DE ESTADO DEL TABLERO 4x4. Se necesitan 16 elementos organizados en 4x4
- *Como una celda solo puede estar o vacía (0) o conteniendo una potencia de 2 (2,4,8,16...2048)
- *almacenamos sólo el exponente (dejando el 0 para la vacía) y así podemos utilizar el tamaño byte
- CELDAS DC.B 0,0,0,0
- DC.B 0,0,0,0
- DC.B 1,2,3,1
- DC.B 3,2,0,1
- VACIOS6 DC.B ' ',0 *Cadena de 6 caracteres espacio para representar la casilla vacía
- CRLF DC.B 10,13,0 *Cadena que representa avance de linea y retorno de carro
- END START ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement