Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Rétro Poke
10 septembre 2020

RSX: Zip Zone

zipzone

Salut,
Je me suis concocté un petit compacteur d'image compatible sur tous les Amstrad CPC.
Je sais, des compacteurs, il y en a des dizaines et des très bons, mais pour y mettre un peu de sel sur les octets et du poivre sur les bit's, j'ai voulu aussi que ce compacteur puisse compacter des petites zones d'écran car si le nombre de compacteurs est très élevé, je n'en ai vu aucuns avec les possibilités citées ci-dessous.

Il y a aussi plusieurs avantages de compacter des portions d'écran, comme celui de pouvoir repositionner les découpes n'importe ou sur l'écran et de pouvoir créer des décors à partir de morceaux d'images compactées. Idéal aussi pour les jeux d'aventures comportant des fenêtres graphiques, pour créer des titres, des logos, et aussi pour les utilitaires graphiques sans compter sur la possibilité de créer de petites animations directement sur l'image...

La différence avec les autres compacteurs, c'est que l'on peut aussi choisir la valeur du TOKEN qui servira de test. De cette manière il n'est pas nécessaire de faire plusieurs passes ce qui accélèrera le programme de compactage.
Il est également possible d'incorporer le décompacteur avec l'image comprimée, mais il est possible de ne pas l'incorporer de sorte qu'un seul programme de décompactage suffira pour plusieurs images ou zones d'images compactées en mémoire.
De plus, la plupart des décompacteurs commencent de l'adresse &C000 et terminent &4000 octets plus loin mais comme l'Amstrad saute de &800 octets entre chaque ligne au lieu de &50 octets(80), cela réduit le nombre d'octets égaux qui pourraient se suivent, alors qu'avec ce décompacteur, arrivée en fin de ligne, c'est bien directement l'octet situé en début de la ligne suivante qui sera pris en compte.
Une autre différence, et ne pas pas inclure les couleurs avec le décompacteur. Imaginez-vous le nombre d'octets perdus si chaque zone d'image contenait leurs propres couleurs alors que cela ne prend pas plus de place de les déclarer dans un autre endroit du programme.

Le principe de ce compacteur, est de placer dans un TOKEN une valeur qui servira à déclencher une boucle contenant plusieurs octets égaux qui se suivent.
Mais comme un octet peut aussi contenir la même valeur que le TOKEN, alors celui-ci sera aussi déclaré comme une suite d'octets.

Cela dit, il faut savoir comment sera organisée la boucle provoquée par le TOKEN.
Si un octet à la même valeur que l'octet suivant et si le troisième octet est aussi égal alors on peut remplacer les 3 octets par la boucle.
La boucle sera donc composée du TOKEN, suivi de la valeur des octets égaux puis du nombre de fois que l'on a trouvé des octets de même valeur les uns à la suite des autres.
S'il y a plus de 255 octets qui se suivent, alors la boucle sera bouclée et une autre boucle commencera.
Si la valeur d'un octet est égale à la valeur du TOKEN,  une boucle sera initiée même si un seul octet est concerné, d'où l'utilité de pouvoir choisir la valeur du TOKEN afin de gagne plus ou moins de place.
 
Les coordonnées utilisées correspondent en haut à gauche (Colonne, Ligne) de l'écran. Il y a 80 octets en largeurs et 200 lignes en hauteur.

origines


Si on désire pratiquer une découpe, il faudra partir du point (haut/gauche) de la découpe et indiquer le nombre d'octets en largeur et en hauteur.
Pour une image entière cela correspond à: (Colonne, Ligne, Largeur, Hauteur) soit ( 0, 199, 80, 200 )

Par défaut, l'adresse de destination est &4000, mais bien sûr on pourra choisir l'endroit approprié pour chaque utilisation. Ce qui sera très utile dans le cas des découpes. 

Suivant les essais sur différentes images entières, j'ai obtenu des gains jusqu'à 40% environ. Ce gain diminue si on compacte des zones très petites mais il reste très satisfaisant.

