Juegos de depuración para NES: cómo sucede hoy

imagen

Si alguna vez ha estado involucrado en la programación, está familiarizado con el concepto de errores. Si no nos molestaran, el proceso de desarrollo sería mucho más rápido y más agradable. Pero estos errores solo están esperando el momento de arruinar nuestro código, horario de trabajo y flujo creativo. Afortunadamente, hay muchas herramientas y estrategias para eliminar errores incluso en el código de los programadores de juegos retro.

Herramientas de depuración


Una de las mejores formas de depurar código es usar un depurador. Algunas versiones de los emuladores FCEUX y Mesen tienen un depurador incorporado que le permite interrumpir el programa en cualquier momento para verificar el estado del código.


Depurador del emulador FCEUX

Vale la pena señalar que este método es más adecuado para programadores avanzados que trabajan con lenguaje ensamblador. Pero somos nuevos, así que escribiremos en C (cc65). Por supuesto, el compilador jugará según sus propias reglas, y será difícil para nosotros lidiar con el código de máquina compilado a partir del código C.

Editor hexadecimal FCEUX

Digamos que necesitamos observar algún tipo de variable o matriz. Agregue la siguiente línea a las opciones del enlazador (ld65): -Ln labels.txt

Después de compilar el proyecto, el archivo labels.txt aparecerá en su carpeta. Simplemente ábralo en cualquier programa para ver textos y busque el nombre de la variable que queremos observar.

( Nota: si declaraste una variable estática, no se incluirá en esta lista. Por lo tanto, en lugar de static unsigned char playerX usa unsigned char playerX )


Ahora sabemos la dirección de la variable deseada, no está mal. Encontremoslo en el depurador. Ejecute los juegos ROM en el emulador FCEUX. En el menú Depurar, seleccione el elemento Editor hexadecimal y, en la ventana que se abre, presione Ctrl + G e ingrese la dirección de nuestra variable:


Presione OK, y el cursor se moverá a la dirección donde se encuentra la variable. Echemos un vistazo:


Esto puede ser útil para verificar si la matriz se llena correctamente o para rastrear cambios en variables específicas. Además, puede sentirse como un Gran Hermano, observando cuidadosamente su código.

Consulte otras herramientas útiles del menú de depuración del emulador FCEUX como PPU Viewer, Name table Viewer, etc.

Simplifica el proceso de depuración


¿Y si no queremos ejecutar un depurador cada vez para observar una variable? Una forma más avanzada es escribir un procedimiento que muestre el valor en la pantalla. Intentemos usar el puntaje en la interfaz para mostrar la posición del jugador en el eje Y:


¡Funciona perfecto!

El propietario del blog de codificador retro y nesdoug Doug Fraker ha creado un método similar para usar visualizaciones en pantalla con fines de depuración. El procedimiento que se muestra a continuación crea una línea gris en la pantalla que demuestra claramente el grado de carga de la CPU:

 // void gray_line(void); // For debugging. Insert at the end of the game loop, to see how much frame is left. // Will print a gray line on the screen. Distance to the bottom = how much is left. // No line, possibly means that you are in v-blank. _gray_line: lda <PPU_MASK_VAR and #$1f ;no color emphasis bits ora #1 ;yes gray bit sta PPU_MASK ldx #20 ;wait @loop2: dex bne @loop2 lda <PPU_MASK_VAR ;normal sta PPU_MASK rts 

Simplemente puede copiar este procedimiento en su código o incluir la biblioteca nesdoug.h en el proyecto. El procedimiento debe llamarse después de completar el ciclo del juego, luego se mostrará una barra gris en la pantalla.


Funcionó, ¡pero parece que tengo un error más! Nos libraremos de él más tarde. Mientras tanto, sigamos adelante.

El poder de las macros


Las macros también pueden ser una herramienta de depuración útil. Le permitirán encontrar un lugar en el código que se ha convertido en la fuente del error.

Creemos algún tipo de macro que nos dé señales en el momento adecuado, por ejemplo, reproducir un sonido o seleccionar una paleta cero con el valor necesario. Tenemos varias macros que cambian la paleta cero a colores rojos, azules y aleatorios, además de reproducir sonido:


