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. Versión Gráfica
- * Written by :Fulgencio
- * Date :04/2015
- * Description: Se trata de a partir de una representación del tablero en la memoria, representar
- * los elementos en la pantalla. En este ejemplo utilizamos la versión gráfica de
- * presentación de texto en pantalla (Task 95) de manera que podemos situar con mayor
- * precisión el mismo en la pantalla.
- *-----------------------------------------------------------
- INIX EQU 70
- INIY EQU 70
- INCX EQU 60
- INCY EQU 60 *Cambiar estas constantes para otro tamaño o posición
- DECY EQU INCY/2-8 *Para centrar la rejilla en vertical
- ORG $1000
- START: ; first instruction of program
- * Put program code here
- MOVE.L #CELDAS,A2 ;A2 apunta a la matrix 4x4
- JSR PINTARMAPA
- JSR REJILLA
- SIMHALT
- PINTARMAPA *Utiliza D1 y D2 para la coordenada X,Y de los elementos que imprime
- *D3 lo utiliza como temporal para capturar el elemento y calcular el desplazamiento
- *A2 apunta al mapa en memoria. A1 apunta a una tabla de conversión número->cadena_texto
- MOVE.L #INIY,D2
- REINICIO
- MOVE.L #INIX,D1
- BUCLE1
- MOVE.L #ELEM,A1 ;A1 apunta a la tabla de elementos en formato cadenas de texto
- CLR.L D3
- MOVE.B (A2)+,D3 ;Cogemos un elemento de la matriz y lo pasamos a D3
- LSL.L #3,D3 *Multiplicamos por 8, que es lo que ocupa cada elemento
- ADD.L D3,A1 *Sumamos D3 y A1 apuntará exactamente al elemento a representar
- MOVE.L #95,D0
- TRAP #15 *Imprime la cadena de texto en modo gráfico (TASK 95) en coordenadas X=D1 e Y=D2
- ADD.L #INCX,D1 *Avanza en X
- CMP.L #INIX+4*INCX,D1 *Se comprueba si ya ha llegado a la última columna
- BNE BUCLE1 *si no han salido las 4 columnas sacará la siguiente
- CMP.L #CELDAS+16,A2 *¿Estan todas las líneas dibujadas?
- BEQ COMPLETO *Terminamos
- ADD.L #INCY,D2
- JMP REINICIO *Reinicia contador de columnas para una siguiente fila
- COMPLETO
- 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 #INIX,D1
- MOVE.W #INIY-DECY,D2
- LOOPREJ1
- MOVE.W D1,D3 ;La línea es vertical por lo que X es igual en ambos extremos
- MOVE.W #INIY-DECY+INCY*4,D4
- TRAP #15 *Línea vertical de 160 de longitud
- ADD.W #INCX,D1 *Nos vamos a la siguiente vertical
- CMP.W #INIX+5*INCX,D1 *La 5ª ya no hay que dibujarla
- BNE LOOPREJ1
- MOVE.W #INIX,D1
- MOVE.W #INIY-DECY,D2
- MOVE.W #INIX+4*INCX,D3
- LOOPREJ2
- MOVE.W D2,D4
- TRAP #15
- ADD.W #INCY,D2
- CMP.W #INIY-DECY+INCY*5,D2 *La 5ª ya no hay que dibujarla
- BNE LOOPREJ2
- MOVEM.L (A7)+,D0-D4 recuperamos los registros de la pila
- 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 (reservando el 0 para la vacía) y así podemos utilizar el tamaño byte
- CELDAS DC.B 1,1,2,7
- DC.B 0,0,0,1
- DC.B 1,2,3,0
- DC.B 3,1,1,0
- *Como la Task 95 solo presenta cadenas de texto, utilizaremos una tabla de conversión entre el valor
- *numérico y la cadena a presentar
- ELEM DC.B ' ',0,0 *doble cero para que ocupen 8 bytes
- DC.B ' 2 ',0,0
- DC.B ' 4 ',0,0
- DC.B ' 8 ',0,0
- DC.B ' 16 ',0,0
- DC.B ' 32 ',0,0
- DC.B ' 64 ',0,0
- DC.B ' 128 ',0,0
- DC.B ' 256 ',0,0
- DC.B ' 512 ',0,0
- DC.B ' 1024 ',0,0
- DC.B ' 2048 ',0,0
- END START ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement