Diferencias
Muestra las diferencias entre dos versiones de la página.
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] sromero | cursos: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 " | ||
+ | |||
+ | 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). | ||
+ | |||
+ | \\ | ||
+ | {{ : | ||
+ | ;#; | ||
+ | //FUSE en su versión GTK// | ||
+ | ;#; | ||
+ | \\ | ||
+ | |||
+ | \\ | ||
+ | {{ : | ||
+ | ;#; | ||
+ | //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 " | ||
+ | |||
+ | * **Single Step**: Ejecuta un único opcode del Z80 y detiene de nuevo la emulación. | ||
+ | |||
+ | * **Continue**: | ||
+ | |||
+ | * **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 " | ||
+ | |||
+ | * **Evaluate**: | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | * 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 '' | ||
+ | |||
+ | * El debugger admite para los valores numéricos (excepto para los identificadores de breakpoint) expresiones simples con operandos básicos ('' | ||
+ | \\ | ||
+ | |||
+ | Estos son los comandos disponibles: | ||
+ | |||
+ | \\ | ||
+ | * **ba{se} dirección**: | ||
+ | |||
+ | * **co{ntinue}**: | ||
+ | |||
+ | * **s{tep}**: Equivale a pulsar el botón " | ||
+ | |||
+ | * **fi{nish}**: | ||
+ | |||
+ | * **n{ext}**: Avanzar hasta el siguiente opcode, usando la misma técnica que " | ||
+ | |||
+ | * **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]**: | ||
+ | |||
+ | * **br{eakpoint} p{ort} (r{ead}|w{rite}) puerto [condición]**: | ||
+ | |||
+ | * **br{eakpoint} (r{ead}|w{rite}) [dirección] [condición]**: | ||
+ | |||
+ | * **br{eakpoint} ti{me} time [condición]**: | ||
+ | |||
+ | * **cl{ear} [dirección]**: | ||
+ | |||
+ | * **del{ete} [id]**: Elimina el breakpoint con el ID indicado, o todos si no se especifica ID. | ||
+ | |||
+ | * **cond{ition} id [condición]**: | ||
+ | |||
+ | * **t{breakpoint} [opciones]**: | ||
+ | |||
+ | * **i{gnore} id N**: No disparar el breakpoint indicado por dicho ID las siguientes " | ||
+ | |||
+ | * **di{sassemble} dirección**: | ||
+ | |||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ===== Tabla de notas para rutina BEEPER ===== | ||
Línea 28: | Línea 132: | ||
\\ | \\ | ||
- | |< 40% >| | + | |< 30% >| |
- | ^ Note ^ Frequency\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ | + | ^ Nota ^ Frecuencia\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ |
| C 0 | 16.35 | $6868 | | | C 0 | 16.35 | $6868 | | ||
| C#0 | 17.32 | $628d | | | C#0 | 17.32 | $628d | | ||
Línea 52: | Línea 156: | ||
| G#1 | 51.92 | $20cc | | | G#1 | 51.92 | $20cc | | ||
- | |< 40% >| | + | |< 30% >| |
- | ^ Note ^ Frequency\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ | + | ^ Nota ^ Frecuencia\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ |
| A 1 | 55.00 | $1ef4 | | | A 1 | 55.00 | $1ef4 | | ||
| A#1 | 58.28 | $1d34 | | | A#1 | 58.28 | $1d34 | | ||
Línea 76: | Línea 180: | ||
| F 3 | 174.64 | $9ab | | | F 3 | 174.64 | $9ab | | ||
- | |< 40% >| | + | |< 30% >| |
- | ^ Note ^ Frequency\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ | + | ^ Nota ^ Frecuencia\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ |
| F#3 | 184.96 | $91f | | | F#3 | 184.96 | $91f | | ||
| G 3 | 196.00 | $89a | | | G 3 | 196.00 | $89a | | ||
Línea 106: | Línea 210: | ||
| G#5 | 830.72 | $1f0 | | | G#5 | 830.72 | $1f0 | | ||
- | |< 40% >| | + | |< 30% >| |
- | ^ Note ^ Frequency\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ | + | ^ Nota ^ Frecuencia\\ (DE = f*duración_en_seg) ^ Pitch (HL) ^ |
| A 5 | 880.00 | $1d3 | | | A 5 | 880.00 | $1d3 | | ||
| A#5 | 932.48 | $1b7 | | | A#5 | 932.48 | $1b7 | |