Exemple: Gain=40% (&2687/&4000) décompacteur inclus
40pourcent


Exemple sur une zone de l'écran: Gain=37% (1460/2430) sans décompacteur
miniature01


Les RSXs:
ùZIPOP, Indicateur (De 0 à 1)
Indicateur=0 :  Inclure
Indicateur=1 :  Exclure
Cette opération permet d'inclure ou d'exclure le programme de décompactage avec les prochaines images compactées. 
Si le décompacteur est inclus avec votre image, il suffira de taper CALL <Adresse de destination> pour restituer cette image.
Et s'il s'agit d'une zone d'image, vous pourrez la restituer à l'endroit souhaité en tapant: CALL <Adresse de destination>, Colonne, Ligne.

ùZIPOP, (0 ou 1) , TOKEN (De 0 à 255) Par défaut TOKEN=255
Sélectionne la valeur qui servira de comparaison pendant le compactage.
En donnant une valeur qui est le moins représentée dans l'image on obtiendra un gain de quelques octets supplémentaires.


ùZIP
Sans paramètre, cet RSX compactera l'écran entier à l'adresse par défaut (&4000).
CALL &4000 restituera l'image.

ùZIP, Adresse de destination
Comme ci-dessus si ce n'est que l'adresse de destination par défaut sera remplacée par la vôtre.
CALL <Adresse de destination> restituera l'image.

ùZIP, Colonne, Ligne, Largeur, Hauteur
En indiquant les coordonnées, cet RSX permet de compacter une partie de l'image à l'adresse par défaut (&4000).
Colonne (de 0 à 79) et Ligne (de 0 à 199) correspondent au coin haut et gauche de l'image.
Largeur (de 1 à 80) représente le nombre d'octets en largeur de la zone à compacter.
Hauteur (de 1 à 200) représente le nombre de lignes de la zone à compacter.

ùZIP, Colonne, Ligne, Largeur, Hauteur, Adresse de destination
Comme si dessus, sauf que la destination par défaut sera remplacée par la vôtre.


ùZIPLONG, àlong%
Cet RSX ne sert que juste après avoir compacté une image pour en connaitre la longueur.
Comme pour tous les RSXs sur Amstrad, il faut déclarer les variables avant utilisation et envoyer l'adresse de la variable en plaçant devant celle-ci le pointeur représenté par le caractère <à>.
EXEMPLE: 
long%=0: ùZIPLONG, àlong%


Le RSX suivant n'est utile que si le décompacteur n'est pas inclus à l'image compactée.
Le fichier "DEZIP.BIN" contient aussi cet RSX sans les autres. Pour l'installer, TAPEZ: LOAD"DEZIP.BIN": CALL &A400

ùDEZIP
Sans paramètres, cet RSX décompacte l'image ou la portion d'image située en mémoire par défaut (&4000).

ùDEZIP, Adresse mémoire
Décompacte l'image ou la portion d'image située dans la mémoire indiquée en paramètre.

ùDEZIP, Colonne, Ligne
Décompacte la zone de l'image à la position indiquée dans les paramètres à partir de la mémoire par défaut (&4000).
Colonne (de 0 à 79) et Ligne (de 0 à 199) correspondent au coin haut et gauche de l'écran. 

ùDEZIP, Colonne, Ligne, Adresse mémoire
Comme ci-dessus si ce n'est que vous pouvez spécifier l'adresse de l'emplacement de la zone de l'image.

zipzoneSource des RSXs: zipzone
Source du RSX ùDEZIP: dezip

Téléchargement: Cliquez sur la disquette.
disk

Publicité
Publicité
Commentaires
Favoris

 

ùcpm le fanzine
ùCPM le fanzine

 

 

cheshirecats logo

amsnews logo

amsnews logo

amstradeu logo

cpcpower logo

crazi

acme logo

amstradfunlogo

amstradfunlogo

amstradMuseum

amstrad

 

 

 

me contacter

votre banniere ici

 


Publicité
Rétro Poke
Derniers commentaires
Archives
Visiteurs
Depuis la création 16 210
Publicité