Sie sind auf Seite 1von 7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

Dplacer des textes dans une autre


bank en agrandissant
une rom SNES sans conaissances
ASM
Note : Ce tutorial va tre bas sur la rom "Dragon Ball Z - Super Saiya Densetsu
(J) (V1.1)".
Souvent, les banks o se trouvent le texte ne contiennent pas uniquement du
texte mais aussi les tables de pointeurs 16-bits, ainsi que du code pour le jeu.
Le but de cette manipulation est de dplacer la table de pointeurs et les textes
d'une bank donne dans une nouvelle bank vide ajoute la rom (en utilisant
"LunarExpander" pour agrandir la rom), ce qui va permettre d'utiliser tout
l'espace disponible dans cette nouvelle bank (ou presque, disons entre 95 et
99% de l'espace disponible, car il faut compter la place que va prendre la table
de pointeurs, qu'on dplace en mme temps).
Il nous faut connatre divers informations :
L'adresse de dbut et fin de la table de pointeurs (0x30000-0x302DB).
L'adresse de dbut et fin du texte (0x302DC-0x35108).
Tout d'abord, on lance donc "LunarExpand" pour agrandir la rom sans se casser
la tte le faire manuellement. La rom originale fait 1 Mo (8M bits), on va la
passer 1,5 Mo (12 Mbits), sachant qu'on pourra toujours l'agrandir de nouveau
plus tard si ncessaire.
On choisit donc "12 Mbit (1.5 MB)", on clique sur "Apply to Rom...", on choisit la
rom sur laquelle on veut effectuer la modification, et hop, la rom est agrandie.
On va ensuite dumper le script principal de faon classique, personnellement
j'utilise "Hareng-Tool", ce qui donne ceci dans mon cas comme ligne de
commande :
extraire("Dragon Ball Z - Super Saiya Densetsu (J) (V1.1).smc", "Dragon Ball Z Super Saiya Densetsu (J) (V1.1).tbl", "Dragon Ball Z - Super Saiya Densetsu (J)
(V1.1)_Script_Principal.txt", 0x302DC, 0x35108, 0x30000, 366, 2, "X+$8000",
little_endian)
Ce qui me donne un dump tout ce qu'il y a de plus classique, dont voici un
extrait :
[PT0001]
[Kame Sennin]
[nl]
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

1/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

[nl]
!
[Pause]
[Kame Sennin]
![nl]
!![End]
[PT0002]
[Bulma]
[nl]
!?[nl]
[nl]
!?[End]
[PT0003]
[Kulilin A]
[nl]

[Pause]
[Kulilin A]
![!!][End]
[PT0004]
[Kulilin A]
[nl]
!?
[Pause]
[Kulilin A]
[End]
[PT0005]
[Piccolo A]
[End]
Il faut ensuite une ligne de commande fonctionnelle pour rinsrer le dump en
question, ce qui donne ceci dans mon cas :
inserer("Dragon Ball Z - Super Saiya Densetsu (J) (V1.1).smc", "Dragon Ball Z Super Saiya Densetsu (J) (V1.1).tbl", "Dragon Ball Z - Super Saiya Densetsu (J)
(J) (V1.1)_Script_Principal.txt", 0x302DC, 0x35108, 0x30000, 366, 2,
"X+$8000", little_endian)
Ce que j'ai l'habitude de faire, pour tre sr que ma rinsertion fonctionne
parfaitement, c'est de rinsrer le script original dump sans modifications (cf la
ligne de commande au dessus) et ensuite de comparer la rom originale et la rom
dans laquelle j'ai rinsr le dump. Si la rinsertion fonctionne parfaitement, les
deux roms doivent toujours tre identique aprs la rinsertion du dump original.
Maintenant, comment dplacer la table de pointeurs et les textes ?
En fait, pour que le jeu puisse accder la table de pointeurs, et donc aux
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

2/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

textes, il faut bien qu'il sache o se trouve la table de pointeurs en question, et


