Hola a todos:
Como algunos recordarán, sigo trabajando en el desensamblado completo y los comentarios de la ROM del módulo Vortex F1-X (V 2.11-X). No es una tarea fácil sin una CPU en funcionamiento que ejecute el código de verdad. Así que me he pasado unos 3 días creando mi propia herramienta con la ayuda de Claude.
Me gustaría presentar CPC X-Ray, una herramienta de código abierto (GPL-3.0) que he estado programando para destripar código de CPC: ROM, programas y todo lo que se ejecute en un 464, 664 o 6128.
Para qué sirve
CPC X-Ray es una herramienta de análisis que resulta contener un emulador, no al revés. Su función es ayudarte a desensamblar y comprender el código existente para convertirlo en código fuente comentado para sjasmplus que vuelva a ensamblar los bytes originales (comprobado byte a byte). Ejecuta el firmware real, BASIC, AMSDOS y ROM de expansión, y te permite ver todo lo que hace el código:
- Puntos de interrupción de diez tipos (PC, M1, lectura/escritura/acceso a memoria, entrada/salida de E/S, selección de ROM, interrupción), con rangos, máscaras de puerto y condiciones de paginación
- Una traza de instrucciones con profundidad de llamadas y registros modificados, para que tras una parada puedas retroceder y ver cómo ha llegado el código hasta ahí
- Una traza de bus de cada acceso (M1, lectura, escritura, E/S) con explicaciones: qué variable del firmware se ha tocado, qué se ha apilado en el stack, qué hace una escritura en un puerto
- Vistas de memoria coloreadas según las variables del firmware y de AMSDOS, la paginación, la pila y los nombres de firmware para las tres máquinas
- Un análisis de un rango de ROM o RAM: código frente a datos, código copiado a la RAM y ejecutado allí, llamadas RST con datos insertados (inline), que se convierten en el código fuente
- Decodificación de ROM codificadas (scrambled) (el esquema del módulo X de Vortex, donde las lecturas de opcodes y las de datos se decodifican de forma diferente)
También cuenta con un servidor MCP, por lo que Claude Code (el asistente de programación con IA de Anthropic) puede controlar la máquina por completo: arrancarla, teclear, poner puntos de interrupción, avanzar paso a paso, leer la memoria y las trazas, y ejecutar el análisis. En la práctica, analizáis juntos una ROM: observa lo que hace el código realmente en tiempo de ejecución y te ayuda a nombrar rutinas y variables y a redactar los comentarios.
Qué no es
No es un emulador de uso general ni pretende competir con WinAPE, ACE, CPCEC y compañía; usa esos para jugar o ver demos. CPC X-Ray recorta deliberadamente funciones allí donde no importan para el análisis de código:
- El Z80 funciona a nivel de instrucción: cada acceso al bus se produce en el orden correcto y con las señales adecuadas, y supera ZEXALL y los 1,6 millones de pruebas SingleStepTests, pero no hay estados T (T-states) dentro de una instrucción
- El CRTC son solo sus registros, sin temporización de barrido (raster); la interrupción y VSYNC siguen un modelo simplificado
- Sin sonido, sin soporte de cinta, sin impresora; el PPI/PSG solo incluye lo necesario para el teclado y VSYNC
- Funciona aproximadamente en tiempo real (más lento con el análisis y las trazas activados)
El firmware, BASIC, AMSDOS y el acceso a disco funcionan. Los trucos de barrido (raster), divisiones a mitad de línea y todo lo que dependa de una temporización de ciclos exacta no funcionan, y eso no va a cambiar: es una decisión de diseño, no una tarea pendiente.
Cómo conseguirlo
La versión 0.9.0 (beta) cuenta con un paquete de Python y programas listos para usar en Windows y Linux; se incluyen las ROM estándar de Amstrad:
El código está completo respecto a lo que tenía planeado para la versión 1.0; lo que necesita ahora es que se use en casos reales. Los comentarios, reportes de fallos e ideas son más que bienvenidos, ya sea por aquí o en el gestor de incidencias de GitHub.
Usadlo sabiendo lo que es, pero no penséis que compite con ningún otro emulador, ya que no tiene implementada gran parte del hardware (ni siquiera el CRTC o el Gate Array).
Por ejemplo, la pantalla no la renderiza el Gate Array, sino un renderizador que simplemente lee la RAM de pantalla y la vuelca en un frame RGB normal para que se pueda mostrar.

