Les Pointeurs SNES par Jes


Sommaire

1)
Un pointeur, c'est quoi? A quoi ça sert?
2)
Line Break, Section Break, Message Break
3)
Structure de la rom
4)
Les pointers proprement dits
   A) Repérage et modification
   B) Les pointers de la bank
5)
Remerciements & Derniers commentaires



Préface

Cette faq vous sera certainement inutile si vous avez déjà lu et compris la faq d’Anus Pee.
En effet le contenu en est pratiquement le même !
Si je l’ai réalisée, c’est pour tous ceux qui seraient encore dans le brouillard.
Si néanmoins certains points vous restent encore obscures, envoyer moi un
mail.



1) Un pointeur, c’est quoi, à quoi ça sert?

Un pointer indique ou commence une phrase et ou elle termine, il « pointe ».
Pour mieux comprendre, prenez cet exemple simple de la vie quotidienne :
Lorsque vous êtes sur la route, des panneaux indicateurs vous indiquent souvent le chemin, ils vous « pointent » la route à suivre ; les pointers font la même chose ! Ils indiquent précisément dans la rom où se trouve la phrase, c’est donc une
adresse hexadécimale.

C’est bien beau tout ça, mais en quoi les pointers vont nous servir ?
Lorsque vous traduirez, vous aurez immanquablement des phrases plus courtes ou plus longues que dans la version original, et vous vous direz tout de suite « je vais utilisé les espaces que j’ai gagné avec les phrases plus courtes pour pouvoir traduire des phrases plus longues ». Erreur : si on fait comme cela, les pointers ne correspondront plus, exemple :
(Les lettres en
rouges correspondent aux pointers)

VERY EASY.HARD.MEDIUM

En traduisant :

TRES FACILE.DUR.MOYEN

Vous comprenez maintenant ? Les pointers ne sont plus correctement réglés, voilà ce que ça va donner dans le jeu :

TRES FACILE apparaîtra correctement puisque le pointer correspond bien au début de la phrase.
DUR s’affichera mal ! En effet comme on le voit au-dessus, le pointer pointera E.
Quant à MOYEN, le jeu plantera ( ou alors n’affichera rien ), car le pointer pointe un Message break ( voir plus bas ).

En corrigeant le pointers de cette façon :

TRES FACILE.DUR.MOYEN

Le texte sera parfaitement bien affiché.



2) Line break, Section break, Message break

Avant toute chose, il faut que vous compreniez les termes suivants:

- [
Line Break], est une valeur hexadécimale ( par ex: 02) qui dit au jeu « va à la ligne » .
( et qui quelques fois, réalise un retrait dans la phrase suivante )
Pour ne pas que le texte sorte du cadre.
Exemple :

Le texte dépasse du cadre, on va donc mettre un Line Break:

- [ Section Break], c'est une valeur hexadécimale ( par ex: 04) qui affichera un nouveau cadre texte vide après que le joueur ait appuyé sur une touche.
Egalement pour ne pas que le texte sorte du cadre !
Exemple:

Je suis sorti du cadre, j'ai mis 4 lignes dans le cadre alors qu'il ne peut y en avoir que 3 au maximum, il faut donc mettre un Section break:

(il y a en général une flèche qui clignote en bas du texte, pour montrer au joueur qu'il y a encore du texte après ... ) Bon ensuite on appuie sur un bouton et ... Magie!

- [ Message Break], c'est une valeur hexadécimale ( par ex: 00) qui dit au jeu
« Fin du message, efface le cadre de texte »
et le scénario continue ...

Si on édite la rom, on obtient :

Debout guerrier,<$02>le désastre a frappé.<$04>Le village est détruit<$00>



3) Structure de la rom

Abordons une dernière chose avant de regarder aux pointers : la structure d’une rom SNES.

 Tout d’abord, commençons par l’[ header].

L’header est une tout petite partie de la rom se trouvant au début. Cette portion a été ajoutée lorsque la rom a été dumpée ( donc inexistante sur la cartouche ), et elle contient des informations utiles à l’émulateur.
Sa taille est toujours la même : 200hex bytes. Ce nombre est important, il reviendra souvent dans des calculs divers. L’header ressemble à ceci :

