Advertisement
SMicro

2048 Tablero + Desplaz. abajo

May 12th, 2015
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *--------------------------------------------------------------------------------------------
  2. * Title      :EJEMPLO BÁSICO DE REPRESENTACIÓN DE UN MAPA MATRIZ 4x4 PARA EL JUEGO 2048
  3. * Written by :Fulgencio
  4. * Date       :05/2015
  5. * Description:     Se trata de a partir de un mapa de los elementos del tablero en la memoria, se representan
  6. *               dichos elementos en la pantalla (PINTAMAPA) y se dibujan una rejilla gráfica separadora (REJILLA)
  7. *                  Está estructurado con subrutinas. Se ha añadido la subrutina que realiza un desplazamiento
  8. *               hacia abajo de la fila que se señale con A1. Faltarían las subrutinas que realicen los desplazamientos
  9. *               en las otras 3 direcciones
  10. *--------------------------------------------------------------------------------------------
  11.  
  12.  
  13.     ORG    $1000
  14. START:                  ; first instruction of program
  15.  
  16. * Put program code here
  17.  
  18.      MOVE.L #CELDAS,A1 ;A1 apunta a la matrix 4x4
  19.      
  20.      JSR PINTAMAPA
  21.      JSR REJILLA    
  22.      
  23.      MOVE.L #CELDAS+8,A1 *Apuntamos a la 3ª fila (penúltima)
  24.      
  25.      JSR DOWNROW         *Aquí solo hacemos un ejemplo de un solo desplazamiento de la penúltima fila pero
  26.                          *realmente para que sea completo hay que realizarlo con las 3 primeras filas y
  27.                          *a su vez repetirlo 3 veces para asegurar que se hacen todos los desplazamientos
  28.      
  29.      MOVE.L #5,D0
  30.      TRAP #15 *Espera tecla que se almacena en D1 pero no se comprueba en este ejemplo
  31.  
  32.      MOVE.L #11,D0
  33.      MOVE.L #0,D1
  34.      TRAP #15 *Cursor al origen
  35.      
  36.  
  37.      MOVE.L #CELDAS,A1
  38.      JSR PINTAMAPA
  39.      JSR REJILLA
  40.      
  41.      SIMHALT             ; halt simulator
  42.      
  43.      
  44. PINTAMAPA  
  45.      MOVE.B #4,D4 ;Contador de columna. Cada 4 saltamos a otra fila
  46. BUCLE1    
  47.      MOVE.L #1,D1 ;Utilizamos el 1 de base para elevar a la potencia de 2 correspondiente
  48.      
  49.      MOVE.B (A1)+,D2 ;Cogemos un elemento de la matriz y lo pasamos a D2
  50.      LSL.L D2,D1 ;Obtenemos la potencia de 2 (2^n equivale a desplazar el valor 1, n veces a izquierda)
  51.  
  52.      JSR IMPRIME  *Imprime el valor calculado que tenemos en D1 o un vacío si es 1
  53.    
  54.      SUB.B #1,D4 *contador de columnas
  55.      BNE BUCLE1  ¿Han salido ya 4 columnas? Entonces vamos a la siguiente línea
  56.      
  57.      CMP.L #CELDAS+16,A1 ;¿Estan todas las líneas dibujadas?
  58.      BEQ COMPLETO ;Terminamos
  59.      
  60.      JSR SALTOLIN  ;Avanza linea
  61.      JMP PINTAMAPA  ;Reinicia contador de columna
  62. COMPLETO
  63.      JSR SALTOLIN
  64.      JSR SALTOLIN
  65.      RTS                
  66.        
  67.  
  68. *************************************      
  69. IMPRIME *Esta función imprime un elemento que puede ser un vacío o un valor numérico
  70.         *Para que al imprimir, los elementos queden alineados verticalmente, utilizamos
  71.         *los números se rellenan con espacios para ocupar siempre a 6 caracteres en total
  72.        
  73.         *input: D1 (valor numérico a imprimir. Si es 1, presenta un vacío)
  74.         *Utiliza D0, D2 y A1 pero los guarda en la pila
  75.        
  76.         MOVEM.L D0/D2/A1,-(A7) salvaguardamos en la pila
  77.  
  78.         CMP.B #1,D1 ;¿ES UN VACIO? 1=vacio
  79.         BEQ PRINVACIOS
  80.         MOVE.L #20,D0
  81.         MOVE.L #6,D2
  82.         TRAP #15   ;Imprime números formateados a 6 espacios
  83.         JMP RETPRIN
  84.        
  85. PRINVACIOS
  86.          MOVE.L #14,D0
  87.          MOVE.L #VACIOS6,A1  ;cadena de 6 espacios
  88.          TRAP #15
  89. RETPRIN
  90.          MOVEM.L (A7)+,D0/D2/A1  recuperamos los registros de la pila
  91.          RTS
  92. *************************************
  93.  
  94. REJILLA *Dibuja una rejilla 4x4 para generar las celdas
  95.         *Utiliza D0 a D4 pero los guarda en la pila
  96.  
  97.         MOVEM.L D0-D4,-(A7) salvaguardamos en la pila
  98.  
  99.         MOVE.L #87,D0 ;Linea gráfica de X1=D1,Y1=D2 a X2=D3,Y2=D4
  100.         MOVE.W #0,D1
  101.         MOVE.W #0,D2
  102. LOOPREJ1        
  103.         MOVE.W D1,D3  ;La línea es vertical por lo que X es igual en ambos extremos
  104.         MOVE.W #112,D4
  105.         TRAP #15      *Línea vertical de 112 de longitud
  106.         ADD.W #50,D1  *Nos vamos 50 pixeles a la derecha. Ancho de columna
  107.         CMP.W #250,D1 *coordenada X límite que ya no hay que dibujar. Solo 5 lineas
  108.         BNE LOOPREJ1
  109.  
  110.         MOVE.W #0,D1
  111.         MOVE.W #0,D2
  112.         MOVE.W #200,D3 *Ancho de tablero
  113. LOOPREJ2
  114.         MOVE.W D2,D4
  115.         TRAP #15
  116.         ADD.W #28,D2  *Tamaño de fila
  117.         CMP.W #140,D2 *coordenada Y límite que ya no hay que dibujar
  118.         BNE LOOPREJ2          
  119.  
  120.         MOVEM.L (A7)+,D0-D4 recuperamos los registros de la pila
  121.  
  122.         RTS
  123.  
  124.  
  125. *************SUBRUTINAS AUXILIARES**************
  126. ESPACIO MOVE.L #6,D0
  127.         MOVE.B #' ',D1 ;imprime un espacio
  128.         TRAP #15
  129.         RTS
  130.        
  131. SALTOLIN *modifica D0 y A1
  132.  
  133.          MOVEM.L D0/A1,-(A7) salvaguardamos en la pila
  134.  
  135.          MOVE.L #14,D0
  136.          MOVE.L #CRLF,A1  ;RETORNO CARRO + AVANCE DE LINEA
  137.          TRAP #15
  138.          TRAP #15 ;dos saltos de linea
  139.  
  140.          MOVEM.L (A7)+,D0/A1  recuperamos los registros de la pila
  141.          RTS
  142.          
  143. ********************************************************
  144. DOWNROW *Esta subrutina desplaza hacia abajo y la fusiona con la fila siguiente.
  145.         *El registro A1 apunta al principio de la fila que se le hará valer CELDAS, CELDAS+4 o CELDAS+8
  146.         *según la fila que se elija. Normalmente se empezará por la penúltima y se irá hacia atrás
  147.        
  148.         *input: A1 (dirección del principio de la fila a desplazar)
  149.        
  150.         MOVE.L A1,A2
  151.         ADD.L #4,A2 ;A2 apunta a la siguiente fila (4 posiciones más)
  152. MASELEM
  153.         MOVE.B (A1),D1 ;Tomamos el elemento de la fila que probaremos a desplazar hacia abajo
  154.         CMP.B #0,4(A1) ;Comprobamos si hay hueco en la fila siguiente
  155.         BEQ HAYHUECO  ;Si está vacío se puede desplazar
  156.        
  157.         CMP.B 4(A1),D1 ;Compara si son iguales
  158.         BEQ FUSION ; Si son iguales, hay fusión
  159.         ADD.L #1,A1 ;Pasamos al siguiente
  160.        
  161.         JMP OTROELE
  162.        
  163. HAYHUECO
  164.         MOVE.B D1,4(A1) ;Mueve el elemento al hueco
  165.         MOVE.B #0,(A1)+ ;Al desplazarse deja hueco en la fila y pasamos al siguiente elemento
  166.         JMP OTROELE ;Para comprobar si quedan elementos por mover o ya ha acabado
  167.        
  168. FUSION  ADD.B #1,4(A1) ;Al fusionar, se incrementa la potencia de 2
  169.         BSET #7,4(A1)  *Marcamos el bit 7 que no se utiliza como indicador de que se ha producido una fusión
  170.                        *ya que no se puede producir otra con el resultado en el mismo movimiento
  171.                        *Al finalizar los movimientos hay que desactivar los indicadores
  172.         MOVE.B #0,(A1)+ ;Al desplazarse deja hueco en la fila y pasamos al siguiente elemento
  173.  
  174.  
  175. OTROELE
  176.         CMP.L A2,A1 ;¿Ha repasado los 4 elementos de la fila?
  177.         BNE MASELEM ;Si no, va al siguiente      
  178.         RTS
  179. *******************************************************
  180.  
  181.  
  182.  
  183. * Put variables and constants here
  184.  
  185.         ORG $5000
  186.  
  187. *CELDAS CORRESPONDE AL MAPA DE ESTADO DEL TABLERO 4x4. Se necesitan 16 elementos organizados en 4x4
  188. *Como una celda solo puede estar o vacía (0) o conteniendo una potencia de 2 (2,4,8,16...2048)
  189. *almacenamos sólo el exponente (dejando el 0 para la vacía) y así podemos utilizar el tamaño byte
  190.  
  191.  
  192. CELDAS DC.B 0,0,0,0
  193.        DC.B 0,0,0,0
  194.        DC.B 1,2,3,1
  195.        DC.B 3,2,0,1
  196.  
  197. VACIOS6 DC.B '      ',0 *Cadena de 6 caracteres espacio para representar la casilla vacía
  198. CRLF DC.B 10,13,0 *Cadena que representa avance de linea y retorno de carro
  199.  
  200.     END    START        ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement