Home
Home
Principio Anterior Contenido Próximo Término
Principio - Anterior - Contenido - Próximo - Término
English Deutsch Italiano
English - Deutsch - Italiano

6. Monitor/Depurador

Power64 incluye un Monitor/Depurador que funciona en el entorno Macintosh del emulador. De este modo se puede examinar y modificar el contenido del entorno del C64 sin usar la RAM del C64. El monitor es indetectable para los programas de C64.

Para arrancar el monitor/depurador elija el elemento Archivo/Monitor/Depurador (Cmd-G). Aparecerá una ventana de texto donde puede introducir órdenes (vea abajo la lista de órdenes permitidas) y ver los resultados.
Por defecto las órdenes del monitor/depurador actuarán sobre el C64, pero puede utilizar la orden 'z' (vea debajo) para examinar una de las unidades de disco.

Para dar una orden escríbala en una línea y pulse <Return>. Observe que puede reutilizar una orden anterior colocando el cursor sobre la misma y pulsando <Return> o utilizando Cortar y Pegar. También existe una historia de órdenes, a la cual se puede acceder utilizando Ctrl-Arriba/Abajo.

Para cambiar el contenido de la RAM es conveniente ver primero el contenido viejo con una orden (generalmente 'm') y luego editar los resultados. Puede cambiarse la memoria pulsando <Return> cuando el cursor está sobre la línea afectada.

El resultado de cualquier orden puede manejarse con la barra espaciadora y la tecla return. Mientras que al pulsar la barra se produce un solo línea de salida, al pulsar return la salida no se detiene hasta presionar otra tecla. La tecla escape interrumpe cualquier orden.
Las órdenes 'm', 'k', 'n', 'b' e 'y' también pueden manejarse con las teclas de cursor. Cursor abajo produce (igual que la barra espaciadora) la siguiente línea de resultado. Cursor arriba da el renglón anterior y cursor a la derecha/izquierda generan la línea actual +/-1 byte.

La mayoría de las órdenes espera uno o dos parámetros numéricos que se pueden dar como expresiones del lenguaje C. Los valores pueden darse en hexadecimal (sin prefijo o con prefijo '$' o '0x'), decimal (prefijo '#') o binario (prefijo '%') o utilizando los registros de la CPU ('rA', 'rX', 'rY', 'PC', 'SP' (incluyendo el desplazamiento $0100)) o el contenido de la RAM ('RAM[xxxx]' o 'RAMb[xxxx]' para acceso de 8 bits o 'RAMw[xxxx]' para 16 bits). MEM[xxxx] funciona como RAM[xxxx] pero tiene en cuenta la configuración de memoria actual. De este modo MEM[xxxx] accederá o bien a la RAM, o bien a la ROM o bien a los circuitos de E/S. En lugar de MEM[xxxx] también se puede usar PEEK(yyyy), donde, al igual que en BASIC, la dirección yyyy está en notación decimal. A los nombres de los registros ('rA', 'rX', 'rY') y referencias a la RAM puede agregarse 's' o 'u' (p. ej. 'rAs','rXu', RAMsb[xxxx]) para indicar un valor con o sin signo (por defecto: sin signo).
Estos valores pueden combinarse con los operadores '+', '-', '*', '/', '<<', '>>', '&', '^', '|', '~', '-'. Todas las operaciones se realizan con enteros de 32 bits con signo. Observe que (a diferencia de C) los operadores de desplazamiento ('<<' y '>>') tienen mayor precedencia que '+', '-', '*' y '/' (creo que la semántica de C es desafortunada en este aspecto). Por supuesto puede utilizar paréntesis para forzar el orden de evaluación deseado.

El monitor reconoce las siguientes órdenes (los parámetros en paréntesis son opcionales):

