'Still Scrolling', une intro 4K pour Amstrad CPC

'Still Scrolling', une intro 4K pour Amstrad CPC

Pour bien commencer l’année CPC, voici une intro 4K fraîchement concoctée par votre serviteur, avec le soutien coloré de Barjack/Praline. Cela faisait 25 ans que je n’avais rien fait sur cette machine, j’espère ne pas a avoir à attendre autant de temps pour une prochaine production! Le site Memory Full m’a interviewé suite à la sortie de cette intro, c’était l’occasion de parler de projets passés et futurs! Je vais revenir ici sur quelques techniques mises en oeuvre pour faire en sorte que le fichier binaire fasse moins de 4096 octets. Le code source est disponible ici mais attention, ce n’est pas forcément très lisible!

Lors de la création de l’intro ‘Still Scrolling’, j’ai donc appris de nombreux trucs pour arriver à faire loger le code, les graphismes et la musique dans 4Ko. Ce n’est pas ici un making of, et certaines techniques que je décris ici n’auront pas été utilisées dans cette prod. Il faut dire que beaucoup de code a été écrit, testé et jeté pour arriver au résultat final! 

Compression

Bien entendu, la méthode la plus efficace pour réduire la taille d’un fichier binaire est de le compresser. Il existe de nombreux compresseurs / décompresseurs, avec des caractéristiques différentes, les principales étant le ratio de compression obtenu, le temps de décompression et la taille du décompresseur.

Shrinkler par exemple est peut être actuellement le plus performant en terme de ratio de compression. Il permet en outre d’avoir une routine de décompression plutôt courte (environ 200 octets sur CPC). Son défaut majeur est que la décompression est très lente. Sur CPC, au delà d’une production 4Kb, il vaut mieux utiliser d’autres compresseurs (Exomizer par exemple)

Plus les données en entrée sont régulières et répétitives, plus le ratio de compression sera favorable. Ainsi, il est parfois nécessaire de désoptimiser son code. Au lieu d’obtenir un code optimal en terme de vitesse, voire de taille brute, il faut parfois rallonger le code ou le rendre plus gourmand, si cela permet d’obtenir un code le plus répétitif possible, et donc plus court in fine.

Table Sinus

On souvent besoin d’une table sinus pour animer un effet. Par exemple pour faire rebondir le texte qui défile a l’écran. Et le problème c’est que ce genre de données ne se compresse pas forcément bien. Il est possible de générer la table par code, mais a défaut, il faut exploiter les propriétés de symétrie de la fonction sinus pour ne stocker qu’une partie. C’est une idée très simple, mais très efficace.

Graphismes générés

Au même titre que les tables sinus précalculées, il n’est pas forcément envisageable d’intégrer des graphismes. Ce genre de donnée ne se compresse la encore pas très bien. Il faudra alors user de méthodes procédurales pour les produire. Par exemple, le ‘décor’ utilisé pour mon intro est généré au démarrage du programme.

Fonte Système

Si on veut afficher du texte à l’écran (ici le texte du scrolling, il est difficile d’embarquer une fonte dans une production de taille réduite, pour les raisons déja évoquées. Il est toujours possible de récupérer la fonte système, même si elle n’est pas forcément gracieuse.

Éventuellement, un algorithme peut permettre de générer une fonte, à partir de la fonte système, en l’altérant, en l’agrandissant, lui appliquer une texture, pour la rendre un peu plus esthétique.

Retirer le code inutilisé

Cela peut paraître totalement trivial, mais il ne faut vraiment pas négliger cette étape. Et pour cela, rien de tel qu’avoir un peu d’outillage. Il est en effet facile de passer à coté de bouts de code qui ne sont en fait jamais utilisés. Pire, si on intègre du code qui n’est pas le sien (le player audio par exemple), on ne maîtrise pas forcément chaque portion de code.

Pour m’assurer qu’il n’existe pas un seul opcode de trop dans la Still Scrolling, j’ai fait usage d’une fonctionnalité fort appréciable de l’émulateur WinCPC: dans sa fenêtre de débug, WinCPC indique pour chaque adresse, si elle contient une instruction qui a été exécutée ou non (depuis le reset du CPC). 

Il suffit de faire tourner la démo en entier, et a la toute fin (au moment de reboucler ou de se terminer) d’interrompre l’exécution du code, de passer en mode debug, et de parcourir le code en mémoire pour reperer les instructions non utilisées. 

Dans mon cas, j’ai pu réduire la taille du player musical, car je n’utilisais pas certains effets dits hardware dans le morceau accompagnant l’intro. J’ai donc pu les retirer du code source. 

Musique

J’ai utilisé Arkos tracker (en version 1 a l’époque) pour composer la musique de ‘Still Scrolling’, et après de nombreux essais, j’ai pu constater que l’export au format binaire était rudement bien optimisé: tout ce qui n’est pas nécessaire (piste, instrument) n’est pas exporté. Inutile donc de chercher a ‘nettoyer’ le module audio, ou d’espérer gagner quelques octets en renumérotant les pistes de façon a ne pas avoir de trou. L’export fait tout cela à la perfection!

Header Amsdos

Sur CPC, les fichiers stockés sur une disquette ont une entête de 128 octets, qui contient entre autres le nom et la taille du fichier, l’adresse de départ, ainsi que le point d’entrée. Mais une bonne partie des ces 128 octets n’est pas utilisée.

Par convention, le header est pris en compte dans la taille d’une intro. Ainsi une intro 4Kb sera en réalité décomposée en 128 + 3968 octets. Bref, on aimerait bien récupérer une partie de ces 128 octets…  Par exemple pour y loger des initialisations, couper les interruptions, déplacer des blocs mémoire, faire une petite animation etc. 

Liens

  1. https://acpc.me/ACME/FANZINES_PAPIER/[FRA]FRANCAIS/QUASAR/Catalogue_et_fichiers(recompositon_par_Drill)[OCR].pdf
  2. Code de l’intro: https://github.com/sikorama/still_scrolling