Arbitrary Code Execution

Version : O/A/C

C'est le plus puissant glitch de la 2G, qui vous permet d’exécuter du code. Vous pouvez ainsi simuler des codes action replay, d'autres glitches ou même programmer des logiciels, sans avoir besoin d'un quelconque appareil de triche !
Rédacteur : BUGLITCH, Krys3000
Tuteur : Haxel
Remerciements à notre partenaire Glitch City Labs et particulièrement à Torchickens

ATTENTION : Ce glitch ne fonctionne pas sur Visual Boy Advance, qui ne gère pas bien l'Echo RAM (utilisez BGB)

Cette page va vous apprendre à exécuter du code dans les version Or, Argent et Cristal. Si vous êtes familier avec d'autres glitches de ce type comme le 8F Code Execution vous avez une idée de la puissance de l'exécution de code. De la même manière, ce glitch vous permettra d'ordonner au jeu d'agir selon votre bon vouloir, c'est vous qui aurez la main. Avec ce glitch, vous n'avez aucune limite, vous avez un action replay puissance 10 entre vos mains. Argent, Pokémon, objets, badges, se téléporter d'endroits en endroits, rien n'est impossible !

Introduction : l'exécution de code sur O/A/C

Dans les jeux de première génération, l'exécution de code s'effectuait le plus souvent à l'aide d'un objet glitch. Dans la deuxième génération, comme vous le savez si vous avez lu notre liste de correspondance, il n'y a pas d'objet glitch, tous les slots inutilisés sont occupés par un placeholder appelé Teru-Sama, qui ne sert à rien...

Pourtant, dans la version anglaise du jeu, on peut exécuter du code à l'aide de la Boîte Jeton : c'est le Coin Case Glitch. Ce glitch très simple est dû a une erreur de l'équipe de traduction anglaise qui a oublié, juste pour cet item, de remplacer le marqueur de fin de phrase (celle qui indique le nombre de jetons) japonais par celui qui fonctionne sur les jeux anglais et européens. Cette erreur n'est donc une partie du jeu de base, et parce que les équipes de traduction des autres pays ont été plus rigoureuses, le glitch ne fonctionne pas dans les autres langues. Dommage !

Dans les versions non-japonaises du jeu, en dehors du Coin Case Glitch, il existe au moins 5 autres méthodes d'exécution de code. L'une d'elles, le Move 00 Type ACE, est également exclusif, en tout cas pour l'instant, aux version anglaises. Les 4 autres méthodes, disponibles dans les versions françaises, utilisent soit le recours direct à un Bad Clone obtenu avec le Bad Clone Trick, soit le recours à un autre glitch dépendant (le plus souvent) d'un Bad Clone (Item Shifting Glitch ou son dérivé le Infinite PC Items Trick). Nous allons réexpliquer tout ça pour chaque méthode, mais autant dire que si vous êtes allergiques aux Bad Clones, vous ne pourrez jamais exécuter du code !

Comment choisir sa méthode parmi celles présentées ci-dessous ? Tout d'abord, deux méthodes sont exclusives à Cristal : le Glitch Pokédex Mode ACE qui utilise l'Infinite PC Items Trick et le Pokédex, et le Bad Clone ACE, qui utilise simplement un Bad Clone ainsi qu'un bout de code issu du Mobile GB Adapter, l'accessoire qui permettait de connecter Cristal à un téléphone portable, uniquement disponible au Japon (mais dont le code a été conservé dans les versions européennes et américaines). La première de ces méthodes est longue à mettre en place, mais s'utilise rapidement après la première fois et surtout, elle est utilisable partout. La seconde nécessite moins de préparation mais ne peut pas s'utiliser partout... C'est à vous de choisir.
Concernant Or et Argent, utiliser le Wrong Pocket TM ACE est la meilleure idée : elle utilise l'Item Shifting Glitch (ou n'importe quelle autre méthode d'exécution de code) pour obtenir, dans la poche des Balls, une CT qui exécute du code. Vous pouvez aussi utiliser cette méthode sur Cristal, mais c'est beaucoup plus dur et nécessite de toute façon une autre méthode au préalable. La dernière méthode, exclusive à O/A, est toute nouvelle : c'est le Withdraw Smash ACE, une méthode de corruption de données qui s'utilise surtout pour le fun. Bref, notre conseil, c'est d'opter pour le Wrong Pocket TM ACE dans O/A sans hésiter, et pour Cristal, d'utiliser une seule fois le Bad Clone ACE pour mettre en place le Wrong Pocket TM ACE également !

Dans tous les cas, l'idée d'une bonne exécution de code, c'est de composer ses codes avec quelque chose de pratique : ça peut être les objets, comme dans la première génération, mais aussi les noms des boîtes, nouveauté de O/A/C, qui permettent donc d'écrire des codes plus rapidement. Attention toutefois, sur Cristal, ça n'est pas possible de composer un code fonctionnel avec les noms des boîtes ; on peut toutefois utiliser les Lettres données aux Pokémon pour ça, et nous prévoyons de vous faire des codes Lettre dès que possible.

Etape I : préparer une méthode d'exécution de code

Cliquez sur l'un des liens suivantes pour accéder à la sous-page correspondante et apprendre la technique. Il est possible de préparer son code (étape II) avant de préparer la méthode, si vous le souhaitez.

  • Le Wrong Pocket TM ACE (O/A/C), la meilleure méthode sur O/A (mais moins sur Cristal) qui exécute du code grâce à une CT placée dans la poche Balls.
  • Le Glitch Pokédex ACE (Cristal), une méthode exclusive à Cristal qui est laborieuse à mettre en place, mais plus permissive ensuite.
  • Le Bad Clone ACE (Cristal), une méthode exclusive à Cristal facile à préparer mais laborieuse à utiliser.
  • Le Withdraw Smash ACE (O/A) (BIENTOT DISPONIBLE), une méthode complexe qui corrompt certaines données et s'utilise surtout pour le fun.

Etape II : préparer le code voulu

Obtenir n'importe quelle CT/CS en quantité x255 (Code Boîte, O/A)

