0x0F Ensamblador ZX Spectrum Marciano – Depuración

En este capítulo de Ensamblador ZX Spectrum Marciano vamos a aprender a depurar nuestros programas. No vamos a crear carpetas, ni a copiar archivos, tampoco vamos a generar código (un poco sí), en este capítulo vamos a profundizar en el uso de ZXesarUX.

Durante todo el tutorial, y anteriormente en el tutorial de PorompomPong, he venido utilizando ZEsarUX, un emulador desarrollado por César Hernández y que podéis obtener aquí; César está añadiendo nuevas funcionalidades constantemente.

También cabe señalar que, aunque hemos utilizado ZEsarUX como emulador de ZX Spectrum, es capaz de emular muchas máquinas y hacer muchas otras cosas.

El primer paso es personalizar ZEsarUX a nuestro gusto. Este emulador dispone de muchas opciones que puedes configurar, pero nos vamos a centrar en las que en principio me han parecido más interesantes de cara al uso que le damos en el tutorial; os animo a que investiguéis vosotros por vuestra cuenta.

Personalización

Para personalizar ZEsarUX, accedemos al menú pulsado F5 y luego hacemos clic en Settings.

Ensamblador ZX Spectrum Marciano 15x01
Ensamblador ZX Spectrum, personalización

Lo primero que vamos a hacer es configurar dos teclas de función, una para reiniciar la máquina y otra para entrar en depuración. Dentro de Settings accedemos a la opción Function Keys.

Ensamblador ZX Spectrum Marciano 15x02
Ensamblador ZX Spectrum, teclas de función

Vamos a configurar la tecla F11 para que abra la ventana de Debug, y la tecla F12 para reiniciar la máquina.

Una vez dentro de Function Keys, seleccionamos la Tecla F11, bien haciendo clic o pulsando Enter.

Ensamblador ZX Spectrum Marciano 15x03
Ensamblador ZX Spectrum, teclas de función

Una vez seleccionada la tecla, se nos muestran las opciones que podemos elegir; seleccionamos DebugCPU. Repetimos la operación para la tecla F12, pero en este caso seleccionamos Reset.

Ensamblador ZX Spectrum Marciano 15x04
Ensamblador ZX Spectrum, teclas de función

Ahora tenemos que probar las teclas, podemos salir del menú pulsando la tecla Esc hasta que se cierra completamente, o pulsamos F5 para ir al menú principal y luego Esc.

Una vez cerrado el menú, comprobamos si pulsando F12 se reinicia la máquina, y si al pulsar F11 se abre la ventana de Debug.

Ensamblador ZX Spectrum Marciano 15x05
Ensamblador ZX Spectrum, ventana de Debug

En mi caso, cuando depuro, suelo tener visible la ventana de Debug y la ventana en la que se muestra la memoria, por lo que se puede deducir que nos falta espacio.

Seguimos en Settings, seleccionamos ZX Desktop y seleccionamos la primera opción, Enabled. Una vez seleccionada se muestran más opciones de las cuales nos interesa la primera, width. Hacemos click sobre ella hasta que el valor sea 512 (u otro que más nos convenga); también podemos poner este valor directamente si seleccionamos custom Width.

Para que el menú se abra en el escritorio debéis seleccionar la opción Open Menu on ZX Desktop. Por otro lado, si queréis que el menú no se abra al hacer clic, a mi me resulta más cómodo, en Settings/General debéis deseleccionar la opción Clicking mouse open menu.

Ensamblador ZX Spectrum Marciano 15x06
Ensamblador ZX Spectrum, personalización

Ahora ya tenemos espacio para abrir otras ventanas y que no compartan espacio con la pantalla de nuestro querido ZX Spectrum.

Como comenté anteriormente, mientras depuro me gusta tener la ventana de depuración y la de memoria visibles. Vamos a modificar unas opciones para que podamos ver como se actualiza la memoria a medida que nuestro programa se vaya ejecutando, y para que la ejecución pare cuando el menú esté abierto.