C000000000000000AABB040000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000

N.B. : Toutes les roms n’ont pas toujours d’header.

Le restant de la rom est découpé en [ bank] :

Une bank est un morceau de la rom, une partie, qui contient du code, du texte, des graphiques, des sons ...
Dans une
Low-rom, une bank est composée de 8000hex bytes, et dans une High-rom de 10000hex bytes....
Pour savoir s’il s’agit d'une
Low-rom ou une High-rom , on peut utiliser des programmes spécialisés, comme Ucon, ou, plus simplement, recourir à SNES9X qui l’affiche dès qu’on lance le jeu.

En simplifié, la structure d’une rom SNES se résume à ceci :

- Pour une Low-rom :
Header [0-200] – 1
ère bank [200-81FF] – 2ème bank [8200-101FF] – etc…

Pour une High-rom:
Header [0-200] – 1
ère bank [200-101FF] – 2ème bank [10200-201FF] – etc…



4) Les pointers proprement dits
  A) Repérage et modification

Passons au plus important: les pointers.
Les pointers pointent les phrases après chaque message break.

Le $ devant un nombre signifie que c'est une valeur hexadécimale.

Regardons d’abords de quel type de rom il s’agit. ( Low-rom ou High-rom, voir aussi chapitre 2 )

- Commençons par le mode de calcul [ Low-rom] :
1)Prendre l'adresse hexadécimale d'une phrase                             ex : $63212
2)Soustraire $200, l’header                                                                 $63012
3)Ajouter $8000                                                                                 $6B012
4)Séparer en paquet de 2                                                                   $06, $B0, $12
5)Inverser                                                                                         $12, $B0, $06
6)Maintenant dans la rom, on prend les 2 premières valeurs                  $12B0
et on les cherche dans la rom.

On trouvera en général plus d'une solution, et pour savoir s'il s’agit du pointer, on peut recourir à 2 méthodes :
- Soit changer la valeur, par ex. en ajoutant $1 ( ce qui donne $13B0 ) et regarder dans le jeu, si la phrase est bien décalé d'une lettre ( ex: Salut devient alut )
- Ou alors, si la phrase se trouve dans un bloc de texte, il y a des chances pour que les pointers se trouvent dans une table de pointers. Cette table est facilement reconnaissable, une valeur hexadécimale revient souvent:
Par ex. (0030 1030 1230 5830 7F30 5831 6F31 FF31 0232 1032 3432 5832 FD32... )
Certaines valeurs se répètent: 30 31 et 32, il y a dans ce cas, 99% de chance pour que ce soit une table.
( la table est souvent au-dessus du bloc de texte )

- Les [ High-rom] maintenant :
1)Prendre l'adresse hexadécimale de la phrase                             ex : $1242FD
2)Soustraire $200                                                                              $1240FD
3)Ajouter $C00000                                                                            $D240FD
4)Séparer la valeur obtenue en paquet de 2                                         $D2, $40, $FD
5)Inverser                                                                                         $FD, $40, $D2
6)Prendre les 2 premières valeurs                                                       $FD40
et comme au-dessus chercher dans la rom.

  B) Les pointers de la bank

-Pourquoi ne prendre que 2 valeurs ?

Il faut savoir que les pointers sont codés soit sur 2 octets ( 16bits ) soit sur 3 octets ( 24bits ).

Les pointers 24 bits sont vraiment les meilleurs, car ils permettent de changer le texte ou on veut dans la rom, ( vraiment partout ) malheureusement ils sont rares.

Je reviens vers les pointers 16bits :
Le 3ème octet, celui que l'on a pas dans les pointers 16bits, c'est le numéro de la bank, or comme je l'ai dit en chapitre 2, une bank est assez grande, donc le 3ème octet sera quasiment toujours le même,
prenons un exemple :
Voici une table de pointers 24bits