Allez au PC de Léo et utilisez CHANGER BOITE pour renommer la Boîte 1 en Ap09é@♀n' en replaçant @ par le caractère correspondant à la CT voulue dans le tableau suivant :
(espace) = CT02
A = CT03
B = CT04
C = CT05
D = CT06
E = CT07
F = CT08
G = CT09
H = CT10
I = CT11
J = CT12
K = CT13
L = CT14
M = CT15
N = CT16
O = CT17
P = CT18
Q = CT19
R = CT20
S = CT21
T = CT22
U = CT23
V = CT24
W = CT25
X = CT26
Y = CT27
Z = CT28
( = CT29
) = CT30
: = CT31
; = CT32
[ = CT33
] = CT34
a = CT35
b = CT36
c = CT37
d = CT38
e = CT39
f = CT40
g = CT41
h = CT42
i = CT43
j = CT44
k = CT45
l = CT46
m = CT47
n = CT48
o = CT49
p = CT50
q = CS01
r = CS02
s = CS03
t = CS04
u = CS05
v = CS06
w = CS07

Utilisez la CT17 depuis la mauvaise poche en vous assurant que le "Slide Pokémon" ainsi que Maraîstre avec RETOUR et la CT02 sont placés aux bons endroits. La CT/CS x255 apparaîtra dans la poche des CT/CS.

Augmenter/Diminuer la quantité d'un objet (Code Objets)

Utilisez le code "Obtenir n'importe quelle CT/CS en quantité x255" (ou le code "Obtenir n'importe quel objet" puis le clonage) pour obtenir la CT10 et la CT23 (CT26 sur Cristal), à moins de déjà les avoir dans les quantités mentionnées ci-dessous.
NOTE : La CT10 peut s'acheter.

Obtenez (à moins de déjà les avoir), puis stockez les objets suivants dans le PC, dans cet ordre :

  1. N'importe quel objet x(n'importe quelle quantité) (Réveil x3 sur Cristal)
  2. N'importe quel objet x(n'importe quelle quantité) (Anti-Para x3 sur Cristal)
  3. Eau Fraîche x44 (x7 sur Cristal)
  4. Poké Ball x38
  5. CT23 (CT26 sur Cristal) x52 (pour augmenter) ou x53 (pour diminuer)
  6. CT10 x(n'importe quelle quantité)
  7. N'importe quel objet x(n'importe quel quantité)
  8. N'importe quel objet x(n'importe quel quantité)
  9. N'importe quel objet x(n'importe quel quantité)
  10. N'importe quel objet x(n'importe quel quantité)
  11. L'objet qui doit changer x(n'importe quel quantité)
  12. N'importe quels autres objets en n'importe quelle quantité peuvent être placés à partir d'ici.

Puis, selon la méthode, utilisez la CT17/CT15 depuis la mauvaise poche (Wrong Pocket TM ACE), ouvrez le Pokédex (Glitch Pokédex ACE) ou suivez la procédure avec le PC (Bad Clone ACE), en vous assurant, si nécessaire à la méthode choisie, que le "Slide Pokémon" ainsi que le bon Maraîstre sont placés aux bons endroits. Le 11ème objet gagnera ou perdra alors une unité.
NOTE : Diminuer la quantité d'un objet est très utile quand sa quantité est de 1 ; utiliser le code deux fois amènera alors sa quantité à x255, et vous pourrez jeter autant d'unités que vous voudrez pour arriver à la quantité qui vous intéresse vraiment.

Obtenir n'importe quel objet (Code Objets)

Utilisez le code "Obtenir n'importe quelle CT/CS en quantité x255" (ou le duo de codes "Obtenir n'importe quel objet" et "Augmenter/Diminuer la quantité d'un objet") pour obtenir la CT10 et la CT23 (CT26 sur Cristal), à moins de déjà les avoir dans les quantités mentionnées ci-dessous.
NOTE : La CT10 peut s'acheter.

Utilisez la correspondance pour sélectionner l'objet que vous avez déjà ou pouvez facilement acheter/obtenir le plus proche possible (au-dessus ou en-dessous) de l'objet que vous voulez avoir. Obtenez cet objet sélectionné.

Obtenez (à moins de déjà les avoir), puis stockez les objets suivants dans le PC, dans cet ordre :

  1. N'importe quel objet x(n'importe quelle quantité) (Réveil x3 sur Cristal)
  2. N'importe quel objet x(n'importe quelle quantité) (Anti-Para x3 sur Cristal)
  3. Eau Fraîche x43 (x6 sur Cristal)
  4. Poké Ball x38
  5. CT23 (CT26 sur Cristal) x52 (si l'objet voulu est en-dessous de l'objet selectionné) ou x53 (s'il est au-dessus)
  6. CT10 x(n'importe quelle quantité)
  7. N'importe quel objet x(n'importe quel quantité)
  8. N'importe quel objet x(n'importe quel quantité)
  9. N'importe quel objet x(n'importe quel quantité)
  10. N'importe quel objet x(n'importe quel quantité)
  11. L'objet qui doit changer x(n'importe quel quantité)
  12. N'importe quels autres objets en n'importe quelle quantité peuvent être placés à partir d'ici.

Puis, selon la méthode, utilisez la CT17/CT15 depuis la mauvaise poche (Wrong Pocket TM ACE), ouvrez le Pokédex (Glitch Pokédex ACE) ou suivez la procédure avec le PC (Bad Clone ACE), en vous assurant, si nécessaire à la méthode choisie, que le "Slide Pokémon" ainsi que le bon Maraîstre sont placés aux bons endroits. Le 11ème objet deviendra alors celui qui est directement en-dessous ou au-dessus de lui dans la correspondance. Utilisez donc autant de fois le code que nécessaire pour atteindre l'objet voulu.

Editer la mémoire du jeu/Simuler un code action replay (Code Objets)

