Dplacer des textes dans une autre bank en agrandissant une rom SNES sans conaissances ASM
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
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
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