domingo, mayo 31, 2026

Cómo crear con Víbe Coding código ASM para AMSTRAD CPC 6128. Por si te animas a "sufrir" conmigo el Retro Vibe-Coding.

No, no se me había olvidado postear, ni iba a dejar de lado al "demonio cabrón", solo es que me ha tomado mucho más tiempo de lo que pensaba. Estos días atrás se me ocurrió la idea de hacerme con Vibe-Coding, o mejor dicho, con SPEC-Coding, una serie de utilidades y herramientas a bajo nivel para el AMSTRAD CPC 6128. Quería hacerlas en lenguaje ensamblador para tener más posibilidades de controlar el equipo, y al mismo tiempo más velocidad de ejecución que los programas interpretados por BASIC.

Figura 1: Cómo crear con Víbe Coding código ASM para AMSTRAD CPC 6128.
Por si te animas a "sufrir" conmigo el Retro Vibe-Coding.

Como idea inicial parecía muy sencilla, pero no ha sido así. Ya os dije que cuando estuve probando a hacerme el juego de Light-Cycles de Tron tuve que pelear bastante. Me dio bastantes errores y costó sacarlo adelante, pero después de varias horas, el programa salió. Eso sí, con un poco más de coste que saldría con los lenguajes más comunes como Python, o Rust, o Javascript

En este caso, viendo el tamaño del MS-DOS de 1981 del que os hablé hace poco, quería trabajarlo en ASM, y comenzar con hacer un Diskcopy a bajo nivel, que era una herramienta que todos los amantes del AMSTRAD CPC6128 teníamos siempre a mano. La idea es sencilla, se trataba de construir un analizador de disquetes, y un duplicador que no falle incluso si un sector está defectuoso, añadiendo re-intentos, copiado a bajo nivel, y además incluso, con IA, generar reparaciones de sectores.  Pero primero, con poder duplicar un disquete me daba por satisfecho.

Creando un proceso para hacer Vibe-Coding/Spec-Coding en ASM Z80 para AMSTRAD CPC

Pues no ha sido fácil. Un autentico dolor. Tanto que, después de más de treinta intentos he tenido todos los problemas de especificaciones que pudierais imaginar. Conseguir que se quedará centrado en ASM para el Z80 de AMSTRAD CPC no ha sido fácil, en cada dos o tres iteraciones añadía funciones en ensamblador de otros microprocesadores.  Tampoco ha sido fácil que cuando escribía el código se ciñera al AMSTRAD, y de repente los cargadores los llevaba al BASIC de Sinclair e incluso de Spectrum, haciendo que la compilación fuera un dolor. 
He estado tentado de leerme los fantásticos tutoriales de Chubiakumas que son una pasada y hacérmelo yo a mano como antaño. Al final, después de varias horas probando una y otra cosa, he conseguido que me funcione bien el proceso, aunque el código aún lo tengo al 1% de lo que quiero construir. Pero si te animas a probarlo tú, y quieres sufrir un rato conmigo, te lo dejo por aquí.

1.- El Prompt para pedir el código

No he utilizado ningún sistema de Spec-Coding todavía, así que sólo conseguir un programa Stand-Alone usando Gemini 3.5 Thinking y DeepSeek v3 DeepThink me ha dado bastantes problemas. Al final, he utilizado un Prompt que acote bien que el código se genere para ese entorno concreto.

Eres un experto programador en Z80 para el ordenador Amstrad CPC6128.
Necesito que generes código ensamblador (Z80) que cumpla estrictamente con las siguientes reglas:

1. **Solo instrucciones estándar Z80** (no usar códigos de operación no documentados ni instrucciones de terceros).
2. **El código debe ejecutarse sin fallos en un Amstrad CPC6128 real** (o emulador fiable como WinAPE, JavaCPC, Caprice).
3. **El programa debe arrancar en ORG &4000**
4. **No debe asumir nada sobre el estado previo del sistema** (inicializar todo lo necesario: modo de pantalla, colores, interrupciones, etc.).
5. **Uso del firmware** – se permite, pero solo llamadas bien documentadas (por ejemplo SCR_SET_MODE &BC0E, TXT_OUTPUT &BB5A, etc.). Si se usa acceso directo a hardware (VRAM, puertos), debe ser correcto para el CPC.
6. **Gestión de errores** – el programa no debe colgar el sistema. Si termina, debe retornar limpiamente (RET) o quedar en un bucle seguro.
7. **Comentarios claros** – cada sección debe explicar qué hace en relación al hardware del CPC (pantalla, memoria de vídeo en &C000, etc.).
8. **Ejemplos de código** – si se pide una tarea concreta (por ejemplo, mostrar texto centrado, dibujar gráficos, leer teclado), el código debe ser autocontenido y funcionar al cargarlo con LOAD y ejecutarlo con CALL &4000.

