Aventuras en Megadrive: Debug (II) Watches
En la entrada anterior vimos como realizar algunas labores básicas de debugging. No obstante si tenemos que vigilar muchas variables, sacar sus valores por la ventana de Mensajes, o por pantalla, es poco práctico.
Voy a explicar cómo utilizar las funciones de Debug del emulador Gens (versión v11a) para utilizar Watches (traducir como vigías, guardias, observadores).
COMO BUSCAR UNA VARIABLE EN MEMORIA
Voy a explicar cómo buscar una variable en memoria utilizando un ejemplo. La ROM que generamos en la primera entrada sobre Sprites.
Abrimos Gens y cargamos dicha ROM.
No confundir con GensKmod, emulador que hemos usado en otras entradas, GensKmod es una versión custom de Gens.
Deberíamos ver esto:
Vamos a buscar la dirección de memoria de la variable x. Como inicialmente vale 0, que es un valor muy común, mueve el sprite. Yo lo he movido hasta que x=4.
Antes de seguir, tenemos que tener claro qué tipo de variable queremos consultar.
En este caso las coordenadas (x,y) son Ints (enteros con signo de 16 bits). Una variable de 16 bits = 2 bytes. Y lo son porque así lo he definido en el programa:
//Posicion en pantalla del sprite int posx; int posy;
Ahora hacemos click en Tools + RAM Search. Nos aparece la ventana de búsqueda.
- En Specific Value escribe el valor a buscar. En mi caso 4.
- En Data Size elige 2 (tal y como hemos razonado antes).
- En Data Type / Display lo dejamos como está, signed (con signo).
Haz click en Search.
Nos aparecen todas las direcciones que contienen el valor 4.
Ahora vuelve a hacer click en la ventana del juego y mueve de nuevo el sprite. Verás que una de las direcciones cambia de valor, y coincide con lo que esperamos. En este caso x=38.
Ya la tenemos localizada. Selecciónala con el ratón y haz click en Watch. Ponle un nombre, por ejemplo coordenadaX.
Repetiremos este procedimiento tantas veces como sea necesario e iremos añadiendo watchers. Haz lo mismo con la coordenada Y.
Cuando termines, cierra la ventana RAM Search y automáticamente se nos abre la ventana Ram Watch. De nuevo, si movemos el sprite, veremos como los watchers nos muestran los valores en tiempo real.
CARGAR Y GUARDAR WATCHERS
Para guardar los observadores, en la ventana RAM Watch, click en File + Save As.
Cuando volvamos a cargar la rom, accede a la ventana RAM Watch y haz click en File+Open y busca el archivo para recuperar los watchers de otra sesión.
Por defecto, los observadores se guardan entre sesiones, si cambias de ROM borra antes los watchers anteriores.
WATCHERS CON VALORES EXTRAÑOS
Probablemente los valores Data Size y Data Type son erróneos. Trata de corregirlos.
VARIABLES QUE DESAPARECEN
Tenemos una serie de direcciones de memoria candidatas. Pero al variar algo (por ejemplo la posición de un sprite), una de ellas desaparece de la ventana RAM Search.
Desmarca Autosearch.
GENSKMOD
GensKmod tiene soporte para watchers, pero no tiene las ventanas de RAM Search / Ram Watch. Por suerte podemos guardar los watchers usando Gens, y después cargar el archivo con GensKmod.
De esta forma podemos seguir usando GensKmod si así lo preferimos, observadores incluidos.
GITHUB
El código de esta lección, y de todas las demás, lo podrás encontrar en mi github: