Structure fichier SPC
Structure du fichier
W : HEADER = $5350 ( SP en ascii)
W : Inutilisé (à ma connaissance)
L : Taille image compactée
L : Taille de la palette compactée
X octets: Image compactée
X octets: Palette compactée
Décompression de l'image
Le principe : (Cf. l'affichage vidéo)
Le premier octets est un nombre signé.
Si le signe est positif, ce nombre indique le nombre d'octets qui devra être recopié. Ces octets correspondant à l'image (traitement spcrvbn).
Si le signe est négatif, le signe indique alors qu'il y a une compression et le nombre correspond au nombre de fois qu'il faut répéter l'octet suivant dans le fichier (il y a éventuellement une petite convertion à faire : le nombre est signé et il nous faut un nombre positif pour faire une boucle: (-1 * le nombre signé) + 1) . (traitement spcr_v_b_n).
On boucle ensuite jusqu'à arriver à nos 32000 octets ...- 1 ligne. la première ligne servant à la synchronisation pour l'affichage des couleurs, il n'est alors pas possible de dessiner dedans. La résolution d'une image Spectrum est donc de 320x199. Au niveau du label phaservbn, je retire 31840 et non 32000 32000-31840 = 160 octets = 160*8/4 = 320 points).
Une bonne idée, le traitement de l'image se fait par plan identique (les plans permettant de déterminer les registres de couleurs). Ce qui, me semble-t-il, est la solution la plus souvent intéressante en terme de possibilité de répétition d'octets. Il est en effet plus fréquent d'avoir des octets identiques qui se suivent sur un même plan. Alors qu'il est plus rare de trouver des octets identiques par groupe de plans...
En respectant toutes ces règles, nous pouvons en déduire le programme de décompression que voici:
Le traitement suitdec s'occupe de la décompression par plan, j'ai mis aussi un petit contrôle sur la taille des données traitées dans le cas où l'on chargerait un fichier altéré (ce qui m'est arrivé !). Cela évitera d'écraser des données en mémoire lors de la décompression.
Décompression de la palette :
Le principe:
Spectrum va modifier 3 fois la palette des couleurs par ligne.
Nous avons 199 lignes donc 199x3 = 255 palettes de couleurs.
2 couleurs sont réservées : la couleur du fond (Le premier registre de couleurs) qui est noire (000 en RVB) et le 16 ième registre pour pouvoir afficher la souris par exemple (en général de couleur blanche soit 777 en RVB). Dans le fichier ne sera alors stocké que les couleurs des registres 1 à 14.
Le premier mots (16 bits) va indiquer les registres utilisés ou non. On trouve ensuite une série d'octets dont le nombre va varier suivant l'état des bits du premier mot (positionnés ou non). Cette série d'octets sera en fait les couleurs des registres utilisés.
Vous n'avez pas forcement Spectrum chez vous pour créer une image Spectrum.
Pour essayer vos programmes, vous pouvez aller sur le site suivant pour récupérer
des images Spectrum: http://dahstra.rksmithfamily.net/spectrum/