El siguiente paso sería ampliar el programa principal "RYG.asm" para generar y pintar las jugadas del ratón. Pero, antes de eso, o más bien al intentar hacerlo, surge la necesidad de desarrollar nuevas rutinas en "Tableros.asm".
Rutina "dameRaton":
La rutina "generaJugadaRaton" no mueve el ratón allí donde esté. Necesitan que le digan dónde está el ratón y, a partir de esta información, genera la nueva posición de salida.
Por tanto, necesitamos una rutina que localice el ratón dentro de un tablero. Esa rutina es la rutina "dameRaton" del fichero "Tableros.asm". Su código es así:
La rutina funciona así:
- Recibe un tablero como entrada.
- Guardar el registro Y para recuperarlo al final.
- Prepara el registro Y para que apunte al offset 21, que es el comienzo de la matriz, es decir, la posición (0, 0).
- Prepara el puntero $fb – $fc para que apunte al comienzo del tablero.
- Con el modo de direccionamiento indirecto – indexado, lee el contenido de la posición apuntada por Y. Mira si es un ratón ($01).
- Si el contenido es un ratón, mueve Y a la salida (offset del ratón) y recupera el valor original de Y.
- Si el contenido no es un ratón, incrementa Y y vuelve a intentarlo.
- Todo esto hasta el offset 85, que es el final de la matriz. Si llegamos hasta aquí es que no hemos encontrado el ratón y tiene que haber un error. Se señalizaría con el offset $ff, que no es válido.
En definitiva, esta rutina localiza el ratón en el tablero, pero nos devuelve su posición en formato offset, es decir, como desplazamiento o número de bytes desde el comienzo del tablero. Esto tiene la ventaja de que es fácil de obtener, pero es poco práctico de manejar.
Es más práctico de manejar el formato (fila, columna), que de hecho es el formato que acepta "generaJugadaRaton". Por tanto, necesitamos una rutina de conversión. Esa rutina es "dameFilaCol" y se describe más adelante.
Rutina "dameGato":
Esta rutina hace lo mismo que "dameRaton" pero para un gato. La principal diferencia es que gatos hay cuatro, mientras que sólo hay un ratón. Por tanto, hay que indicarle qué gato estamos buscando (0 … 3).
La implementación es también muy parecida. La principal diferencia es que, cuando encontramos un gato ($ff), tenemos que mirar si es el que buscamos o no. Si es el gato que buscamos devolvemos su offset; si no lo es, seguimos buscando hasta dar con él.
Rutina "dameFilaCol":
La rutina "dameFilaCol" convierte un offset en (fila, columna). Es complementaria a la rutina "dameOffset", que hace justo lo contrario.
La rutina "dameOffset" se basaba en una tabla de datos. En función de la fila, obteníamos un offset de base (21, 29, 37, …) y luego le sumábamos la columna.
Para hacer una implementación similar de "dameFilaCol" necesitaríamos una tabla con tantas entradas como offsets posibles (21 – 84). En realidad, dos tablas, una para las filas y otra para las columnas. Se puede hacer, pero no es una solución muy elegante y consume bastante memoria (dos tablas de 64 posiciones cada una).
Por ello, se adopta otra solución. Supongamos que tenemos el offset 73:
Lo vamos comparando por orden contra el comienzo de cada fila, empezando por la última fila (fila 7) y terminando por la primera (fila 0). En realidad, empezamos comparando contra una fila inexistente, la fila 8, para detectar si el offset es mayor que el permitido:
- Fila 8 (inexistente): ¿es el offset mayor o igual que 85? En el caso de 73, no. Pero en caso de serlo, la rutina devolvería fila = $ff y columna = $ff, es decir, una señal de error.
- Fila 7 (última): ¿es el offset mayor o igual que 77? En el caso de 73, no.
- Fila 6: ¿es el offset mayor o igual que 69? En el caso de 73, sí. Por tanto, devuelve fila 6 y columna 73 – 69 = 4. Es decir, devuelve (6, 4).
- …
El proceso anterior hubiera continuado, caso de ser necesario, hasta la fila 0. De hecho, si el offset fuera menor a 21 (comienzo de la fila 0), también se devolvería una señal de error ($ff, $ff).
El código de la rutina es largo, pero muy repetitivo. Se muestra a continuación un extracto suficiente para entender su funcionamiento:
Con estas rutinas de apoyo ("dameRaton", "dameGato" y "dameFilaCol") ya es posible mejorar el programa principal y generar las jugadas del ratón. Esto lo haremos en la siguiente entrada.
Código del proyecto: RYG02
No hay comentarios:
Publicar un comentario