Si vous êtes habitués de nos pages et avez lu notre introduction à la glitchologie Pokémon (et il vaudrait mieux que ce soit le cas avant de continuer) vous êtes déjà familiers du concept d'adresse mémoire et de la façon dont les codes action replay fonctionnent. Pour rappel, ils sont composés d'une série de 8 chiffres hexadécimaux, 4 groupes de deux que l'on peut écrire de cette façon : 01XXYYZZ. Vous avez sans doute l'habitude du XX, qui représente l'IDH vous permettant de sélectionner la nature de ce que vous essayez d'obtenir avec un code (par exemple un Pokémon). Quant à YY et ZZ, il s'agit de l'adresse mémoire que le code va modifier (à l'envers, l'adresse est donc $ZZYY). Un code action replay n'est donc rien d'autre qu'une instruction simple demandant de placer une valeur dans une adresse mémoire. Avec l'exécution de code, vous pouvez changer la valeur de l'adresse de votre choix, ce qui revient à simuler les codes action replay ! Pour trouver le code (ou directement l'adresse) de votre choix, vous pouvez consulter notre section Action Replay 2G. Avec votre code, utilisez la calculatrice Windows pour convertir BB et CC en décimal et notez-en les valeurs. Puis, cherchez l'objet d'IDH ZZ dans notre correspondance.
NOTE : Certains codes, comme celui qui permet de rencontrer un Pokémon, ne peut pas être simulé de cette façon.

Utilisez le code "Obtenir n'importe quelle CT/CS en quantité x255" (ou le duo de codes "Obtenir n'importe quel objet" et "Augmenter/Diminuer la quantité d'un objet") pour obtenir la CT10 et la CT42, à moins de déjà les avoir dans les quantités mentionnées ci-dessous. Si l'objet d'IDH ZZ est aussi une CT/CS et vous ne l'avez pas, utilisez également le code pour cette CT/CS.
NOTE : La CT10 peut s'acheter.

Utilisez le code "Obtenir n'importe quel objet" pour obtenir un PP Plus, à moins d'en avoir déjà un (ou plus). Si l'objet d'IDH ZZ n'est pas une CT/CS et vous ne l'avez pas, utilisez également le code pour cet objet.

Si nécessaire, utilisez le code "Augmenter/Diminuer la quantité d'un objet" pour obtenir autant d'exemplaires de PP Plus, CT42 et de l'objet d'IDH ZZ que vous en aurez besoin pour l'exemplaire ci-dessous.