0000F2 8100F2 E800F2 6401F2 D701F2 0B02F2 8E02F2 0903F2 8003F2 FD03F2
6A04F2 B804F2 E304F2 2705F2 7505F2 A605F2 0B06F2 2E06F2 6206F2 8906F2
9506F2 AB06F2 0A07F2 8107F2 FF07F2 7E08F2 B908F2 0E09F2 3309F2 8609F2
9B09F2 F809F2 190AF2 6A0AF2 770AF2 890AF2 000BF2 1B0BF2 090CF2 7B0CF2
0C0DF2 5A0DF2 C90DF2 2E0EF2 950EF2 BA0FF2 EE0FF 26C10F2 C610F2 DE10F2

On remarque que la bank ( $F2 ) est toujours la même, et c’est pour libérer de l’espace qu’on va remplacer ces pointers par des pointers moins volumineux, qui sont codé sur 2 octets et non plus 3. ( A cette époque, on essayait d’avoir un jeu prenant le moins de place possible car il serait plus cher à produire sur cartouche. )

 0000 8100 E800 6401 D701 0B02 8E02 0903 8003 FD03 6A04 B804 E304 2705 7505
A605 0B06 2E06 6206 8906 9506 AB06 0A07 8107 FF07 7E08 B908 0E09 3309 8609
9B09 F809 190A 6A0A 770A 890A 000B 1B0B 090C 7B0C 0C0D 5A0D C90D 2E0E
950E BA0F EE0F 26C1 C610

On gagne de la place.
D'accord, mais si on fait comme ça, le pointer est incomplet. En fait c’est une routine ASM qui le complétera automatiquement.

Et donc comme ça le problème est résolu.

Maintenant pour déplacer le texte dans une autre bank, il faudra changer son octet , et il n'est pas toujours très facile à découvrir, il faut parfois recourir à l'ASM, mais voici la formule pour le trouver :

On prend l'adresse de la première phrase d'un bloc de texte,

Ensuite si c'est une [ High-rom ], on calcule le pointer normalement ( donc -$200 +$C00000, séparer, inverser, … ) Mais cette fois il faut garder les 3 octets, les inverser, ( par ex $A88000 donne $0080A8 ), et on recherche cette valeur dans la rom !!

Bon mais pour les [ Low-rom ], après avoir soustrait l’header ( $200 ), il faut "convertir" l'adresse, dans la faq d'anus sur TRAF, il y a la charte des Low-rom, utilisez-la pour convertir. Après, il suffit d'inverser l'adresse et de rechercher dans la rom.
Je prends un exemple : on a du texte à l’adresse $80816, je retranche $200, ce qui donne $80616, je convertis, $108616, je sépare, $10, $86, $16, et enfin j’inverse : $168610

N.B. : Les pointers seront généralement précédés de BF. Donc 0080A8 donnerait BF0080A8

Si vous êtes trop fainéant pour calculer les pointers, vous pouvez prendre un programme qui le fait automatiquement ( comme Vbapointer de Lag, disponible sur son site ) ou encore créé son propre logiciel, comme un grand.

Tout ça c'est très théorique, le tout est d'avoir quelques expériences pour bien les maîtriser, car la théorie ne vaut jamais la pratique : on se rend compte beaucoup mieux "sur le terrain". Il est tout à fait possible aussi qu'une rom n'utilise pas les pointers "courants", c'est comme dans tout, il y a des exceptions !



5) Remerciements & Derniers commentaires:

Je voudrais remercier Minh pour ses conseils avisés sur l’écriture de cette faq, il en a lui-même écrit une très complète sur les pointers NES dont je me suis inspiré pour écrire la 2ème partie du chapitre 1. Remerciement aussi à Readiosys Fisher qui m’a également donné quelques conseils.

Voilà c’est terminé !
Mais je vous conseille aussi de (re)lire les autres docs de
TRAF. Ca pourrait bien vous être utile.
Si vous voulez modifier ce document, merci de m’en prévenir avant.

Vos commentaires et critiques seront les bienvenus sur Jes


Retour