a DirInicial - Ensamblar
Ensamblar código comenzando a partir de DirInicial. Todas las constantes y direcciones del código deben darse en hexadecimal. Se pueden utilizar los códigos de operación ilegales comunes. Con una línea vacía se finaliza el ensamblado.
b DirInicial (DirFinal) - Volcado binario de memoria
Muestra el contenido de la memoria desde DirInicial hasta DirFinal en notación binaria. Los bits activados se indican con '*', los apagados con '.'. Ésto es cómodo para ver el mapa de bits de un conjunto de caracteres. Cambie el contenido de la memoria sobreescribiendo los datos y pulsando <Return>.
c DirInicial DirFinal DirComparar - Comparar memoria
Compara el contenido de la memoria desde DirInicial hasta DirFinal con la zona de memoria que comienza en DirComparar. Se indican los intervalos iguales y diferentes. Observe que los intervalos iguales de menos de 3 bytes rodeados por intervalos diferentes se consideran interferencias, y se eliminan para evitar confusiones.
d DirInicial (DirFinal) - Desensamblar
Desensambla el contenido de la memoria desde DirInicial hasta DirFinal. Se permite realizar cambios a un programa escribiendo sobre el resultado y pulsando <Return>.
f DirInicial DirFinalBytes- Buscar
Busca una secuencia de bytes en un intervalo de la memoria. Los bytes deben darse en notación hexadecimal. Puede emplearse '?' como comodín para un dígito hexadecimal. Además se pueden buscar cadenas de caracteres. Cuando se buscan cadenas no hay distinción entre mayúsculas y minúsculas, código ASCII y de pantalla o texto normal e invertido.
Ejemplo: f a000 a080 43 42 ?d
f e000 f000 "Commodore"
fa DirInicial DirFinal DirBuscar - Buscar dirección
Busca en el programa todas las referencias a la dirección absoluta DirBuscar en el intervalo de DirInicial a DirFinal. De nuevo puede utilizarse '?' como comodín para un dígito hexadecimal.
Ejemplo: fa e000 ffff d0?? - busca todos los accessos al VIC en la Kernal ROM.
fp DirInicial DirFinal Valor - Buscar Poke
Busca todas las direcciones en un rango de memoria que contengan un valor específico. Utilizar + en lugar de DirInicial DirFinal hace que fp busque sólo en los resultados de la búsqueda anterior.
Ejemplo: Supongamos que quiere saber dónde almacena Serpentine el número de vidas. Después de comenzar la partida tiene 5 vidas. Por tanto fp 0800 2a00 5 buscará todas las direcciones de memoria que contengan el valor 5. Hay muchas (demasiadas para ordenarlas a mano). Juegue hasta perder una vida (ahora le quedan 4) y utilice fp + 4 para encontrar todas aquellas direcciones de memoria que ahora tienen el valor 4 y antes tenían 5. No hay ninguna - Mala suerte ;(. Segundo intento: si empezamos con 5 vidas y una está siendo utilizada nos quedan 4 vidas. Así que reiniciamos el juego y usamos fp 0800 2a00 4 para encontrar todas las direcciones de memoria que contienen el valor 4. Después de perder una vida usamos fp + 3 para buscar de nuevo. Observe: ¡sólo hay una correspondencia ($0924)! Alguna vez puede haber varias correspondencias pero normalmente hay pocas y pueden tratarse a mano. Ahora sabemos dónde almacena Serpentine el número de vidas restantes. Podemos utilizar m 0924 para ver y modificar ese valor, o utilizar fa 0800 2a00 0924 para buscar todas las direcciones de memoria desde donde Serpentine accede o modifica ese valor (y entonces aplicar allí los parches adecuados).
Observe que fp es una orden avanzada para usuarios avanzados. Un juego puede almacenar un valor de muchas formas. Arriba se ha mostrado el problema 'Off-by-One'. También es posible que un juego no cuente el número de vidas que quedan sino el número de vidas ya utilizadas (o en uso). Otros valores como las puntuaciones se almacenan a veces con un factor de escala (p.e. si todas las puntuaciones son múltiplos de 100, no tiene sentido almacenar los dos ceros, así que un juego podría o no dividir la puntuación por 100 antes de almacenarla). La orden fp busca el valor dado en binario (little- y big-endian), BCD (little- y big-endian), ASCII y Float. Paciencia, el prueba y error es la clave para acertar al utilizar la orden fp.
g (Dir) - Ir a
Continuar la ejecución del programa en la dirección Dir (por defecto: el contador de programa actual). Esto no elimina la ventana del monitor.
h - Ayuda
Muestra un resumen de las órdenes del monitor.
l (DirCargar) - Cargar datos
Carga datos desde el disco duro del Mac (archivos *.C64, *.CBM, *.PRG o *.P00) a la RAM del C64. Normalmente cargará los datos en la dirección indicada en el archivo, pero ésta puede modificarse dando una nueva dirección en DirCargar. El archivo se selecciona utilizando la ventana de selección de archivos del Mac.
lr DirCargar- Cargar datos en bruto
Carga datos desde el disco duro del Mac a la RAM del C64. Esto carga en la RAM el contenido íntegro (¡!) del archivo, incluído el encabezamiento de un archivo *.P00 y los dos bytes de la dirección de carga. Por tanto es necesario especificar a lr una nueva dirección de carga como parámetro. El archivo se selecciona utilizando la ventana de selección de archivos del Mac.
k DirInicial (DirFinal)- Volcado de memoria en PETASCII
Muestra el contenido de la memoria desde DirInicial hasta DirFinal como caracteres PETASCII. Puede modificar el contenido de la memoria escribiendo sobre los datos y pulsando <Return>.
m DirInicial (DirFinal)- Volcado de memoria en Hexa/PETASCII
Muestra el contenido de la memoria desde DirInicial hasta DirFinal como cifras hexadecimales y caracteres PETASCII. Puede modificar el contenido de la memoria escribiendo sobre las cifras hexadecimales y pulsando <Return>.
n DirInicial (DirFinal)- Volcado de códigos de pantalla
Muestra el contenido de la memoria desde DirInicial hasta DirFinal como códigos de pantalla de C64. Puede modificar el contenido de la memoria escribiendo sobre el resultado y pulsando <Return>.
o DirInicial DirFinalDato- Rellenar (Ocupar) la memoria
Rellena el intervalo de memoria desde DirInicial hasta DirFinal con el valor Dato.
p ("NombreArchivo") - Reiniciar archivo de registro
Cierra el archivo de registro actual y abre uno nuevo con el nombre dado (por defecto: "C64 Monitor - dd.mm.yyyy" en la carpeta de archivos de impresión). El resultado de cualquier orden se puede enviar al archivo de registro poniendo la orden en mayúsculas.
r - Mostrar registros de la CPU
Muestra el contenido de los registros del procesador. Se pueden realizar cambios escribiendo sobre el resultado y pulsando <Return>.
s DirInicial DirFinal - Guardar información
Guarda el intervalo de la memoria desde DirInicial hasta DirFinal en el disco duro del Mac. El archivo se selecciona utilizando la ventana de selección de archivos del Mac. Según la extensión del archivo se guardará en formato *.C64 o *.P00. Si desea guardar el mismo intervalo que se cargó anteriormente, no es necesario especificar DirInicial y DirFinal.
sr DirInicial DirFinal - Guardar información en bruto
Guarda el intervalo de la memoria desde DirInicial hasta DirFinal en el disco duro del Mac. Se guarda sólo la información de la memoria, sin dirección de carga ni otra información de encabezamiento. El archivo se selecciona utilizando la ventana de selección de archivos del Mac.
t (Dir)- Rastrear programa
El programa de C64 en la dirección Dir (por defecto: el contador de programa actual) se ejecuta una instrucción cada vez. Después de cada orden se muestra el estado de la CPU y Power64 espera a que se pulse una tecla. Pulse la barra espaciadora para ejectuar otra instrucción del C64. Pulse return para rastrear rápidamente: se muestra toda la información, pero Power64 no espera la pulsación de una tecla. Presione 'J' para ejecutar rápidamente el resto de la subrutina actual. Pulse 'S' para ejecutar la línea actual (un orden simple o una llamada de subrutina completa). Presione 'G' para abandonar el modo de rastreo y volver a la ventana del C64, ejecutando el código a velocidad normal.
tb (Dir (Cnt)) (!)- Poner/Borrar/Mostrar puntos de parada
Sin parámetros tb da una lista de todas los puntos de parada instalados. Cuando se da sólo una dirección en Dir,tb establece un punto de parada en la dirección dada. Cada vez que el C64 llega a esta dirección, la ejecución del programa pasará a modo de rastreo. Si además de Dir,tb recibe también un número en Cnt, sólo entrará en modo de rastreo cuando se haya alcanzado Dir por Cnt-ésima vez. En ese momento se borrará el punto de parada automáticamente. Para borrar manualmente un punto de parada utilice tb Dir!. Escriba tb ! para eliminar todos los puntos de parada.
Las palabras claves IRQ, NMI y RESET se pueden utilizar en lugar de Dir para crear un punto de parada siempre que ocurre una excepción.
Nota: Los puntos de parada pueden fallar si el C64 usa código que se modifica a sí mismo.
tl (LineaTrazado (Dir)) - Rastrear hasta la línea de trazado
Ejecuta el programa de C64 de la dirección Dir (por defecto: el contador de programa actual) hasta que el VIC alcance una línea de trazado dada (por defecto: la misma que el último mandato tl). Luego cambia al modo de rastreo y ejecuta las instrucciones una por una. Esto es muy útil para depurar código con interrupciones del trazador.
tq (Cnt (Dir))- Rastrear rápido
Ejecuta rápidamente Cnt instrucciones del programa C64 de la dirección Dir (por defecto: el contador de programa actual). Luego pasa al modo de rastreo. Esto ayuda a terminar bucles extensos sin ver cada iteración.
v vic - Mostrar el estado del controlador de interfaz de vídeo
Muestra el estado del VIC en forma de fácil interpretación.
v sid - Mostrar el estado del dispositivo de interfaz de sonido
Muestra el estado del SID en forma de fácil interpretación.
v cia1 | cia2 - Muestar el estado del CIA 1 o CIA2
Muestra el estado del CIA1 o CIA2 en forma fácilmente legible (incluyendo información interna de los registros duplicados).
v ram - Mostrar la configuración de memoria
Muestra la configuración de memoria en forma de fácil interpretación.
w DirInicial DirFinal DirDestino- Escribir (Copiar) Memoria
Copia el contenido del intervalo de memoria de DirInicial a DirFinal en el intervalo de memoria que comienza a partir de DirDestino. Esto funciona correctamente aunque los intervalos de origen y destino se solapen (o son idénticos al copiar las ROMs en la RAM).
x- Salir/Abandonar el Monitor
Cierra la ventana del monitor.
y DirInicial (DirFinal)- Volcado de sprites
Muestra el contenido de la memoria desde DirInicial hasta DirFinal en notación binaria con 3 bytes en cada línea. Los bits activados se representan con '*' y los apagados con '.'. Así es fácil examinar los mapas de bits de los sprites. Puede cambiar el contenido de la memoria escribiendo sobre los datos y pulsando <Return>.
z NumDispositivo- Escojer el dispositivo a depurar
Selecciona el dispositivo que será examinado por el monitor. Seleccionando 8-11 se elige la unidad de disco correspondiente. Los otros números corresponden al Commodore64.
$ ExprHex- Evaluar una expresión hexadecimal
# ExprDecimal- Evaluar una expresión decimal
% ExprBinary- Evaluar una expresión binaria
? Expression- Calcular expresión
Evalúa una expresión e imprime su valor en hexadecimal y decimal.
POKE DirDecimal, ExprDecimal - Modificar memoria
Modifica el valor de una posición de memoria. Observe que a diferencia de otras órdenes del emulador, la dirección y el valor se dan en decimal, como en el BASIC. Esto facilita la introducción de POKES de trampas para un juego que se está ejecutando.
SYS DirDecimal - Comenzar programa
Como g (Dir) pero la dirección se da en decimal como en BASIC.

El resultado de todos estas órdenes se puede envíar a un archivo de registro (además de a la pantalla), poniendo el nombre de la órden en mayúsculas. Este archivo se guarda en la carpeta de archivos de impresión (vea 5.15 Impresora para obtener más información sobre esta carpeta) y por defecto se llama "C64 Monitor - dd.mm.yyyy". Vea más arriba la orden 'p' para ver como se cambia este nombre.

Home Principio Anterior Contenido Próximo Término Top of Page

Fuente: http://www.infinite-loop.at/Power64/Documentation/Power64-Leame/06-Monitor.html
Power64 Homepage: http://www.infinite-loop.at y http://www.salto.at - EMail:
© Roland Lieger, Goethegasse 39, A-2340 Mödling, Austria - Europe
Últiomo Modificación: 29 de Febrero de 2008
Valid HTML 4.01!