Stockez les objets suivants dans le PC, dans cet ordre :

  1. N'importe quel objet x(n'importe quelle quantité) (Réveil x3 sur Cristal)
  2. N'importe quel objet x(n'importe quelle quantité) (Anti-Para x3 sur Cristal)
  3. PP Plus x(conversion de XX en décimal)
  4. CT42 x(conversion de YY en décimal)
  5. L'objet d'IDH ZZ x3
  6. CT10 x(n'importe quelle quantité)
  7. N'importe quels autres objets en n'importe quelle quantité peuvent être placés à partir d'ici.

Puis, selon la méthode, utilisez la CT17/CT15 depuis la mauvaise poche (Wrong Pocket TM ACE), ouvrez le Pokédex (Glitch Pokédex ACE) ou suivez la procédure avec le PC (Bad Clone ACE), en vous assurant, si nécessaire à la méthode choisie, que le "Slide Pokémon" ainsi que le bon Maraîstre sont placés aux bons endroits pour simuler le code action replay.

Rendre chromatique le 6ème Pokémon de l'équipe (Code Objets)

Utilisez le code "Obtenir n'importe quelle CT/CS en quantité x255" (ou le duo de codes "Obtenir n'importe quel objet" et "Augmenter/Diminuer la quantité d'un objet") pour obtenir la CT10 et la CT28, à moins de déjà les avoir dans les quantités mentionnées ci-dessous.
NOTE : La CT10 peut s'acheter.

Utilisez le code "Obtenir n'importe quel objet" pour obtenir un Ruban à pois et une Poudre Métal, à moins d'en avoir déjà.
NOTE : Vous pouvez aussi échanger respectivement Rondoudou et Metamorph depuis R/B/J, ils tiendront alors ces objets.

Utilisez le code "Augmenter/Diminuer la quantité d'un objet" sur Ruban à pois et sur Poudre Métal pour leur donner une quantité de x119.

Obtenez (à moins de déjà les avoir), puis stockez les objets suivants dans le PC, dans cet ordre :

  1. N'importe quel objet x(n'importe quelle quantité) (Réveil x3 sur Cristal)
  2. N'importe quel objet x(n'importe quelle quantité) (Anti-Para x3 sur Cristal)
  3. Précision + x47 (x228 sur Cristal)
  4. CT28 (CT29 sur Cristal) x62
  5. Ruban à pois x119
  6. Poudre Métal x119
  7. CT10 x(n'importe quelle quantité)
  8. N'importe quels autres objets en n'importe quelle quantité peuvent être placés à partir d'ici.

Puis, selon la méthode, utilisez la CT17/CT15 depuis la mauvaise poche (Wrong Pocket TM ACE), ouvrez le Pokédex (Glitch Pokédex ACE) ou suivez la procédure avec le PC (Bad Clone ACE), en vous assurant, si nécessaire à la méthode choisie, que le "Slide Pokémon" ainsi que le bon Maraîstre sont placés aux bons endroits pour rendre le sixième Pokémon chromatique.

Activer l'évènement Celebi (Code Objets, Cristal)

Utilisez les codes "Obtenir n'importe quel objet" et "Augmenter/Diminuer la quantité d'un objet" pour obtenir la CT02, la CT10 et la CT27, à moins de déjà les avoir dans les quantités mentionnées ci-dessous.
NOTE : La CT02 et la CT10 peut s'acheter.

Utilisez le code "Obtenir n'importe quel objet" pour obtenir une PierrePlante, à moins d'en avoir déjà une (au moins).

Utilisez le code "Augmenter/Diminuer la quantité d'un objet" sur la PierrePlante pour lui donner une quantité de x4.

Obtenez (à moins de déjà les avoir), puis stockez les objets suivants dans le PC, dans cet ordre :

  1. Super Ball x62
  2. CT02 x38
  3. CT27 x46
  4. Charbon x45
  5. PierrePlante x04
  6. CT10 x(quantité quelconque)

Puis, selon la méthode, utilisez la CT15 depuis la mauvaise poche (Wrong Pocket TM ACE), ouvrez le Pokédex (Glitch Pokédex ACE) ou suivez la procédure avec le PC (Bad Clone ACE), en vous assurant, si nécessaire à la méthode choisie, que le "Slide Pokémon" ainsi que le bon Maraîstre sont placés aux bons endroits. Ce code active tout simplement l'événement Celebi du bois aux chênes : après l'avoir activé, allez voir Fargas qui vous rend une GSBall, et vous indique la direction du Bois aux Chênes. Vous pourrez donc vous rendre sur l'autel afin de capturer Celebi !
Dialogue Fargas Autel du Bois aux Chênes Combat Celebi

Rencontrer n'importe quel Pokémon (Code Boîte, O/A)

Allez au PC de Léo et utilisez CHANGER BOITE pour renommer les Boîtes 1 à 7 en l'un de ces codes. Pour choisir le bon code ainsi que le caractère qui doit remplacer @ dans le code, referez-vous au tableau plus bas.

CODE 1 :
Ap0Bu'U__
é/2p0Bu'r
é,2é02p_
0Bu'péJ9p
0(male)éK9p02
éL9p0(ID)éA
pA

CODE 2 :
Ap0Bu'U__
é02p0Bu'r
é12é32p_
0Bu'péJ9p
0(male)éK9p02
éL9p0(ID)u'_
éAApA

CODE 3 :
Ap0Bu'U__
é02p0Bu'r
é12é32p_
0Bu'péJ9p
0(male)éK9p02
éL9p0zu'(ID)
éAApA

CODE 4 :
Ap0Bu'U__
é02p0Bu'r
é12é32p_
0Bu'péJ9p
0(male)éK9p02
éL9p0Au'(ID)
éAApA

CODE 5 :
Ap0Bu'U__
é02p0Bu'r
é12é32p_
0Bu'péJ9p
0(male)éK9p02
éL9p0(male)u'(ID)
éAApA

IDH @ = Pokémon (code 1) Pokémon (code 2) Pokémon (code 3) Pokémon (code 4) Pokémon (code 5)
7F _ SCARABRUTE ????? (n°000) COLOSSINGE BULBIZARRE RHINOFEROS
80 A TAUROS BULBIZARRE FEROSINGE ????? (n°000) RHINOCORNE
81 B MAGICARPE HERBIZARRE AKWAKWAK ????? (n°255) SMOGOGO
82 C LEVIATOR FLORIZARRE PSYKOKWAK ????? (n°254) SMOGO
83 D LOKHLASS SALAMECHE PERSIAN OEUF EXCELANGUE
84 E METAMORPH REPTINCEL MIAOUSS ????? (n°253) TYGNON
85 F EVOLI DRACAUFEU TRIOPIKEUR CELEBI KICKLEE
86 G AQUALI CARAPUCE TAUPIQUEUR HO_OH OSSATUEUR
87 H VOLTALI CARABAFFE AEROMITE LUGIA OSSELAIT
88 I PYROLI TORTANK MIMITOSS TYRANOCIF NOADKOKO
89 J PORYGON CHENIPAN PARASECT YMPHECT NOEUNOEUF
8A K AMONITA CHRYSACIER PARAS EMBRYLEX ELECTRODE
8B L AMONISTAR PAPILLUSION RAFFLESIA SUICUNE VOLTORBE
8C M KABUTO ASPICOT ORTIDE ENTEI KRABBOSS
8D N KABUTOPS COCONFORT MYSTHERBE RAIKOU KRABBY
8E O PTERA DARDARGNAN NOSFERALTO LEUPHORIE HYPNOMADE
8F P RONFLEX ROUCOOL NOSFERAPTI ECREMEUH SOPORIFIK
90 Q ARTIKODIN ROUCOUPS GRODOUDOU MAGBY ONIX
91 R ELECTHOR ROUCARNAGE RONDOUDOU ELEKID ECTOPLASMA
92 S SULFURA RATTATA FEUNARD LIPPOUTI SPECTRUM
93 T MINIDRACO RATTATAC GOUPIX KAPOERA FANTOMINUS
94 U DRACO PIAFABEC MELODELFE DEBUGANT CRUSTABRI
95 V DRACOLOSSE RAPASDEPIC MELOFEE QUEULORIOR KOKIYAS
96 W MEWTWO ABO NIDOKING CERFROUSSE GROTADMORV
97 X MEW ARBOK NIDORINO PORYGON2 TADMORV
98 Y GERMIGNON PIKACHU NIDORAN_M DONPHAN LAMANTINE
99 Z MACRONIUM RAICHU NIDOQUEEN PHANPY OTARIA
9A ( MEGANIUM SABELETTE NIDORINA HYPOROI DODRIO
9B ) HERICENDRE SABLAIREAU NIDORAN_F DEMOLOSSE DODUO
9C : FEURISSON NIDORAN_F SABLAIREAU MALOSSE CANARTICHO
9D ; TYPHLOSION NIDORINA SABELETTE AIRMURE MAGNETON
9E [ KAIMINUS NIDOQUEEN RAICHU DEMANTA MAGNETI
9F ] CROCRODIL NIDORAN_M PIKACHU CADOIZO FLAGADOSS
A0 a ALIGATUEUR NIDORINO ARBOK OCTILLERY RAMOLOSS
A1 b FOUINETTE NIDOKING ABO REMORAID GALOPA
A2 c FOUINARD MELOFEE RAPASDEPIC CORAYON PONYTA
A3 d HOOTHOOT MELODELFE PIAFABEC COCHIGNON GROLEM
A4 e NOARFANG GOUPIX RATTATAC MARCACRIN GRAVALANCH
A5 f COXY FEUNARD RATTATA VOLCAROPOD RACAILLOU
A6 g COXYCLAQUE RONDOUDOU ROUCARNAGE LIMAGMA TENTACRUEL
A7 h MIMIGAL GRODOUDOU ROUCOUPS URSARING TENTACOOL
A8 i MIGALOS NOSFERAPTI ROUCOOL TEDDIURSA EMPIFLOR
A9 j NOSTENFER NOSFERALTO DARDARGNAN FARFURET BOUSTIFLOR
AA k LOUPIO MYSTHERBE COCONFORT SCARHINO CHETIFLOR
AB l LANTURN ORTIDE ASPICOT CARATROC MACKOGNEUR
AC m PICHU RAFFLESIA PAPILLUSION PAPILLUSION MACHOPEUR
AD n MELO PARAS CHRYSACIER QWILFISH MACHOC
AE o TOUDOUDOU PARASECT CHENIPAN GRANBULL ALAKAZAM
AF p TOGEPI MIMITOSS TORTANK SNUBBULL KADABRA
B0 q TOGETIC AEROMITE CARABAFFE STEELIX ABRA
B1 r NATU TAUPIQUEUR CARAPUCE SCORPLANE TARTARD
B2 s XATU TRIOPIKEUR DRACAUFEU INSOLOURDO TETARTE
B3 t WATTOUAT MIAOUSS REPTINCEL FORRETRESS PTITARD
B4 u LAINERGIE PERSIAN SALAMECHE POMDEPIK ARCANIN
B5 v PHARAMP PSYKOKWAK FLORIZARRE GIRAFARIG CANINOS
B6 w JOLIFLOR AKWAKWAK HERBIZARRE QULBUTOKE COLOSSINGE
B7 x MARILL FEROSINGE BULBIZARRE ZARBI FEROSINGE
B8 y AZUMARILL COLOSSINGE ????? (n°000) FEUVOREVE AKWAKWAK
B9 z SIMULARBRE CANINOS ????? (n°255) ROIGADA PSYKOKWAK
D8 m' TEDDIURSA GROTADMORV CADOIZO MIGALOS PERSIAN
D9 n' URSARING KOKIYAS OCTILLERY MIMIGAL MIAOUSS
DA p' LIMAGMA CRUSTABRI REMORAID COXYCLAQUE TRIOPIKEUR
DB s' VOLCAROPOD FANTOMINUS CORAYON COXY TAUPIQUEUR
DC 's MARCACRIN SPECTRUM COCHIGNON NOARFANG AEROMITE
DD t' COCHIGNON ECTOPLASMA MARCACRIN HOOTHOOT MIMITOSS
DE u' CORAYON ONIX VOLCAROPOD FOUINARD PARASECT
E1 Pk CADOIZO KRABBY TEDDIURSA FOUINETTE PARAS
E2 Mn DEMANTA KRABBOSS FARFURET ALIGATUEUR RAFFLESIA
E3 - AIRMURE VOLTORBE SCARHINO CROCRODIL ORTIDE
E6 ? HYPOROI NOADKOKO QWILFISH KAIMINUS MYSTHERBE
E7 ! PHANPY OSSELAIT GRANBULL TYPHLOSION NOSFERALTO
E8 . DONPHAN OSSATUEUR SNUBBULL FEURISSON NOSFERAPTI
E9 & PORYGON2 KICKLEE STEELIX HERICENDRE GRODOUDOU
EA é CERFROUSSE TYGNON SCORPLANE MEGANIUM RONDOUDOU
EF ELEKID RHINOFEROS QULBUTOKE MACRONIUM FEUNARD
F1 × ECREMEUH SAQUEDENEU FEUVOREVE GERMIGNON GOUPIX
F3 / RAIKOU HYPOCEAN CORNEBRE MEW MELODELFE
F4 , ENTEI HYPOTREMPE NOCTALI MEWTWO MELOFEE
F5 SUICUNE POISSIRENE MENTALI DRACOLOSSE NIDOKING
F6 0 EMBRYLEX POISSOROY MARAISTRE DRACO NIDORINO
F7 1 YMPHECT STARI AXOLOTO MINIDRACO NIDORAN_M
F8 2 TYRANOCIF STAROSS YANMA SULFURA NIDOQUEEN
F9 3 LUGIA M. MIME TOURNEGRIN ELECTHOR NIDORINA
FA 4 HO_OH INSECATEUR HELIATRONC ARTIKODIN NIDORAN_F
FB 5 CELEBI LIPPOUTOU CAPUMAIN RONFLEX SABLAIREAU
FC 6 ????? (n°253) ELEKTEK COTOVOL PTERA SABELETTE
FD 7 OEUF MAGMAR FLORAVOL KABUTOPS RAICHU
FE 8 ????? (n°254) LEVEINARD* GRANIVOL KABUTO PIKACHU
FF 9 ????? (n°255) KANGOUREX* TARPAUD AMONISTAR ARBOK
* = pour que le code donne le bon Pokémon, utiliser "N" (LEVEINARD) ou "M" (KANGOUREX) à la place de "_" en tant que dernière lettre de la boîte 6.

Utilisez la CT17 depuis la mauvaise poche en vous assurant que le "Slide Pokémon" ainsi que Maraîstre avec BLABLA DODO et la Protéine sont placés aux bons endroits pour remplacer tous les Pokémon sauvages par le Pokémon de votre choix jusqu'au prochain reset du jeu (indépendament du fait que vous sauvegardiez ou non).

Exécuter d'autres codes et en fabriquer soi-même

On ne peut pas non plus vous lister tous les codes du monde. Toutefois, un topic consacré à l'échanges de codes existe sur notre forum alors n'hésitez pas à y faire un tour ! Sinon, vous pouvez toujours apprendre à en faire en lisant nos explications techniques sur chacune des sous-pages de glitch, et vous n'aurez alors plus de limites !

Explications techniques : comment fabriquer son code

Comme on l'a dit, le jeu n'est pas prévu pour lancer des CT dans une autre poche, ce que vous faites avec l'Item Shifting Glitch. Ces CT se comportent alors comme les objets glitch de la 1G et interprètent certaines données comme du code à lire. Dans Cristal, seule la CT33 permet de lire du code dans une partie contrôlable de la mémoire, et en l'occurence, la troisième lettre du surnom du cinquième Pokémon de l'équipe adverse (c'est pourquoi nous l'avons abandonné au profit de la méthode avec la CT15 expliquée dans la sous-page du Wrong Pocket TM ACE). En revanche, dans O/A, le code lu par l'utilisation de la CT17 commence à partir de l'adresse mémoire $FA47, dans ce qu'on appelle l'Echo RAM. Délimitée entre les adresses $E000 et $FFFF, cette Echo RAM est en fait une copie mémoire de la WRAM, c'est-à-dire la section mémoire s'étalant de $C000 à $DFFF et qui stocke les données du jeu. L'adresse $FA47 est donc une copie de l'adresse $DA47, une adresse faisant partie des données du Pokémon 1, mais qui est inutilisée et donc toujours de valeur 00. Dans Cristal, les adresses situées au même endroit dans les données d'un Pokémon servent à enregistrer l'endroit où il a été capturé afin que la voyante d'Irisia puisse vous le rappeler. Il s'agit probablement d'une fonction prévue à l'origine pour O/A et qui a été laissée de côté, ce qui fait que cette adresse n'est pas utilisée.

Le Coin Case anglais fonctionne de la même façon, mais en lisant les données du troisième Pokémon au lieu du premier. Dans les deux cas, écrire un code utile à partir des données d'un Pokémon est absurde parce qu'il faudrait contrôler les précisément les stats, Stat Exp. et prier pour que les DVs sur lesquels on a absolument aucun contrôle ne viennent pas tout casser. Du coup, ce qu'il faut, c'est un moyen de rediriger vite fait la lecture vers une autre section de la WRAM sur laquelle on a un peu plus de contrôle. En l'occurence, soit les objets, comme en 1G, soit les noms des boîtes. Prenons le cas de la CT17 sur O/A en exemple pour le reste de cette explication, et jetons un oeil aux données lues par son utilisation. Vous pouvez trouver des informations sur les adresses liées aux Pokémon de l'équipe sur cette carte de la RAM en anglais (ISSOtm a commencé a en créer une également pour Cristal à ce lien).

Pokémon 1 (fin)
$DA47 et $DA48 = Données de capture
$DA49 = Niveau
$DA4A et $DA4B = Statut
$DA4C et $DA4D = PV
$DA4E et $DA4F = PV Max
$DA50 et $DA51 = Attaque
$DA52 et $DA53 = Défense
$DA54 et $DA55 = Vitesse
$DA56 et $DA57 = Def. Spé
$DA58 et $DA59 = Atq. Spé
Pokémon 2 (début)
$DA5A = Espèce
$DA5B = Objet tenu
$DA5C à $DA5F = Capacités

Toutes ces adresses contiennent une valeur en hexadécimal correspondant aux données du Pokémon. Par exemple, avec une attaque de 21, l'adresse $DA51 sera de 15. Il faut maintenant comprendre que lorsque le jeu exécute du code à partir d'un point, il interprète les valeurs hexadécimales lues comme des instructions appelées opcodes. Ces instructions sont les mêmes que sur R/B/J, et vous pourrez en retrouver le tableau à cette adresse. Par exemple, 41 correspond à la case à l'intersection entre la 5ème ligne et la deuxième colonne, c'est à dire à l'instruction "ld B,C".

Il existe plein de ressources sur le net pour apprendre la fonction de chaque opcode. Vous pouvez par exemple consulter l'introduction à la programmation Game Boy (en anglais) écrite par notre programmeur, ISSOtm, pour notre partenaire anglophone, Glitch City Labs, ou bien encore ce mini-guide. Ceci dit, revoyons ensemble les principaux opcodes.

  • nop (correspondant à l'hexadécimal 00) signifie no operation. Le jeu continue simplement de lire.
  • ld signifie load (charger), dans le sens qu'une variable est chargée avec ("devient") une valeur.
  • inc et dec commandent d'incrémenter et décrémenter la valeur d'une variable donnée.
  • add et sub signifient qu'une valeur donnée est ajoutée ou soustraite à la variable A (toujours).
  • jp signifie jump (saut). Cela permet de déplacer la lecture dans une autre partie de la WRAM. La destination peut être renseignée directement par l'utilisateur, ou préalablement inscrite dans une duo de variables, HL.
  • jr pour relative jump est également un saut, mais relatif. Il saute donc à une distance donnée de l'actuelle position de lecture de code.
  • ret pour return (retour) est surtout utilisée ici pour terminer le code et mettre fin à la lecture.

Tout d'abord, nous voulons sauter à $D61B (troisième objet stocké) ou $D8C0 (deuxième lettre de la boîte 1). Dans ce dernier cas, cela se traduit par "jp D8C0". Ca tombe bien, l'instruction codée par l'hexadécimal C3 commande un saut à l'adresse composée par les deux valeurs hexadécimales suivantes (à l'envers, car ces octets sont Big-endian ; pour plus d'information sur ce qu'on appelle l'endianness, voyez la page Wikipedia sur le sujet). Cela signifie que si le jeu lit C3 C0 D8, alors il sautera la lecture du code au nom de la boîte 1.

Il n'est pas facile d'inscrire cette séquence dans les données accessibles à la lecture du Pokémon 1, mais nous pourrions utiliser l'espèce (C3 correspond à Maraistre dans la correspondance), objet tenu (C0 correspond à la CT02) et première attaque du Pokémon 2 (D8 correspond à RETOUR) parce que ce n'est pas très dur à obtenir. Notre meilleure chance de succès est donc de s'assurer que le Pokémon 1 contient des valeurs hexadécimales correspondant à des opcodes "inoffensifs" qui ne vont pas sauter ailleurs dans la mémoire ou affecter des variables dont on a besoin, ce qui nous permet de "glisser" jusqu'à Maraistre : c'est pour cette raison que le premier Pokémon est appelé "Slide Pokémon" (Pokémon glissant en anglais). Le fonctionnement est exactement le même pour atteindre $D61B si ce n'est qu'on utilisera BLABLA DODO (IDH D6) et une Protéine (IDH 1B).

Faisons un petit détour pour expliquer ce qu'il se passe dans Cristal, d'abord avec la méthode de la CT15. Nous essayons d'exécuter par exemple le code "jp DCDF" ou "jp FCDF" puisque $DCDF est l'adresse contrôlant l'espèce du premier Pokémon de l'équipe. Nous modifions donc la partie de la mémoire exécutée par la CT15, à savoir de $DA10 à $DA12, en C3 DF FC. ce qui se traduit en opcodes par le sauf à l'adresse voulue ! Grâce à la CT50 (IDH F2) et à RETOUR (IDH D8), Maraîstre nous fait sauter en $D8F2 ce qui correspond au premier objet stocké. Sans objet (IDH 00) et avec DANSE-PLUIE (IDH F0) nous sautons par contre à $F000 ce qui est une copie de $D000, et on lit donc la première lettre de la dernière Lettre lue.

La méthode par Pokédex consiste à changer le mode du Pokédex (qui peut normalement être Nouveau Mode, Ancien Mode, Mode A à Z ou Mode Zarbi) pour un mode glitché normalement inaccessible, le mode d'IDH 09. Le mode du Pokédex est contrôlé par l'adresse $D959 dans Cristal, et peut se modifier pour y mettre une valeur invalide telle que la valeur 09 grâce à la poche Balls étendue obtenue par le Item Shifting Glitch, car elle correspond à la quantité de l'objet stocké 65 ; il suffit donc de placer à cet endroit un objet de quantité 9. Lorsqu'un Pokédex avec le mode 09 est ouvert, le jeu lit du code à partir de $FA20. Cette adresse est bien sûr une copie de $DA20, une adresse mémoire liée aux flags d'avancement du jeu, qu'on ne peut pas modifier normalement, mais qu'on peut modifier encore une fois avec la poche Balls, grâce aux IDH des objets 165 et 166 : la CT19 possède en effet l'IDH D2 et la CT29 l'IDH DD. Avec la quantité de 01 entre les deux, cela se traduit, en opcodes, par "jp NC,$DD01", un saut conditionné aux données du premier Pokémon de l'équipe, qui aura, dans notre cas, tout le temps lieu. La suite est similaire au TM Code Execution : le 'Slide Pokémon' permet de glisser vers le jump vers les objets ou le tampon de stockage des Lettres représenté par Maraîstre et ainsi, nous pourrons exécuter du code.

Si vous avez opté pour l'exécution de code par Bad Clone, c'est encore un peu différent. Comme vous le savez si vous avez lu notre page du Bad Clone Trick, les Bad Clones n'ont pas de nom terminé et dans Cristal, lorsque vous les visualisez dans le PC, la lecture du nom se poursuit sur les données qui suivent dans la mémoire (cela se traduit par l'affichage de nombreux "?"). Ceci dit, certains caractères sont utilisés par le jeu non pas pour écrire des noms, mais pour exécuter des fonctions : ce sont les caractères spéciaux. Le caractère d'IDH 15 est l'un d'eux, et est utilisé pour les fonctions liées au Mobile GB Adapter dont on parle dans l'introduction de cette page. Ceci dit, à cause d'un oubli de programmation, si le caractère 15 est suivi d'une adresse qui contient la valeur 00, le jeu va exécuter du code à l'adresse $CD52, une autre zone tampon qui contient des données de map. En suivant les pas indiqués dans l'astuce, vous modifiez donc les valeurs des adresses de ce tampon, et "inscrivez" une instruction ret un peu plus loin, à $CD74. Mais ici en réalité, contrairement à ce que vous faites avec vos codes, cela ne signifie pas la fin de la lecture : celle-ci est simplement déviée, pour des raisons techniques, à l'adresse se trouvant juste après la séquence 15 00.

L'adresse $D106 correspond à la position du curseur d'objets. Elle contient donc toujours l'IDH de l'objet sur lequel le curseur se trouve actuellement. $D107, elle, contient la position dans le sac de l'objet actuellement sélectionné. De fait,en visualisant (mais sans sélectionner) le Max Elixir (IDH 15) de l'inventaire, on inscrit 15 00, qui est ensuite lu en tant que partie de nom du Bad Clone et provoque donc l'exécution de code à partir de $CD52... qui saute alors à $D108. Or, cette zone est encore un autre tampon, cette fois contenant les données des Pokémon visualisés : $D108 contient l'IDH du dernier Pokémon affiché dans le PC, alors que $D10E contient l'IDH du dernier Pokémon dont nous avons vu le profil et $D110 sa première attaque. $D10F contient l'IDH de l'objet tenu par le dernier Pokémon visualisé par n'importe laquelle de ces méthodes. Similairement aux autres méthodes, si Maraîstre possède RETOUR et la CT50, la séquence de $D108 à $D110 ordonnera C3 XX XX XX XX XX C3 F2 D8. Si les trois dernières instructions correspondent bien à un "jp $D8F2", nous ne pourrons exécuter du code à partir des objets car le premier C3 nous enverrait ailleurs. En visualisant, mais sans ouvrir son profil, Piafabec, nous enlevons donc ce C3 sans toucher à celui se trouvant à $D10E - et l'objet de Maraistre n'a alors pas d'importance, puisqu'il est écrasé par celui de Piafabec.

Bien, nous avons sauté aux objets stockés ou aux noms des boîtes et sommes prêts à les lire. Pour comprendre pourquoi il est facile de simuler un code A.R. avec ce glitch, il faut redire qu'entrer un code de type AABBCCDD revient à demander au jeu de changer la valeur de l'adresse $DDCC (oui, c'est encore une question d'endianness) en BB. Examinons le code appelé par l'inventaire "générique" utilisé pour la simulation de code action replay.

L'IDH du PP Plus est 3E, celui de la CT42 est EA et celui de la CT10 est C9. N'oubliez pas, nous démarrons au troisième objet de l'inventaire mais l'adresse suivante correspond à sa quantité, et le quatrième objet ne vient qu'après :

$D61B	3E	ld a,d8

Ça devient subtil. Vous voyez le 2 qui apparaît sous l'opcode dans le tableau ? Il signifie que cette instruction prend 2 octets : Le d8 dans l'opcode doit être remplacé par la valeur de l'adresse suivante ($D61C, la quantité du troisième objet, ici XX). L'instruction se dit donc "ld a,XX" et la variable a prend la valeur XX. En conséquencce, $D61C n'est pas lue individuellement, car elle est comprise dans l'instruction précédente. On enchaîne.

$D61D	EA	ld (a16),a (3 octets)	L'instruction prend 3 octets, il va falloir considérer les deux adresses suivantes.

$D61E	"YY"	→			Comprise dans l'instruction suivante

$D61F	"ZZ"	→ ld (ZZYY),a		Les parenthèses signalent que ce n'est pas l'adresse $ZZYY qui change, mais la valeur affectée à cette adresse. Ici, la valeur affectée à $ZZYY devient a, c'est à dire XX. Mission accomplie, le code est actif !

$D620	03	inc bc			Augmente le duo composé par les variables b et c. On ne s'en sert pas ici, c'est juste un placeholder.
  
$D621	C9	ret			Fin de la lecture du code.

Super simple, n'est-ce pas ? Du coup on va faire un truc un peu plus dur pour apprendre à utiliser d'autres opcodes ; intéressons-nous aux codes faits maisons et particulièrement celui qui permet de transformer son 11ème objet dans O/A. L'adresse de cet objet est $D62B. Vous devriez être en mesure de comprendre maintenant que le code lu par le jeu dans ce cas est 2E 2B 05 26 D6 34 C9.

$D61D	2E 		ld l,d8 (2 octets)	L'instruction prend 2 octets, il va falloir considérer l'adresse suivante.
$D61E	2B		→ ld l,2B		La variable l devient 2B.
$D61F	05		dec b			La variable b est décrémentée. C'est toujours un placeholder.
$D620	26		ld h,d8 (2 octets)	Encore une fois, il faut considérer l'adresse suivante.
$D621	D6		→ ld h,D6		La variable h devient D6.
$D622	34		inc (hl)		La valeur de l'adresse hl, c'est-à-dire D62B, est incrémentée.
$D323	C9		ret			Fin de la lecture du code.

Faisons également un exemple sur Cristal. Si vous ne trouvez pas une adresse sur la carte de la RAM, sachez qu'il existe un désassemblage du jeu. C'est plus difficile à utiliser, mais vous pouvez utiliser la recherche pour chercher les adresses, notamment dans le fichier wram. Intéressons-nous à l'adresse $DA89, qui fait partie de la section des drapeaux d'avancement (event flags), et qui gère l'event de Célébi.

$D61B	04 		inc b				La variable b est décrémentée. Placeholder.
$D61C	3E		ld a,d8 (2 octets)
$D61D	C0		→ ld a,C0			La variable a devient C0.
$D61E	26		ld h,d8 (2 octets)
$D61F	DA		→ ld h,DA			La variable h devient DA.
$D620	2E		ld l,d8	(2 octets)
$D621	8A		→ ld l,8A			La variable l devient 8A.	
$D622	2D		dec l				La variable l devient 89.
$D623	22		ld (hl+),a			La valeur de l'adresse hl, c'est-à-dire DA89, devient a, c'est-à-dire C0. Puis, hl est incrémenté et devient DA8A, mais peu importe.
$D624	04 		inc b				La variable b est décrémentée. Placeholder.
$D625	C9		ret				Fin de la lecture du code.

La bonne valeur à entrer dans $DA89 pour que l'event soit actif a été récupérée d'un très vieux post d'un forum universitaire sur lequel un certain Xatron parlait du code action replay qui sert, normalement, à activer cet événement. Comme vous le savez, un octet s'écrit sous la forme d'un hexadécimal à deux chiffres mais traduit originellement un groupe de 8 chiffres binaires, chacun étant un bit qui peut être vide (0) ou plein (1) ; ainsi, 01 correspond à 00000001 et FF à 11111111. Manifestement, la programmation de l'event fait que lorsque le bit 7 (le dernier, puisque le premier est le bit 0) est plein, Fargas peut prendre la GS Ball du joueur. Pour que Fargas rende la GS Ball et que l’événement se poursuive, les deux derniers bits doivent être pleins. Cela correspond donc à 11000000, ce qui fait C0 en hexadécimal.

Ecrire des codes avec des objets c'est facile en théorie, parce que vous avez accès à quasiment tous les opcodes, moyennant parfois des placeholders. Toutefois, ça peut être pas pratique de réunir les objets en question. Ecrire des codes avec les noms des boîtes est plus rapide et plus facile, mais vous n'aurez pas accès à tous les opcodes parce que le premier caractère, l'espace, a un IDH de 7F (suivi par A, dont l'IDH est 80). C'est la raison pour laquelle les codes boîtes sont plus longs que les codes objets, parce qu'il faut spammer des add et des sub pour contourner l'impossibilité d'utiliser les ld à deux octets. Aussi, certains caractères sont exclusifs à un langage, ce qui veut dire que contrairement aux codes objets, il faut traduire les codes boîtes pour chaque langue ! C'est assez facile en italien et espagnol, assez difficile en français car il manque certains opcodes clés qui obligent parfois à tout réécrire, et impossible en allemand à cause de l'absence de ld à 3 octets.