Como funciona Supongamos que compiló con éxito un proyecto, inicia el emulador con su juego, hace clic en el botón Inicio y ...


Parece que no hay nada más que una pantalla blanca. Además, algunos emuladores pueden informar "Atasco de CPU" en la barra de estado. ¿Qué hacer a continuación?

Primero, necesita localizar el código en el que se produce el error. Y aquí entra en juego mi macro de sonido.

Sabemos con certeza que el menú principal está funcionando. Veamos qué pasa después:

 playMainMenu(); player.lives = 9; points = 0; gameFlags = 0; while(current_level<7 && player.lives>0) { set_world(current_world); debugSound; playCurrentLevel(); } 

set_world que el juego se bloquea cuando se set_world procedimiento set_world . Veamos esta corazonada. Simplemente ingreso el nombre de la macro en la siguiente línea después del procedimiento que se verifica.

Comenzamos el proyecto y ... ¡escucho un sonido! Es decir, este procedimiento fue exitoso y debemos verificar lo siguiente: playCurrentLevel . Muevamos la macro de depuración a continuación:

 while(current_level<7 && player.lives>0) { set_world(); playCurrentLevel(): debugSound; } 

Comienzo el proyecto nuevamente, pero no puedo escuchar un sonido. Esto significa que el procedimiento no se completa y se produce un error en su interior.

En tales casos, debe abrir el código de procedimiento y continuar aplicando esta técnica hasta que pueda restringir su búsqueda de una posible ubicación de error.

Una macro de cambio de paleta también puede ser útil para verificar condiciones. Por ejemplo, nuestro código realiza una prueba compleja de varias condiciones:

 if ( (getTile(objX, objY+16) || collide16() ) || (objsOX[i] && objY>objsOX[i])) { debugRed; objsSTATE[i]=THWOMP_SMASH; objY=objsY[i]-=4; objsFRM[i]=0; sfx_play(SFX_THWOMP_SLAM_DOWN,2); } 

Si cambiamos el color de la paleta aquí, veremos si se cumple la condición:


Este pollo parece estar bien. Pero si la bandera no funciona, entonces una de las condiciones no se cumple. En este caso, debe verificarlos todos por separado y luego, tal vez, encontrará otro error.

Opción nuclear


Recientemente descubrí que uno de los fantasmas en mi juego exhibe algún tipo de comportamiento sospechoso. De vez en cuando, se negó a atacar al jugador.

Echa un vistazo a este fantasma golpeado por un error: solo ataca cuando el personaje está cerca del centro de la pantalla:


No importa cuánto estudié el código de este procedimiento, no pude averiguar dónde estaba escondido el error, así que decidí tomar medidas extremas y probar el trabajo de este código en un entorno de desarrollo moderno.

Tomé todo lo que necesitaba: un mapa de pantalla, una matriz con atributos de metaarchivo, un código de procedimiento, y simplemente los inserté en Visual Studio 2017:


En PC, el código funcionó exactamente igual. Al final resultó que, el error se estaba ocultando en un procedimiento que llenó el caché para encontrar obstáculos entre el jugador y el enemigo. La matriz se llenó incorrectamente. Estoy seguro de que debería haber 0 en lugar de 0x80.


Por lo tanto, intentaré depurar el código paso a paso para averiguar por qué sucede esto.


Es divertido, pero parece que estaba haciendo las acciones en la secuencia incorrecta. ¡Arreglemos y revisemos la matriz nuevamente!


Parece que ahora la matriz se está rellenando correctamente. Es decir, solo necesito arreglar el código cc65 y compilar el proyecto NES nuevamente.


Por lo tanto, las herramientas de desarrollo modernas pueden ayudar a depurar algoritmos y corregir errores.

Deshágase de los insectos con calma.


Los errores son molestos, al igual que los códigos molestos. Simplemente mantén la calma, no pierdas el control y usa toda la gama de herramientas disponibles para buscar y destruir estas plagas. La calidad de su código y su tranquilidad aumentará significativamente.

¿Quieres recibir consejos directamente de los profesionales del diseño retro? ¡Bienvenido a nuestra discordia!

¡Nuestro juego The Meating está disponible aquí !

Source: https://habr.com/ru/post/466653/


All Articles