Vous êtes sur la page 1sur 6

\ Le principe

\ de la
\ compression RLE
\ expliqu�e par
\ BahaBulle (G�n�ration IX)
\ et
\ Meradrin (Final Translation)
\_____________________________________________________________

Bien le bonjour � vous !

Voici un petit document permettant d'expliquer le fonctionnement de


la compression RLE.

C'est un document sans grande pr�tention �tant donn� que le peu de


connaissance que j'ai de cette compression est seulement ce que
Meradrin m'a expliqu�, c'est � dire le strict minimum :)

Donc il est possible que j'ai oubli� des choses. Si c'est le cas
n'h�sitez pas � me contacter.

Mais pour aider � comprendre, je m'appuierai sur un exemple concret.

---------------------------------------------------------------------
\ 1. Introduction
\___________________________________________________________________

Un jour comme un autre, (enfin, c'est ce que je croyais) PERIGOURDIN,


un jeune hackeur du groupe G�n�ration IX, vint me demander de l'aide
pour un jeu qu'il �tait en train de hacker. Ma g�n�rosit� se fit
entendre � ce moment-l� et je pris donc la rom du jeu pour regarder
ce probl�me.

J'ouvris donc la rom sous mon �diteur hexad�cimal et apr�s un moment


de recherche, qui ne fut pas tr�s long (�tant donn� que PERI m'avait
donn� l'adresse du texte en question ;)), je me trouvais devant un
probl�me que je n'avait jamais rencontr� : certaines lettres �taient
manquantes et des octets �tranges se trouvaient dans le texte.

Ne sachant pas comment r�soudre ce probl�me (bah oui, je suis pas un


super hackeur ;)), je me suis permis de poser la question �
mes compatriotes du chan de G�n�ration IX.

Apr�s un petit moment, Orphis m'apprit qu'il s'agissait d'une


compression de type RLE.

Pour une raison que j'ignore aujourd'hui (je m'en rappelle plus :p),
je n'ai pas eu d'explications d�taill�es de cette compression � ce
moment-l�.
Cependant, le lendemain, Meradrin proposa de me l'expliquer.
Ni une, ni deux, j'ai ouvert mes 2 yeux et lu tout ce qu'il me
racontait.

Aujourd'hui, apr�s un long moment (presque un an) et des demandes


incessantes de la part de Ti Dragon (:D), je vais moi-m�me essayer de
vous expliquer cette compression.

C'est parti !!
---------------------------------------------------------------------
\ 2. A quoi �a sert ?
\___________________________________________________________________

Et bien, il s'agit bien �videmment d'une compression et, comme toute


compression, elle permet de r�duire la taille de ce que l'on veut
compresser (textes, images...).

Cependant, cette compression est plus souvent utilis�e pour


compresser des images que des textes pour la simple et bonne raison
qu'elle compresse une suite d'octets identiques (2 ou plus).
Et comme tout le monde le sait, on trouve rarement des mots avec
plus de 2 lettres identiques.

---------------------------------------------------------------------
\ 3. Comment �a marche ?
\___________________________________________________________________

La compression RLE ou de son vrai nom : Run Length Encoding.

Toute compression RLE commence par un octet, appel� "skip", (tout du


moins, c'est comme �a que Meradrin le nomme :)) qui fait office
d'indicateur afin de savoir combien d'octets ne sont pas compress�s.
Une fois ce nombre d'octets pass�, on trouve un nouvel octet qui
indique le nombre de fois que doit �tre r�p�t� l'octet qui suit.
Ensuite, on trouve un nouveau skip pour les prochains octets et
ainsi de suite...

Donc pour r�sum�, on a 1 octet (skip) pour nous dire combien


d'octets sont "normaux" puis 1 octet pour le nombre de r�p�tition
puis 1 octet � r�p�ter puis un nouveau skip.

Prenons l'exemple bidon suivant : ABCCCCCCDEFG


En RLE, on pourrait �crire : <01>A<01>B<06>C<01>D<01>E<01>F<01>G
o� l'octet devant chaque lettre est l'octet de r�p�tition.

Cependant, comme le dit Meradrin : "Mais ne trouves tu pas idiot de


rajouter 1 octet pour dire qu'il y a 1 octet de r�p�tition ?"

C'est pour �a que le skip existe : pour dire que les X prochains
octets sont compress�s ou non. Pour notre exemple, on pourrait
donc �crire : <02>AB<06>C<04>DEFG o� <02> et <04> sont des skip
et <06> un octet de r�p�tition.

Cependant, ceci n'est pas un exemple tout � fait correct car


certains bits du skip indiquent si les donn�es sont compress�es
ou non. Mais nous verrons cela plus concr�tement dans l'exemple
qui suit.

Tout le monde arrive � suivre ?

Quelle que soit la r�ponse, nous allons maintenant prendre un


exemple concret :)

PS : G�n�ralement les donn�es sont cod�e ligne par ligne (comme


dans notre cas) mais il existe des variantes o� les donn�es
sont cod�es en colonnes voire en zigzag.
N'ayant pas d'exemple sous la main, je ne peux d�tailler
ces variantes mais elles doivent fonctionner de la m�me fa�on.

---------------------------------------------------------------------
\ 4. Un petit exemple pour bien assimiler ce qui vient d'�tre dit
\___________________________________________________________________

Nous allons �tudier la compression RLE avec le jeu Double Dragon 3


sur NES.

Dans ce jeu, le texte d'introduction est compress� en RLE.

Premi�rement, on peut se poser quelques questions :

- Q1 Pourquoi avoir seulement compress� l'introduction et pas le reste


du script ?

- Q2 Pourquoi les d�veloppeurs ont compress�s du texte en RLE ?


Alors qu'on va seulement pouvoir compresser 2 caract�res sur
2 octets. Donc aucun gain de place.

- R1 Il est "inutile" de compresser du texte en RLE donc pas la peine


de compresser le script.
Mais alors pourquoi l'introduction est compress�e ?

- R2 L'introduction du jeu comprend une image et du texte. Donc la


seule explication que je vois est qu'ils ont compress� les images
de l'intro et comme le texte se trouve au m�me endroit, il a
�galement �t� compress�. Peut-�tre qu'ils ont m�me compress�
toute la bank...
Mais je peux rien affirmer car je n'ai pas v�rifi� ;)

Bref, revenons � nos moutons : munissez-vous de votre �diteur


hexad�cimal pr�f�r� (pour moi ce sera Translhextion).

Ouvrez votre rom (Double Dragon III - The Sacred Stones (U).nes) et
rendez-vous � l'adresse : 0x011373
(J'ai utilis� le (U) car la (E) avait plant� chez moi)

Nous nous trouvons en face d'un premier bloc de texte de


l'introduction qui, comme vous le constaterez, est presque totalement
visible except� quelques passages.

-------Texte compress�-------
-----------------------------
MA<00>YEAR HAS<00>P
A<02>SHED SINCE)<00>BB
I<02>MHY<00>AND<00>JI<02>MJY
<00>DEFEATED(<00>MTHE<00>
SHADOW<00>WA<02>REIORS
.
-----------------------------

------Texte d�compress�------
-----------------------------
A YEAR HAS PASSED SINCE
BIMMY AND JIMMY DEFEATED
THE SHADOW WARRIORS.
-----------------------------

Tout d'abord, je signale que les <00> correspondent � des espaces


mais les espaces normaux existent aussi et je n'ai pas compris
(pas vraiment cherch�) la diff�rence.

Nous avons appris pr�c�demment que la compression RLE commen�ait


toujours par un octet (skip).
Etant donn� que la premi�re lettre de notre texte est le "A" de
"A YEAR", on peut en d�duire que le "M" qui pr�c�de est notre skip.
Ici, la valeur hexad�cimal de "M" est 0x4D.

Pour notre exemple, Meradrin m'a appris que les 3 premiers bits du
skip indiquent si les prochains octets sont compress�s ou non.
Pour savoir cela, il a regard� le code ASM du jeu mais si vous ne
connaissez pas l'ASM (comme moi), la seule solution est de faire des
tests en modifiant les octets.

ATTENTION !! Pour ce cas pr�sent, les 3 premiers bits nous


renseignent sur les octets compress�s ou non mais pour un autre
jeu, cela peut �tre compl�tement diff�rent.

Donc, 0x4D en binaire donne : 0100 1101.


Les 3 premiers bits (010) nous indiquent que les prochains caract�res
ne sont pas compress�s.
Il nous reste 01101 que l'on transforme en d�cimal = 13.
On sait maintenant que les 13 prochains octets apr�s le "M" ne sont
pas compress�s.

Et c'est bien le cas :


A 1
<00> 2
Y 3
E 4
A 5
R 6
7
H 8
A 9
S 10
<00> 11
P 12
A 13

Les 2 octets suivants correspondent � l'octet de r�p�tition et


� l'octet � r�p�ter : <02>S
Ici 02 donne en binaire : 0000 0010
Donc les 3 premiers bits (000) nous indiquent que les donn�es sont
compress�es et le reste (00010) signifie que l'on doit r�p�ter 2 fois
la lettre "S", pour avoir le mot "PASSED".

L'octet qui suit, "H" (0x48 = 010 01000) est un nouveau skip de 8 octets
cette fois.
E 1
D 2
3
S 4
I 5
N 6
C 7
E 8

Puis on r�p�te 9 fois l'octet <00> qui correspond � des espaces et


ainsi de suite jusqu'� la fin du texte.

Par contre, je n'ai pas saisi la diff�rence entre l'octet de


r�p�tition <02> et <29>. Ca a l'air de ressembler � un multiplicateur
du nombre d'octets � r�p�ter.

---------------------------------------------------------------------
\ 5. Cr�dits et Contacts
\___________________________________________________________________

* Auteur et apprenti : BahaBulle - bahabulle@hotmail.com

* Explications : Meradrin - meradrin@hotmail.com

* Sites web : http://generation9.kanshima.net


http://finaltranslation.uhrft.org
* Forums : tous les romhackeurs et traducteurs s'amusent sur
http://forum.bessab.net
* Chans IRC : #generation_ix et #finaltranslation sur le serveur
irc.worldnet.net

Si vous avez des remarques et des suggestions � faire, n'h�sitez pas


� contacter l'auteur de ce tutoriel, BahaBulle. Meradrin pr�f�re
rester dans l'ombre et continuer � voler au secours du romhackeur
en d�tresse et du traducteur orphelin (car il n'a pas de romhackeur
assez comp�tent pour lui extraire les textes de son jeu favori).

---------------------------------------------------------------------
\ 6. Remerciements
\___________________________________________________________________

Je remercie bien �videmment Meradrin pour m'avoir expliqu�


la compression RLE.

Je remercie �galement les personnes qui ont r�pondu � mes questions


avant l'intervention de Meradrin : Oprhis, SOR et j'en passe ;)

---------------------------------------------------------------------
\ 7. L�galit�
\___________________________________________________________________

Ce tutoriel a �t� �crit par BahaBulle sur les explications


de Meradrin. Vous �tes libres de l'utiliser comme bon vous semble
mais nous ne pourrons �tre tenus responsables de quoi que ce soit
vis � vis de son utilisation. Nous demandons juste que vous
conserviez le fichier en l'�tat, sans rien y changer.

Ce tutoriel est GRATUIT et ne peut en aucun cas �tre vendu, vous ne


pouvez tirer aucun profit de ce fichier et de son contenu.
MERCI !!

Vous aimerez peut-être aussi