Vamos a Settings/ZX Vision y casi al final hay que seleccionar las opciones Stop emulation on menu y Background Windows. Una vez activada la segunda opción, se muestra otra opción que también tenemos que activar, Even when menu closed.

Ensamblador ZX Spectrum Marciano 15x07
Ensamblador ZX Spectrum, personalización

Con esto ya tenemos personalizado, muy por encima, nuestro entorno. Ahora ya solo queda abrir las ventanas de depuración y el editor hexadecimal desde el menú Debug y colocarlas a nuestro gusto. Recordad que la ventana de depuración también la podemos abrir pulsado F11.

Ensamblador ZX Spectrum Marciano 15x08
Ensamblador ZX Spectrum, entorno de depuración

Dentro de Settings/General, en la última opción podemos cambiar el idioma, aunque en la actualidad no todos los términos están traducidos.

Por otro lado, para interactuar al 100% con las ventanas que vayamos abriendo, en el caso de que no responda abrid el menú (F5).

Depuración

Supongamos que tenemos un programa que cargamos en la dirección $8000; aseguraos de que no tenéis seleccionada la máquina de 16K o no funcionará.

org     $8000

Inicio:
ld      hl, $4000
ld      de, $8100
ld      a, $ff

Bucle:
ld      (hl), a
ld      (de), a
dec     a
jr      nz, Bucle

Fin:
jr      Inicio

end     $8000

En este programa apuntamos HL al inicio de la VideoRAM, DE a la posición $8100 y cargamos 255 ($FF) en A. Tras esto, hacemos un bucle en el que cargamos el valor de A en las posiciones a las que apuntan HL y DE. Una vez finalizado el bucle volvemos a la primera instrucción y seguimos en un bucle infinito.

El programa es muy sencillo, pero es suficiente para mostrar lo que os quiero enseñar.

Lo primero que vamos a hacer es entrar en Debug y poner un punto de interrupción en la dirección de memoria $8000, para que la ejecución se pare al inicio del programa.

Ensamblador ZX Spectrum Marciano 15x09
Ensamblador ZX Spectrum, depuración

El acceso a las distintas opciones se obtiene pulsando la tecla correspondiente a la letra que está resaltada.

En la parte central de la pantalla, a la izquierda, vemos el código desensamblado y la dirección de memoria dónde se ensambla cada instrucción. A la derecha vemos, principalmente, el valor de los distintos registros y el estado de los flags. Justo debajo vemos los valores de la pila.

En la parte superior e inferior vemos las distintas opciones; solo vamos a ver las mínimas necesarias para poder empezar a depurar nuestros programas.

En la parte superior derecha vemos 1-7: View. Pulsando del uno al siete se muestran las distintas vistas que tiene esta venta; por defecto se muestra la vista uno.

En la parte superior izquierda vemos Pointer. Pulsando la tecla T se abre una ventana emergente en la que podemos especificar la dirección de memoria en la que nos queremos situar. Si ponemos valores hexadecimales, hay que usar el sufijo H.

Ensamblador ZX Spectrum Marciano 15x0A
Ensamblador ZX Spectrum, depuración

Una vez que especificamos la dirección, pulsamos Enter y se nos muestra el desensamblado desde esta dirección.

Ensamblador ZX Spectrum Marciano 15x0B
Ensamblador ZX Spectrum, depuración

Debido a que no hemos cargado ningún programa, todo el desensamblado que vemos es NOP ($00).

Vamos a establecer un punto de interrupción en la dirección $8000. Si nos fijamos en la cuarta opción de la segunda línea de opciones, en la parte inferior de la ventana, vemos Togl; pulsando la tecla L establecemos o quitamos un punto de interrupción en la dirección de la línea seleccionada.

Ensamblador ZX Spectrum Marciano 15x0C
Ensamblador ZX Spectrum, depuración

Ya tenemos establecido un punto de interrupción en la dirección $8000. Al cargar nuestro programa, se parará en esta dirección de memoria y entraremos a depurar. Pulsamos la tecla N (Run) para continuar y volver al Basic.

ZEsarUX muestra una ventana en la que se nos avisa de que hay un punto de interrupción, solo tendremos que pulsar una tecla para entrar en la ventana de Debug.

