Advertisement
SMicro

AlinH_Candy

May 2nd, 2017
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Title      :
  3. * Written by :Fulgencio
  4. * Date       :
  5. * Description:  Ejemplo de comprobación de alineación horizontal
  6. *               de 3 o más caramelos en el tablero del juego
  7. *               CANDY-CRUSH. Si los hay, los marca con 0 en el
  8. *               panel auxiliar MASK
  9. *-----------------------------------------------------------
  10. NUMCOL EQU 8
  11. NUMFIL EQU 6
  12. PANSIZE EQU NUMCOL*NUMFIL
  13.  
  14.     ORG    $1000
  15. START:    
  16.     *Este es un ejemplo para fila 2 columna 4. Se debería hacer con TODOS
  17.     *los elementos de la  tabla asi como implementar también una subrutina
  18.     *para detectar igualmente las alineaciones en vertical (ALINV)
  19.  
  20.     MOVE.L #4,D2  * D2=col
  21.     MOVE.L #2,D3  * D3=fila
  22.     MOVE.L #PANEL,A0
  23.     JSR ALINH
  24.     SIMHALT
  25.  
  26.  
  27. ALINH   *Esta función recibe una coordenada fila y columna en D3 y D2
  28.         *Y comprueba si hay 3 o más alineados hacia la derecha
  29.         *Si los hay, los elimina sustituyendo por 0=vacío
  30.         *Si ha encontrado, devuelve D0=1 y si no D0=0
  31.        
  32.    
  33.     MOVEM.L D1-D3/A0-A1, -(A7)    
  34.    
  35.     MOVE.L D3,D0
  36.     LSL.L #3,D0  * multiplica por 8 la fila = MULU #8,D0
  37.     ADD.L D2,D0  * D0=fila*8+col  (8 elementos por fila)  
  38.     ADD.L D0,A0  *A0 apunta al elemento fila,col
  39.    
  40.     CLR.L D0    *D0 ahora será un contador de coincidencias
  41.  
  42.     MOVE.B (A0)+,D1     *D1 será el caramelo de esa posición y
  43.                         *ahora A0 apunta al adyacente a derecha    
  44.  
  45. .LOOP    
  46.     ADD.L #1,D0         *cuenta número de repetidos  
  47.     ADD.L #1,D2         *siguiente columna
  48.  
  49.     CMP.L #NUMCOL,D2    *¿hemos llegado al tope por la derecha?
  50.     BEQ .NOMAS          *si es así, no podemos seguir
  51.    
  52.     CMP.B (A0)+,D1       *Compara con el siguiente por la derecha
  53.     BEQ .LOOP           *Si es igual, añade otro y si no, sigue
  54.     SUB.L #1,A0         *Si no es igual, nos hemos pasado y retrocede  
  55. .NOMAS
  56.     CMP.L #3,D0
  57.     BCS .SAL0           *Si coincidencias <3 entonces sale sin hacer nada
  58.     ADD.L #PANSIZE,A0   *Va a proceder a marcar los alineados en tabla MASK
  59. .VACIA    
  60.     CLR.B -(A0)     *Va marcando con 0 los elementos alineados hacia la izquierda
  61.     SUB.L #1,D0     *decrementa contador de alineados
  62.     BNE .VACIA
  63.    
  64.     MOVE.L #1,D0    *Devuelve D0=1
  65.     JMP .SAL  
  66.    
  67. .SAL0 CLR.L D0      *Devuelve D0=0
  68. .SAL    
  69.     MOVEM.L (A7)+,D1-D3/A0-A1
  70.     RTS
  71.  
  72. * Put variables and constants here
  73.  
  74.       ORG $5000  *Variables a partir de $5000
  75.  
  76. PANEL DC.B 2,2,2,5,2,1,1,3
  77.       DC.B 1,2,3,4,5,2,1,2
  78.       DC.B 4,3,1,2,4,4,4,4
  79.       DC.B 2,1,4,5,1,4,4,3
  80.       DC.B 3,5,3,3,1,3,3,2
  81.       DC.B 1,2,2,3,1,3,1,1
  82.            *En esta tabla auxiliar se marcarán con 0 los elementos
  83.            *alineados (3 o más) detectados para ser borrados
  84. MASK  DC.B 1,1,1,1,1,1,1,1
  85.       DC.B 1,1,1,1,1,1,1,1
  86.       DC.B 1,1,1,1,1,1,1,1
  87.       DC.B 1,1,1,1,1,1,1,1
  88.       DC.B 1,1,1,1,1,1,1,1
  89.       DC.B 1,1,1,1,1,1,1,1
  90.      
  91. CRLF  DC.B 10,13,0
  92.  
  93.     END    START        ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement