Se llama DEBUG y solo funciona en emuladores que permitan sobreescribir la ROM y con el Pack de 48K de memoria extra añadido (51K en total).
La palabra DEBUG toma el nombre de una palabra del búfer de entrada y la depura paso a paso.
Ejemplo:
DEBUG TEST depurará la palabra TEST.
A cada paso se muestra la pantalla del Debugger con la siguiente información:
Ejemplo:
A la izquierda muestra verticalmente (abajo la más reciente) las palabras que se van ejecutando. La que se muestra primero empezando por abajo es la que "se va a ejecutar" (aún no se ha ejecutado).
Arriba a la derecha se muestra el estado de la pila actual (Stack) y más a la derecha la pila anterior (S-Old). Máximo siete números cada una.
Al medio hacia el centro se muestran de cero hasta siete variables con sus contenidos (solo las 6 primeras letras del nombre como máx.). En la pantalla de ejemplo se muestran las variables MOKA y MIVARLARGA.
Más a la derecha se muestran las siete últimas posiciones de la pila de Retornos.
Todos los números mostrados por DEBUG son enteros con signo.
Debajo está el menú con las diferentes acciones posibles:
NOTA: Todas las acciones (excepto "Abort") se refieren a la "depuración", no afectan a la ejecución de la palabra, que sigue su curso. Ejemplo: Si hago "Over" la palabra afectada NO se depura, pero se ejecuta normalmente.
- Step: Si la palabra en curso es depurable, la depura
- Over: No depura la palabra en curso
- Back: Deja de depurar la palabra en depuración y volvemos a la palabra madre. Se podría haber llamado "Out". Deshace el "Step" en curso y queda como si en vez de "Step" en su momento hubiéramos pulsado "Over".
- Abort: Aborta DEBUG y la ejecución de la palabra que se depura. Borra la pila.
- Loop: Ejecuta un bucle de cualquier tipo por completo en vez de paso a paso. Se reanuda la depuración con la siguiente palabra.
- Veiw: Si se mantiene pulsada, muestra la pantalla original con su contenido actualizado hasta donde se ha ejecutado la palabra en depuración.
- BK: Activa/Desactiva los BreakPoints. Por defecto están desactivados. Cuando están activados se muestra un asterisco al lado.
- Exit: Continúa la ejecución sin depurar nada hasta que llega al final de todo. Si se encuentra un BreakPoint y estos están activados, se detiene en el mismo.
"Loop" solo se activa con palabras que tiene un OF=2 (Operand Field) (*).
Lo que hace es "marcar" como punto de reinicio de la depuración la palabra que la sigue y ejecuta "Exit" automáticamente. Cuando se alcance la palabra "marcada" se reanudará la depuración. Esto implica que si, por el motivo que sea, la palabra "marcada" no se ejecuta, pues la ejecución llegará hasta el final sin depurarse nada más. La única excepción a esto es si se encuentra con un BreakPoint y están activados los mismos. Entonces la depuración continúa desde el BreakPoint.
Por tanto, OJO con "Loop". Si se sale del bucle si pasar por el final, no se reanudará la depuración (por ejemplo si salimos del bucle con EXIT (la palabra del Ace Forth, no el "Exit" del depurador)).
Los BreakPoints se han de poner a mano en las palabras. Es la palabra BREAKP. Para ello se EDITA la palabra y se le añaden los BreakPoints. Luego la redefinimos. La palabra BREAKP solo funciona si la ROM es sobreescribible.
Debido a cómo se han implementado los BreakPoints en DEBUG es imprescindible haber ejecutado DEBUG (vale incluso ejecutarlo sin ningún nombre) o haber implementado un BREAKP (ambos casos con la ROM sobrescribible) al menos UNA VEZ antes de redefinir cualquier palabra con BREAKP o de cargar un diccionario con tales palabras encima de otro ya cargado. De lo contario puede producirse un cuelgue del Jupiter Ace. (**)
En cuanto a lo de mostrar contenidos de Variables seleccionadas: La selección consiste en incluir sus nombres en la definición de la palabra VARSLIST.
La palabra VARSLIST ya vienen con el paquete, por lo que hay que EDITARLA y luego redefinirla.
NO tocar la primera palabra de VARSLIST que es MUX. Siempre ha de estar y ser la primera. DEBUG mostrará las variables que se pongan a continuación de MUX, hasta que o bien se llegue a siete (no se muestran más de siete) o bien se encuentra una que no es una variable (ya no busca más).
En la pantalla del ejemplo VARSLIST es -> : VARSLIST MUX MOKA MIVARLARGA ;
Si no se quiere mostrar ninguna variable -> : VARSLIST MUX ;
(Úlitma Versión 8-5-2023). Actualizada la palabra 2DROP.
NOTA Importante 1: DEBUG actualmente carga su rutina maestra en c.m. en la zona de memoria desde $E000-$EF6F y NO se reserva la memoria. Se puede usar el "Cargador de Búferes" pues empieza en $F120. También es compatible con el desensamblador del Z80 "DISS" que ocupa $CC00-$D775
Al NO reservarse la memoria, un crecimiento grande de la pila de Retornos o de la pila de datos o del diccionario pueden corromperlo.
NOTA Importante 2: Si durante la ejecución de DEBUG se produce un ERROR o se fuerza con un Break (Shift+Space) entonces NO se ha restaurado la ROM. Es urgente ejecutar DEBUG (sin ningún nombre es suficiente) so riesgo de que se cuelgue el sistema.
(*) En general todas la palabras que hacen bucles tienen OF=2 (por el tamaño del salto -> 2 bytes), pero hay otras palabra también con OF=2 que no son bucles. Un ejemplo es IF que tienen OF=2 y salta hacia adelante. Así, si pulsamos LOOP cuando estamos en un IF la palabra "marcada" solo se ejecutará si el flag es verdadero. Puede ser útil usarlo en casos así.
Por otro lado, si creamos una palabra de usuario que es un bucle y su OF es mayor de 2, pues el comando "Loop" no funcionará con ella...
(**) Esto es así porque hay dos palabras BREAKP. La "auxiliar" que es la que se ejecuta cuando introducimos BreakPoints y otra, la "definitiva" que es la que realmente se compila en la palabra cuando escribimos BREAKP. Esta última reside en ROM y ha de ser creada. Solo DEBUG o BREAKP "auxiliar" la crean (y solo si la ROM es sobreescribible obviamente).
Si cargamos con LOAD un diccionario con palabras que tienen BREAKP en su definición y aún NO se ha creado la palabra BREAKP "definitiva" en ROM (vamos, NO existe aún) un REDEFINE de dicha palabra (que es automático si ya había un diccionario en memoria antes del LOAD) es un cuelgue casi seguro. Y si no hay un cuelgue, tarde o temprano lo habrá.