Cargamos el programa y depuramos.

Ensamblador ZX Spectrum Marciano 15x0D
Ensamblador ZX Spectrum, depuración

Para seguir el programa, podemos ejecutar de dos formas distintas: en: Stp y Stovr. En otros entornos estos dos modos se conocen como Paso a paso por instrucciones y Paso a paso por procedimientos respectivamente.

En Paso a paso por instrucciones (tecla Enter) la ejecución se hace instrucción por instrucción y cuando nos encontramos ante un CALL a una rutina, ya sea nuestra o de la ROM, entramos en la misma y tenemos la posibilidad de ejecutarla paso a paso y ver el código de la misma.

En Paso a paso por procedimientos (tecla O) la ejecución se hace instrucción por instrucción, pero cuando nos encontramos ante un CALL a una rutina, ya sea nuestra o de la ROM, se ejecuta la misma y el PC (program counter) pasa a la instrucción siguiente al CALL; esto hay que tenerlo muy en cuenta en los bucles.

En nuestro programa, cuando PC está en la instrucción JR NZ, 8008 si pulsamos la tecla Enter y A no vale cero, se salta a la dirección $8008. Por el contrario, si se pulsa la tecla O se ejecuta todo el bucle (por así decirlo) y PC pasa a la siguiente instrucción, JR 8000. Haced pruebas y podréis ver como se comporta.

Nuestro programa, en cada iteración del bucle, carga el valor de A en las direcciones de memoria apuntadas por HL y DE. Hasta ahora solo podemos ver los distintos valores que se cargan en la dirección a la que apunta HL, ya que apunta a la primera dirección de la VideoRAM.

Para poder ver como va cambiando también el valor de la dirección $8100, abrimos el menú (F5), seleccionamos la ventana Hexadecimal Editor, pulsamos la tecla M (memptr), especificamos la dirección $8100 y pulsamos Enter.

Ensamblador ZX Spectrum Marciano 15x0E
Ensamblador ZX Spectrum, depuración

Si eliminamos el punto de interrupción y pulsamos la tecla N (Run) podremos ver como se actualizan tanto la posición de memoria $4000 como la $8100.

Con esto ya deberíais ser capaces de depurar vuestros programas, aunque ZEsarUX nos proporciona mucha más potencia, pero queda de vuestra cuenta descubrirla, aunque vamos a comentar una última opción: añadir o modificar código directamente en el depurador.

En la primera línea de opciones de la parte inferior, si pulsamos sobre la tecla S (stM) se nos muestran otras opciones. Si pulsamos sobre la tecla A (assemble) se nos permite modificar la instrucción situada en la dirección de memoria seleccionada. Para salir de la ventana Assemble pulsamos la tecla Esc.

Ensamblador ZX Spectrum Marciano 15x0F
Ensamblador ZX Spectrum, depuración

En nuestro caso, vamos a cambiar la dirección de la VideoRAM en la que estamos cargando el valor de A, lo vamos a poner en la columna diez. Si bien ZEsarUX no es sensible a mayúsculas y minúsculas, es muy importante que el sufijo de número hexadecimal sea la H mayúscula.

Ensamblador ZX Spectrum Marciano 15x10
Ensamblador ZX Spectrum, depuración

Tal y como podemos ver en la imagen, el valor de A se está pintando ahora en la columna diez.

Ensamblador ZX Spectrum, conclusión

En este capítulo hemos personalizado ZEsarUX y adquirido los conocimientos necesarios para depurar nuestro programas, aunque ZEsarUX es muy potente y nos queda mucho por descubrir.

Espero que este tutorial os haya servido para avanzar en vuestro aprendizaje de Ensamblador para ZX Spectrum.

El código que hemos generado, lo podéis descargar desde aquí.

Enlaces de interés

Ensamblador para ZX Spectrum Batalla espacial por Juan Antonio Rubio García.
Esta obra está bajo licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.

Aquí puedes ver más cosas que he desarrollado para .Net, y aquí las desarrolladas en ensamblador para Z80.

Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies
A %d blogueros les gusta esto: