cursos:ensamblador:anexo1

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:ensamblador:anexo1 [21-01-2024 16:51] – [Tabla de notas para rutina BEEPER] sromerocursos:ensamblador:anexo1 [24-01-2024 12:36] (actual) sromero
Línea 1: Línea 1:
 ====== Anexo (I) ====== ====== Anexo (I) ======
 +
  
  
 \\  \\ 
-===== Tabla de notas para rutina BEEPER =====+===== El debugger del emulador FUSE =====
  
 +Los usuarios de Linux, aunque podemos utilizar emuladores como **rvm** (Retro Virtual Machine) o ejecutar el utilísimo **spin** con ayuda del "emulador" de Windows //wine//, tradicionalmente hemos usado el emulador **fuse** ("Free Unix Spectrum Emulator") por su facilidad de instalación y uso y las muchas opciones que tiene, incluyendo //Memory Browser// y //Debugger// o //Depurador//.
 +
 +En el caso del depurador de Fuse, tanto en su versión GTK como en su versión en SDL puro se utiliza mediante **comandos de texto** (al contrario que emuladores como Spin que tienen un completo debugger muy amigable con el usuario).
 +
 +\\ 
 +{{ :cursos:ensamblador:fuse_debugger_01.png?900 }}
 +;#;
 +//FUSE en su versión GTK//
 +;#;
 +\\ 
 +
 +\\ 
 +{{ :cursos:ensamblador:fuse_debugger_02.png?640 }}
 +;#;
 +//FUSE en su versión SDL//
 +;#;
 +\\ 
 +
 +Como se puede ver en las capturas (vamos a centrarnos en la versión GTK), en la parte superior tenemos:
 +
 +\\ 
 +  * El estado de los registros y los bancos de memoria.
 +  * El contenido y un desensamblado de la memoria apuntada por PC (izquierda)
 +  * El contenido y un desensamblado de la memoria apuntada por SP (derecha), es decir, el contenido de la pila.
 +\\ 
 +
 +En la parte inferior podemos ver una serie de botones y una caja de texto para introducción de comandos con su botón de "Evaluate" para ejecutarlos:
 +
 +  * **Single Step**: Ejecuta un único opcode del Z80 y detiene de nuevo la emulación.
 +
 +  * **Continue**: Continua la emulación de forma continuada, pero dejando la ventana del depurador abierta (la cual no se actualiza mientras el emulador se ejecuta).
 +
 +  * **Break**: Detiene la emulación y vuelve al depurador.
 +
 +  * Haciendo **doble click** en cualquier ubicación del Stack hará que la emulación continúe hasta que PC alcance el valor contenido en esa dirección.
 +
 +  * **Close**: Cierra el depurador y vuelve a la emulación.
 +
 +  * Haciendo **doble click** en cualquier ubicación del Stack hará que la emulación continúe hasta que PC alcance el valor contenido en esa dirección.
 +
 +  * Haciendo **doble click** en cualquier entrada del panel de "Eventos" (derecha del todo) hará que la emulación continúe hasta que se alcance dicho evento (como, por ejemplo, el final del frame de refresco de pantalla actual).
 +
 +  * **Evaluate**: evaluará y ejecutará el comando introducido en la caja de texto.
 +
 +La potencia del debugger de FUSE radica en sus comandos, que vamos a ver resumidos a continuación.
 +
 +Como normas generales:
 +
 +\\
 +   * El debugger de Fuse no distingue entre minúsculas y mayúsculas.
 +
 +   * Todos los números se interpretarán como en base decimal a menos que lleven el prefijo ''$'' o ''0x''.
 +
 +   * Los comandos pueden ser escritos completos o abreviados. Por ejemplo, cuando indicamos **ba{se}** quiere decir que podemos usar tanto **base** como **ba**.
 +
 +   * Las direcciones de memoria en los comandos se pueden especificar de 2 formas: o como una dirección absoluta (entera o hexadecimal en el rango $0000 a $ffff) o como un string ''página_de_RAM:offset'' para poder referirse a bancos. Las páginas de RAM se referencian con su entero, y las ROMs se referencia con el prefijo R. Así, el offset $1234 en la ROM 1 sería ''R1:$1234''.
 +
 +   * El debugger admite para los valores numéricos (excepto para los identificadores de breakpoint) expresiones simples con operandos básicos (''+'', ''-'', ''*'', ''/'', ''=='', ''!='', ''>'', ''<'', ''>='', ''<='', ''&'', ''|'', ''^'', ''&&'', ''||'') incluyendo operaciones entre valores inmediatos y registros. Estas expresiones se pueden usar también en las "condiciones" para los breakpoints.
 +\\
 +
 +Estos son los comandos disponibles:
 +
 +\\
 +   * **ba{se} dirección**: Cambia la posición de la ventana del debugger para empezar en la dirección indicada.
 +
 +   * **co{ntinue}**: Equivale a pulsar el botón CONTINUE para continuar la emulación.
 +
 +   * **s{tep}**: Equivale a pulsar el botón "SINGLE STEP" para avanzar en un opcode la emulación.
 +
 +   * **fi{nish}**: Sale del actual ''CALL'' o equivalente. Lo hace intentando poner un breakpoint temporal basado en la pila, por lo que no es "infalible".
 +
 +   * **n{ext}**: Avanzar hasta el siguiente opcode, usando la misma técnica que "finish".
 +
 +   * **se{t} dirección valor**: POKEar el valor indicado en la dirección de memoria especificada.
 +
 +   * **se{t} registro valor**: Asignar un valor a un registro del Z80.
 +
 +   * **o{ut} puerto valor**: Escribir un valor en el puerto indicado.
 +
 +   * **br{eakpoint} [dirección] [condición]**: Establece un breakpoint que detiene la emulación cuando un opcode se ejecuta en la dirección indicada y la condición se cumple. Si la dirección se omite, se asume que nos referimos a PC.
 +
 +   * **br{eakpoint} p{ort} (r{ead}|w{rite}) puerto [condición]**: Establece un breakpoint que se dispara cuando lee o escribe el puerto indicado. Se puede indicar una condición que haga que el breakpoint sólo se ejecute si se evalúa a true.
 +
 +   * **br{eakpoint} (r{ead}|w{rite}) [dirección] [condición]**: Establece un breakpoint que se dispara cuando la dirección de memoria indicada es leída (tanto por una instrucción como por un fetch-opcode del Z80) o escrita.
 +
 +   * **br{eakpoint} ti{me} time [condición]**: Establece un breakpoint que se dispara tras "time" t-estados desde el inicio del frame actual. Se puede indicar una condición que haga que el breakpoint sólo se ejecute si se evalúa a true.
 +
 +   * **cl{ear} [dirección]**: Eliminar todos los breakpoints en la dirección indicada o en PC si se omite. No elimina los breakpoints de lectura/escritur de puertos.
 +
 +   * **del{ete} [id]**: Elimina el breakpoint con el ID indicado, o todos si no se especifica ID.
 +
 +   * **cond{ition} id [condición]**: Modifica el breakpoint con el ID indicado para que sólo se dispare si la condición indicada es cierta, o siempre si se omite la condición.
 +
 +   * **t{breakpoint} [opciones]**: Equivalente al comando 'breakpoint' con todas sus variedades, excepto que es temporal y se autoelimina en cuanto se dispare una vez.
 +
 +   * **i{gnore} id N**: No disparar el breakpoint indicado por dicho ID las siguientes "N" veces que ocurra (y que debería haberse disparado si no lo ignorásemos).
 +
 +   * **di{sassemble} dirección**: Centrar el panel de desensamblado para empezar en la dirección indicada.
 +
 +
 +\\ 
 +\\ 
 +===== Tabla de notas para rutina BEEPER =====
  
  
  • cursos/ensamblador/anexo1.1705855913.txt.gz
  • Última modificación: 21-01-2024 16:51
  • por sromero