CODING ★ COMPRESSE DES COMPRESS ★

Assembleur ACPC n°48 : Compresse des Compress

Les images peuvent représenter un suprême plaisir pour les yeux, et un désarroi pour les disquettes. Dix-sept Ko par image nous donnent neuf images par face de disquette, ce qui n'est pas beaucoup. Pourquoi ne pas se faire un petit compresseur-décompresseur spécialisé dans les écrans? C'est le programme que nous vous proposons dans ces pages.

L'assembleur est le langage le plus rapide que notre micro puisse utiliser. Ça réside simplement dans le fait qu'il n'a aucun travail d'interprétation à réaliser. Il exécute sans se poser de questions. Seulement voilà, la moindre erreur se termine par la même rengaine : le plantage pur et simple. Il faut donc bien réfléchir à l'organisation du programme avant de commencer, histoire de ne pas avoir de surprise. Tracer sur papier évite de se prendre le chou à travailler sur micro. Le cerveau est le meilleur débugger qu'on puisse trouver. Ne l'oubliez jamais.

STRUCTURE DES IMAGES

Si on veut compresser efficacement des images, il faut avant tout regarder de près leur structure. La première chose qui saute aux yeux lors de l'analyse est le fait que d'une ligne à l'autre, il n'existe pas de grandes modifications d'état. Une maison ou un arbre au milieu de l'écran montrent que des données identiques se retrouvent d'une ligne à l'autre. On peut ainsi en déduire la forme de codage suivante par ligne:

- n bits représentant les octets à coder;
- z octets ne codant que les valeurs différentes entre les lignes.

Le format d'un fichier compressé d'écran sera donc formé de :

- 80 octets formant la première ligne (la ligne de référence) ;
- 10 octets (10 x 8 = 80 bits) formant le masque de la nouvelle ligne;

- z octets contenant les différences entre les deux lignes.
Ces deux dernières lignes sont codées 199 fois, car 199 lignes sont à reconstruire.

CODAGE DES DONNÉES

Imaginons le codage du sprite de 8 x 4 octets suivant:

00 01 02 03 02 01 00 00
00 01 03 02 03 01 00 00
00 01 03 03 03 02 01 00
00 01 03 02 03 02 01 01

Voici comment sera préparée la première étape du fichier compressé:

Masque    Ligne
          00 01 02 03 02 01 00 00
00111000  00 01 03 02 03 01 00 00
00010110  00 01 03 03 03 02 01 00
00010001  00 01 03 02 03 02 01 01

Remarquez que dans le masque (l'octet de gauche donné en binaire) un 1 symbolise une différence entre deux octets d'une même colonne et le zéro signifie que les données sont égales d'une ligne à l'autre, encore dans une même colonne. Lors de l'étape suivante, nous retirons les données redondantes et ne gardons que les octets différents. En voici le résultat

Masque    Ligne
         ;00 01 02 03 02 01 00 00
00111000 03 02 03
00010110 03 02 01
00010001 02 01

De 32 octets, nous passons à 19, ce qui n'est pas négligeable. La décompression se passe sans le moindre problème. Il suffit d'analyser le masque et selon le bit rencontré, s'il vaut 1, on prend un nouvel octet dans la liste et dans le cas contraire, on recopie simplement l'octet correspondant de la ligne précédente. Notez qu'un écran est simplement 10 fois plus large que notre sprite, ce qui ne change rien à l'idée de programmation.

RUSE DE PROGRAMMATION

Dans ces deux routines, nous employons une grosse ruse de programmation consistant à former des instructions de test ou de modification de bits directement dans le code. Ce sont les instructions RES, SET ou BIT qui sont directement codées par la routine, ceci au niveau des labels SUICP des deux programmes. Le reste n'est que broutille. Une routine de création des adresses des lignes écran, une de chargement d'écran, une de traitement et une d'écriture. Rien de sorcier! Il est possible d'augmenter encore le taux de compression en forçant le CPC à trouver la ligne écran la plus ressemblante à la ligne de référence, mais ceci est une autre histoire...

» Download la source de la compression
» Download la source de la decompression

Sined le Barbare

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 084 millisecondes et consultée 1069 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.