pour cela, le jeu lit un pointeur. Sachant qu'il y a plusieurs tables de
pointeurs/textes dans diffrentes banks, il faut que le jeu connaisse l'adresse
exacte, et pour cela, il lit donc un pointeur 24-bits.
Ce pointeur 24-bits pointe sur le dbut de la table de pointeur, il faut donc le
trouver. Une fois trouv, il "suffira" de modifier les adresses dans la commande
de rinsertion pour rinsrer la table de pointeurs/les textes dans une nouvelle
bank (vide) avec "Hareng-Tool", puis de modifier ce pointeur 24-bits pour qu'il
pointe vers cette nouvelle bank.
Pour calculer facilement les pointeurs au format SNES (qui est diffrent du
format classique), j'utilise "LunarAdress".
Petite explication propos des diffrences entre les adresses SNES et celles que
l'on appelle "PC" (celles qu'on utilise dans un diteur hexadcimal, par exemple
"0x32DBC") :
La SNES ne reconnait pas l'adresse 0x32DBC. Pour "elle", cette adresse quivaut
0x06ADBC ("06" tant le n de bank et le reste tant l'adresse dans la bank en
question).
Pour utiliser "LunarAdress", rien de plus simple. Il suffit de cliquer sur "AutoDetect Type", de choisir la rom en question, et le logiciel choisira
automatiquement le bon mode. Vous entrez ensuite l'adresse PC (hexadcimal
dans le cadre en bas gauche, "03:2DBC" (vous pouvez effacer les deux points,
le logiciel n'en tient pas compte) et vous obtenez droite "06:ADBC").
Il faut donc, en premier lieu, trouver le pointeur 24-bits de la table de pointeurs
originale.
On connait l'adresse de dbut de la table de pointeurs, 0x30000, on demande
"LunarAdress" de faire la conversion en adresse SNES, ce qui donne "06:8000".
On sait que les pointeurs SNES sont en "little endian" donc il faut inverser notre
rsultat, ce qui donne : "0080:06" (je conserve les deux points dans ce tutorial
pour bien sparer l'adresse du n de bank mais en ralit, on s'en fiche).
Maintenant, le but du jeu est de chercher "008006", sachant que selon les jeux
(ou mme dans un mme jeu), on peut avoir le pointeur 24-bits en deux
morceaux, la partie adresse un endroit donn, et l'octet de la bank dans les
alentours,
On cherche donc chaque occurence de "008006" dans la rom. Pour vrifier si
c'est la bonne occurence, il y a une mthode simple.
La table de pointeurs est compose de pointeurs 16-bits (2 octets). Si l'on
remplace"008006" par"028006" et que l'on a trouv la bonne occurence,
le dialogue affich devrait tre diffrent (la modification ci-dessus indique au jeu
que la table de pointeurs comme 2 octets plus loin, ce qui signifie que tous les
textes vont tre dcals d'un pointeur, et donc le dialogue de base devrait soit
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

3/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

afficher un autre dialogue, soit ne rien afficher/bugger s'il s'avre que le dialogue
en question tait li au dernier pointeur, mais ce cas est plutt improbable.
Dans notre cas, il y a une probabilit sur 366 que ce soit le cas vu qu'il y a 366
pointeurs).
La premire occurence de "008006" se trouve 0x2B78E. On modifie en
"028006" et on vrifie dans le jeu si le dialogue choisi au dbut a chang (dans
mon cas, le premier dialogue de Bulma).
Le dialogue n'a pas chang, ce n'est donc pas la bonne adresse, je continue donc
ma recherche dans la rom.
L'occurence suivante de "008006" se trouve 0x38F1C. On modifie en "028006"
et on vrifie dans le jeu si le dialogue choisi au dbut a chang.
Oh, le dialogue a chang :-) Le portrait de Bulma s'est transform en portrait de
Krilin et le texte en lui-mme est galement diffrent. Cela signifie que c'est bien
le pointeur 24-bits de la table de pointeurs que l'on a trouv.
Maintenant, on va rinsrer notre dump (fait au dbut de ce tutorial) dans une
nouvelle bank vide.
La premire bank vide se trouvant dans la partie agrandie de la rom se trouve
0x100000. Comme la rom est une "low-rom", chaque bank fait 0x8000 et donc
elle se termine 0x107FFF. La bank suivante commence 0x108000 et se
termine 10FFFF. Celle qui suit commence 0x110000 et se termine
0x117FFF, etc...
(Note : Si votre rom est une "high-rom", il faut savoir que chaque bank d'une
rom "high-rom" fait 0x10000. La premire bank vide commencerait donc
0x100000 et se terminerait 0x10FFFF. La bank suivante commencerait
0x110000 et se terminerait 0x11FFFF. Celle qui suit commencerait 0x120000
et se terminerait 0x12FFFF, etc...)
Donc, je disais, on va rinsrer notre dump dans la premire (nouvelle) bank
vide, donc 0x100000.
On modifie notre ligne de commande d'insertion du dbut, en tenant compte du
changement de plusieurs adresses :
L'adresse de dbut de la table de pointeurs qui tait 0x30000 devient
0x100000 (dbut de la premire bank vide).
L'adresse de dbut du script principal qui tait 0x302DC devient 0x1002DC.
L'adresse de fin du script principal qui tait 0x35108 devient l'adresse de fin
de bank (vu qu'on veut utiliser l'espace libre disponible dans la bank
entire), ce qui donne donc 0x107FFF.
Voici donc la nouvelle ligne de commande pour l'insertion du dump du script
principal :
inserer("Dragon Ball Z - Super Saiya Densetsu (J) (V1.1).smc", "Dragon Ball Z Super Saiya Densetsu (J) (V1.1).tbl", "Dragon Ball Z - Super Saiya Densetsu (J)
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

4/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

(J) (V1.1)_Script_Principal.txt", 0x1002DC, 0x107FFF, 0x100000, 366, 2,


"X+$8000", little_endian)
(Note : La table de pointeurs originale dbutant 0x30000, il est facile de faire
la correspondance avec les nouvelles adresses. Cependant, si le dbut de la
table de pointeurs n'est pas un chiffre rond et ne correspond pas la base de
l'adresse nouvelle bank (ici 0x30000/0x100000), a peut vite tre galre donc il
y a un petit truc. Si vous convertissez "2DC" de 0x1002DC en dcimal, cela vous
donne "732", qui divis par deux vous donne "366", ce qui coincide videmment
avec le nombre de pointeurs. Pour trouver la nouvelle adresse de dbut du texte
dans votre nouvelle bank, il suffit donc de prendre le nombre de pointeurs de la
table de pointeurs, "366", le multiplier par 2 (pointeurs 16-bits, 2 octets par
pointeur), ce qui donne "732" puis de le convertir en hxadcimal, ce qui donne
"2DC". Il suffit ensuite de prendre l'adresse de dbut de la nouvelle bank (qui
sera galement l'adresse de dbut de la table de pointeurs dplace), ici
0x100000 et d'y ajouter "2DC", ce qui donne "0x1002DC").
(Note 2 : Selon le calcul des pointeurs, il est possible que le "X+$8000" doive
tre modifi. Pour la bank 0x100000, il n'y a pas besoin, c'est facile voir, les
pointeurs sont de la forme xx82xx83 etc... Si par contre, par exemple, votre
formule de base est "X+$0" et que les pointeurs deviennent de la forme
xx02XX03, il faudra modifier le "X+$0" en "X+$8000" (mme si la formule avec
"X+$0" fonctionne sur la bank original). Le jeu tant une "low-rom", le deuxime
octet des pointeurs (qui est le premier en l'inversant, "little endian) ne peut pas
tre en dessous de "80" vu qu'une bank de "low-rom" commence "00:8000"
(en adresse SNES).
Une fois le dump rinsr ce qui rinsre donc la table de pointeurs et le texte
dans la nouvelle bank vide, 0x100000, il reste modifier le pointeur 24-bits de
la table de pointeurs.
(Note : Petite astuce qui permet d'tre sr que vos modifications sont
fonctionnelles et que le jeu n'utilise plus l'ancienne table de pointeurs/les anciens
textes : Effacer les donnes de la rom compris entre 0x30000 et 0x35108
(remplacer tous les octets par des "00". De cette faon, vous effacez l'ancienne
table des pointeurs/les anciens textes et vous serez srs que si, suite vos
modifications, le texte est fonctionnel dans le jeu, c'est que le jeu utilise bien la
table de pointeurs/les textes dplacs dans la nouvelle bank).
Il faut donc calculer le pointeur 24-bits de la nouvelle table de pointeurs. Elle
commence "0x100000", ce qui donne "20:8000" en adresse SNES. Il faut
videmment inverser cette adresse ("little endian") ce qui donne : "0080:20".
On retourne donc 0x38F1C et on remplace "028006" (vu qu'on avait modifi
"008006" en "028006") par "008020".
Bingo, le texte original de Bulma s'affiche de nouveau :-)
Vous avez donc dplac avec succs la table de pointeurs/le script principal dans
une nouvelle bank, ce qui vous octroie "12023 octets" supplmentaire pour la
traduction du script principal (ce qui quivaut 60% d'espace libre en plus). Sur
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

5/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

les textes annexes, le gain est bien plus spectaculaie, respectivement "245%",
"448%", "2655%" et "3097%" par banks diffrentes contenant du texte annexe.
Je vais rapidement aborder le cas du pointeur 24-bits en deux morceaux, mais
sans trop dtailler, c'est quasiment la mme mthode que celle dcrite juste
avant.
Les noms de personnages/ennemis et certains messages de combat sont dans
une autre bank, et il y a aussi une table de pointeurs classique, l'adresse
0x12B66, ce qui donne "02:AB66" en adresse SNES, et en inversant ("little
endian") "66AB:02".
Tout d'abord, on dumpe les textes de la bank en question avec "Hareng-Tool"
dans notre cas.
Cependant, rechercher "66AB02" ne donne aucun rsultat dans la rom.
Le truc est alors de chercher uniquement la partie relative l'adresse dans la
bank, donc ici "66AB", et de refaire la mme mthode, dcaler tous les
pointeurs, ce qui donne "68AB.
On recherche donc chaque "66AB" et on remplace par "68AB", puis on teste
dans le jeu, jusqu' ce que l'un des messages de cette bank change dans le jeu.
Ici, on est un peu chanceux car la premire occurence de "66AB", 0xBC18 est
la bonne. En la remplaant par "68AB", a modifie bien des textes (dans notre
cas, un nom de personnage).
Il ne reste plus qu' trouver l'octet de la bank, ce qui est un peu plus
"compliqu" (mais pas tant que a).
On va directement rinsrer le dump fait prcdemment dans une nouvelle bank
vide, ici "0x108000" pour l'adresse de la nouvelle table de pointeurs, "0x10FFFF"
pour l'adresse de fin des textes, et pour l'adresse de dbut des textes, utilisez la
mthode que j'ai expliqu plus haut (nombre de pointeurs x2, converti en
hexadcimal et additionn l'adresse de la nouvelle table de pointeurs).
Ensuite, effacez la table de pointeurs/le texte original (ici, entre 0x12B66 et
0x12E9A) contenu dans la rom. Comme expliqu dans le premier exemple, a
permettra lors des tests d'tre sr que vous avez trouv (ou pas) l'octet de la
bank.
Tant qu'on y est, on peut dj modifier la partie "adresse" du pointeur 24-bits (
0xBC18), donc la nouvelle table de pointeurs se trouve 0x108000, ce qui
donne "21:8000" en adresse SNES et en inversant ("little endian") "0080:21".
On remplace donc "66AB" par "0080" 0xBC18.
Donc, pour finir, on recherche toujours l'octet de la bank pour le modifier.
L'adresse de la table de pointeurs originale tait 0x12B66, ce qui donne
"02:AB66" en adrese SNES. L'octet de la bank originale est donc "02". On va
donc chercher aux alentours (en gnral, avant le "66AB) et tester de remplacer
http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

6/7

31/12/2014

Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM

les "02" que l'on trouvera par "21" (l'octet de la nouvelle bank). Si le texte
apparat, bingo, c'est la bonne adresse, sinon on remet le "02" et on teste le
prcdent, etc...
Il y a un "02" en 0xBC10, on le remplace en "21", et on teste dans le jeu. Non,
le texte est toujours bousill, donc ce n'est pas le bon. On remet le "02" et on
cherche un autre "02" encore avant.
Il y a un autre "02" en "0xBC0E". On le remplace en "21" et on reteste dans le
jeu. Oh, le texte original s'affiche de nouveau correctement, c'est donc bien
l'octet de la bank que l'on recherchait.
(Note : L'octet de la bank aurait aussi pu tre aprs le "66AB". Cependant, il
n'est jamais trs loin de l'adresse en question, donc le plus rapide pour
commencer est de se limiter 5 occurences avant et aprs l'adresse (ici le
"66AB") et si vous ne trouvez rien de concluant, largissez 10, puis 15, etc...
jusqu' trouver le bon).
Nos table de pointeurs/textes sont donc dplacs et fonctionnels, mme si dans
ce cas le pointeur 24-bits n'tait pas en un bloc.
La technique explique dans ce tutorial a des limites. Elle ne sert rien si le jeu
que vous dsirez traduire contient dj des banks entirement remplis de texte
(si vous avez une bank o il n'y a que les pointeurs et le texte, vous aurez beau
changer de bank, vous ne gagnerez pas de place). Dans ce cas, il faut passer par
l'ASM et programmer une routine de pointeurs 24-bits pour pouvoir dispatcher le
texte dans diffrentes banks.
Elle ne fonctionnera pas non plus si le jeu a des donnes compresses, et si le
pointeur 24-bits (ou tout du moins, l'octet de la bank) se trouve dans ces
donnes compresses, sauf si videmment vous avez de quoi
dcompresser/recompresser les donnes en question (c'est visiblement le cas de
"Chrono Trigger").
(Note : Si cette technique ne fonctionne pas, il se peut que, parfois, un numro
de bank puisse tre utilis pour plusieurs donnes. Donc si ne on dplace qu'une
seule donne et qu'on modifie le numro de bank, les autres donnes ne
fonctionneront plus).
Ecrit par Hiei- (scripts-elysion@hiei-tf.fr) le 31 Mai 2012 pour la T.R.A.F.
(http://traf.romhack.org).
Valid par BahaBulle le 31 Mai 2012.

http://www.hiei-tf.fr/tutoriels-romhack/tutoriel_expansion/

7/7