Antes de escribir el código, comprueba mentalmente:
- Las direcciones de firmware son correctas para el CPC6128.
- La memoria de vídeo en modo 1 es de 16000 bytes, desde &C000 hasta &amd;FE7F.
- El tamaño de la pila es suficiente.
- No se desborda la VRAM (escribir más allá de &FE7F corrompe el sistema).

[TAREA A REALIZAR]

No es un Prompt "perfecto", pero es el que mejores resultados me ha dado en todo el proceso para conseguir que no se me fuera a otros equipos, a otros lenguajes o a otros ensambladores.

2.- Compilación con pasmo

Hay otras alternativas, pero una vez tenía el código ASM generado por Gemini o por DeepSeek, lo he compilado con pasmo en formato BIN usando la cabecera AMSDOS, tal y como podéis ver en la siguiente captura. Nada complicada esta parte.
Pasmo lo puedes descargar desde la web del proyecto. Yo me he descargado la última versión, la he instalado y ha funcionado a la perfección en mi MacOS última versión, así que no debería darte ningún problema en ningún sitio.
De este proceso te deberá salir el código .BIN de tu programa, que es lo que deberemos llevar al disquete en la fase siguiente.

3.- Creación del disquete

Esta es una fase sencilla, ya que puedes hacer la creación de un disco virtual, usando Amstrad DSK Filesystem Manager. Para ello, crea primero un disquete con "New Disk Image" y luego el código .BIN que tienes que tener comprimido como FICHERO.BIN.ZIP lo arrastras a la parte de arriba a la derecha donde pone "Import to DSK".

Cuando tengas el fichero en la lista de archivos de tu DSK, entonces puedes descargarlo con Download DSK file y tendrás tu disquete virtual listo para utilizar en tu emulador.

4.- CPCBOX

Como ya os conté en el otro artículo, yo utilizo CPCBOX para probar estas cosas, así que solo tienes que arrancar el emulador, y seleccionar la imagen de tu disquete virtual en la disquetera, como puedes ver en la captura siguiente.
Una vez cargado, puedes ver el contenido desde tu AMSTRAD usando CAT - como siempre -, y ver todos tus ficheros y pruebas ahí listados.
En mi caso, como podéis ver, he estado haciendo bastantes pruebas, y muchas han fallado, pero bueno, al final casi he conseguido tener un método de trabajo que funcione. Para cargar el programa, pidiéndole que cargue el programa a partir de la dirección &4000 (puedes probar a partir de la &1000 que es también típica para códigos binarios en AMSTRAD CPC), pues debes cargarlo en memoria.
Para eso, reservamos memoria, cargamos el binario y mandamos el contador de programa del AMSTRAD a la dirección de carga del código BIN que hemos cargado. Si este no funciona bien, y no hace el RET en el código final, el resultado será que se te cuelga el equipo y hay que apagar y encender. 
Esto es otro tipo de equipo al que tenemos hoy en día con la memoria protegida y arquitecturas preemptivas. Aquí el programa puede quedarse con el flujo de programa.

Conclusión

La gracia de todo este proceso, para mí, era poder programar en AMSTRAD CPC haciendo uso del ASM del Z80 porque este era el lenguaje más potente y la forma de hacer los juegos más bonitos de este equipo, pero por desgracia el Vibe-Coding (Spec-Coding) para el Z80 de AMSTRAD CPC aún no está muy logrado, así que hay que remar mucho. Veremos en siguientes versiones, u otros modelos. Si lo pruebas en algún modelo o versión que te funcione a la primera... ¡házmelo saber!

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


No hay comentarios:

Entrada destacada

Hacking IA: Jailbreak, Prompt Injection, Hallucinations & Unalignment. Nuestro nuevo libro en 0xWord

Pocas veces me ha hecho tanta ilusión que saliera un nuevo libro en 0xWord como con este libro de " Hacking IA: Jailbreak, Prompt Inje...

Entradas populares