Contexte et objectifs
En octobre 2026, l’auteur a publié un intro démoscene fonctionnant sur un ZX Spectrum 128 KB d’origine. Le programme occupe 10 287 octets en code machine, soit 19 552 octets une fois empaqueté dans une image .tap exploitable par tout émulateur. L’objectif était de reproduire les crack‑tros Amiga des années 80 : texte défilant, police personnalisée, bande‑son AY‑3‑8912 à trois canaux, jauges VU et champ d’étoiles parallaxe.
Le projet a débuté le 13 décembre 2025 et, selon les calculs de l’auteur, a généré une moyenne de 455 octets de code par semaine. Cette cadence reflète la difficulté d’optimiser chaque instruction sur le processeur Z80 à 3,5 MHz, tout en respectant la capacité mémoire limitée du Spectre.
Architecture et optimisation
Le code est écrit en assembleur Z80, sans recours à des bibliothèques externes. L’auteur a exploité les routines ROM du Spectrum pour le chargement du .tap, réduisant ainsi le besoin de code de gestion de disque. Les polices « leet » sont stockées sous forme de tables de caractères compressées, décompressées à la volée par des boucles LDIR optimisées. Le texte défilant utilise un buffer circulaire de 256 octets, évitant les copies de mémoire coûteuses.
Le champ d’étoiles parallaxe repose sur un algorithme de déplacement incrémental qui réutilise le registre IX comme pointeur de ligne, minimisant les accès au port vidéo. Les jauges VU, synchronisées avec le lecteur de canal AY, sont calculées à partir du registre de volume, ce qui évite toute lecture de la mémoire sonore.
Contraintes matérielles
Le ZX Spectrum 128 KB dispose de 128 KB de RAM, dont 48 KB sont dédiés à la vidéo. Le programme doit donc partager cet espace entre le code, les données graphiques et la musique. En limitant le code à 10 287 octets, l’auteur laisse plus de 37 KB pour les tables de caractères, les sprites et la partition AY, assurant ainsi une lecture fluide sans dépassement de la bande passante mémoire.
Le processeur Z80, bien que puissant pour l’époque, ne peut pas exécuter plus de 3 500 cycles par milliseconde. Chaque frame de l’intro a été calibrée à 50 Hz (PAL), ce qui impose une limite d’environ 70 000 cycles par image. L’auteur a mesuré les sections critiques avec le registre R et a réécrit les boucles les plus lourdes en unrolled loops pour rester sous cette contrainte.
Bilan et perspectives
L’intro démontre qu’il est encore possible de pousser les limites du ZX Spectrum en respectant les contraintes d’origine. Le projet combine une connaissance approfondie du matériel (AY‑3‑8912, ports I/O, mémoire vidéo) avec des techniques d’optimisation modernes (compression de données, utilisation de registres index). Le code source, disponible en téléchargement, constitue une référence pour les développeurs souhaitant explorer le home‑brew sur des plateformes 8‑bits.
Future work pourrait inclure le portage vers le ZX Spectrum + 3, l’ajout d’effets de rotation 3D via des tables de sinus pré‑calculées, ou l’intégration d’une carte réseau TNFS pour charger les ressources en temps réel, ouvrant la voie à des intros plus longues sans augmenter la taille du .tap.