On va pas entrer dans les détails pour les codes boîtes car cela nécessiterait beaucoup plus de leçons sur les opcodes, mais on peut tout de même prendre un exemple facile, le code qui permet de donner 255 CT/CS de son choix. Il n'y a qu'une adresse mémoire pour chaque CT/CS, car elles sont ordonnées dans le sac ; il y a donc en tout 57 adresses mémoires allant, dans O/A, de $D57E (CT01) à $D5AF (CT50) puis de $D5B0 (CS01) à $D5B6 (CS07). Si la valeur est égale à 0, alors nous n'avons pas la CT, si elle vaut quelque chose d'autre, alors nous avons cette quantité de cette CT. De fait, pour avoir 255 CT50, je dois simplement donner FF comme valeur à $D5AF. Dans le tableau plus haut, vous pouvez voir l'IDH de chaque lettre, qui à l'heure actuelle, n'est pas dans notre correspondance. Ici, cela donne à partir du deuxième caractère : AF F6 FF EA "XX" F5 D9

$D8C0	AF 		xor a

L'opcode xor est un "ou exclusif" entre a (toujours) et une variable. Sans expliquer la fonction mathématique, ici, on fait ce xor entre a et... lui-même ! Ca fait donc forcément 0. En quelque sorte, c'est un moyen détourné pour mettre la valeur de a à 00, même si on a pas accès à l'opcode ld.

$D8C1	F6		or d8 (2 octets)
$D8C2	FF		→ or FF

L'opcode or est un ou simple qui compare la variable a avec une valeur. Utilisée après un xor a qui remet cette variable à 00, elle revient finalement à faire un ld a,d8 avec cette valeur ! Donc, a est désormais égal à FF.

$D8C3	EA		ld (a16),a (3 octets)
$D8C4	"XX"		→ ld h,DA			
$D8C5	F5		ld (F5XX),a			La valeur de $F5XX devient FF. Gagné !
$D8C6	D9		reti			Dans ce cas, similaire à ret ; met fin à la lecture du code.	

C'est maintenant à vous de faire des codes. N'hésitez pas à demander de l'aide, nous pouvons toujours aller plus loin et l'exécution de code peut aussi s'utiliser pour programmer ! Votre quête de l'ACE est sur le point de commencer ! Un tout nouveau monde de rêves, d'aventures et de langage assembleur vous attend ! Dingue !


Page Précédente : Item Shifting Glitch
Page suivante : Experience Underflow Glitch