Jump to content

Guides:SRAM Glitch ACE Setups (Yellow): Difference between revisions

m
no edit summary
mNo edit summary
mNo edit summary
 
(20 intermediate revisions by the same user not shown)
Line 17:
# Using an exploit known as "Map Script ACE", set up a method to quickly pick up an unlimited amount of Eevees
# Write code by repeatedly picking up and nicknaming Eevees. This will be used to build a program that allows you to more easily write arbitrary code.
 
===Note: setting up ACE on an existing save===
 
While this guide is built with new saves in mind, the method itself is inherently compatible with existing saves that fulfill the following criteria:
* Must have reached Celadon City.
* Must be able to use Fly and have a party pokémon that has learned Fly.
* Must have set up the [[Expanded item pack]]. It is recommended to deposit all important items to the PC prior to setting up the expanded item pack.
 
Once you have all of these requirements, you can continue the guide from step 4 onward.
 
==Step 1: Starting a new game and setting up SRAM glitch==
Line 199 ⟶ 208:
After this item code, head to the room where you can pick up the gift Eevee. '''Do not pick up this Eevee yet''', make sure to save before continuing.
 
===Note: setting up ACE on an existing save===
===A small note regarding Eevee's room===
 
Before heading to the room where you can pick up the Gift Eevee, make sure to do the following:
* Full up your party with 6 pokémon, to ensure that newly picked up Pokémon will be sent to the PC.
* Change the active box to an empty box.
* '''Only if you have already picked up the gift Eevee in the past''', catch any pokémon, nickname it so that it matches the name shown below, then send it to the currently empty box.
 
{| class="wikitable"
! Nickname (FR/IT/SP) !! Nickname (DE)
|-
![[File:InfiniteEeveeINTY.png]]!![[File:InfiniteEeveeDEY.png]]
|}
 
===Note: unterminated name items in Eevee's room===
 
Within this room, no safe spots exist that allow unterminated name items to be safely handled. Please make sure to not press a or select on unterminated items while in this room.
Line 232 ⟶ 254:
|}
 
* Pick up an Eevee and nickname it so that its name matches the above languagespecific screenshots on the left. It will be sent to the current active box. '''Previously existing saves that have already picked up Eevee in the past must skip this step.'''
* Open the item bag. Swap the X Accuracy x243 with the contents of item slot #41, which is highlighted on the below screenshots. This will activate Map Script ACE
* Close the start menu. If everything went all right, Eevee's poké ball will have reappeared.
Line 251 ⟶ 273:
===Setting up 4F to execute item codes===
 
Next, we'll be entering a list of fivethree nicknames that gives us the glitch item named "4F" and the necessary bootstrap. This ensures that using 4F will activate the item code.
 
{| class="wikitable"
Line 264 ⟶ 286:
* Open the item bag. Swap the original contents of item slot #41 with the X Accuracy x243. This will deactivate Map Script ACE.
* Finally, verify that 4F works by using it. If the game doesn't crash, 4F was set up correctly.
 
'''Note: due to item layouts and translation differences between languages, 4F goes by different item names across multiple languages. '''
* '''French: 3EME ETAGE'''
* '''German: S3'''
* '''Italian: 3°P'''
* '''Spanish: P3'''
 
{| class="wikitable"
Line 279 ⟶ 307:
===Setting up the Nickname Writer===
 
* Next, we'll be entering a list of fourteenthirteen nicknames. This will form a small program that, when activated using 4F, will allow us to easily write large amount of arbitrary code using the nickname screen. For the Italian version, please ensure to pick the correct list of codes for your language.
 
{| class="wikitable"
Line 291 ⟶ 319:
 
* Pick up Eevees and enter the nicknames in the above screenshot one by one. '''The nicknames from this list needs to be entered in this exact order from the top to the bottom.'''
* Once all nicknames have been entered, look at your trainer card, then use 4F. This should open a screen in which you're asked to enter a pokémon's nickname
* Exit the room and head to the pokémon center. We'll be testing out the Nickname writer.
* Once you're at the pokémon center, use 4F. This should open a screen in which you're asked to enter a pokémon's nickname
* For now, press START to end writing the nickname. This should display the main menu, a number should be written on screen.
* Press SELECT to exit the Nickname Writer safely.
 
===Using the nickname writer===
 
From this point onward, whenever you use the ACE item, you should be able to open the nickname writer. Please make sure to respectkeep note of the following:
* TheSince the Nickname Writer only works whenindependently you have the Eevee-filled box set asof the current active box., '''Attemptingyou tocan usechange the Nickname Writer with any other boxes set ascurrent active willbox likelyhowever crashmuch theyou gamelike.'''
* When writing data, the Nickname Writer will overwrite enemy party data. While this does not have any effect outside of battle, it is recommended to not use the Nickname Writer in battle.
* Make sure to only use the Nickname Writer inside a pokémon center to ensure that the checksums are correctly displayed.'''
* As a side effect, the Nickname Writer will overwrite the nicknames of the first party pokémon.
 
The program works as follows:
Line 308 ⟶ 334:
* This nickname then gets converted to a sequence of five bytes.
* All five bytes are written starting from the starting location
* The program displays a glitched overworld view, along with a checksum (sum of all written byte values) towards the top right of the screen to confirm that you correctly entered the code. '''If the printed checksum doesn't match the expected checksum, you made a mistake entering a code.''' The glitched overworld view is temporary and will not affect your game.
* Afterwards, it waits for the user to decide what to do.
 
During the input phase, the controls are as follows:
* '''Press A''' for the program to ask for a new nickname and convert that to the next five bytes to be written.
* '''Press B''' to go back one byte at a time. The checksum will automatically be overwritten by the value written at the current selected address, giving you a measure of how far back you're going. If a name is incorrect, press B five times before pressing A, entering the nickname again to overwrite the incorrect nickname.
* '''Press START''' to immediately start executing the newly written program. '''Only do this when you've finished writing everything.'''
* '''Press SELECT''' to safely quit the Nickname Writer, without executing the newly written code.
 
{| class="wikitable"
! Write mode !! Input mode
|-
! [[File:RB Name writer write mode.png|thumb]]!![[File:RB Name writer input mode.png|thumb]]
! [[File:RB Name writer input mode.png]]
|-
| PressEnter nickname, press select to switch between uppercase/lowercase || Checksum ("4E", in this case) is displayed rightas nexta tohex value on the top right ITEMquadrant
|}
 
During the input phase, the controls are as follows:
* '''Press A''' for the program to ask for a new nickname and convert that to the next five bytes to be written.
* '''Press B''' to go back one byte at a time. The checksum will automatically be overwritten by the value written at the current selected address, giving you a measure of how far back you're going. '''This function is only needed if you accidentally confirmed a nickname without writing all 10 characters.'''
* '''Press START''' to immediately start executing the newly written program. '''Only do this when you've finished writing everything.'''
* '''Press SELECT''' to safely quit the Nickname Writer, without executing the newly written code.
* '''Press any button on the D-pad''' to go back five bytes and ask for a new nickname to correct errors. '''Use this if the printed checksum does not match the predicted checksum and the last written nickname contained ten characters.'''
 
==Step 6: Returning the game state to normal==
 
At this point, there are certain side effects that have been introduced by the setup:
* For all saves
* By picking up Eevee, we have flagged its poké ball as "obtained"
** WeBy currentlypicking up Eevee, we have twoflagged its badgespoké setball as "obtained"
** The current active box is filled with nicknamed Eevees
** SettingThe upitem SRAMpack glitchcurrently has given us a party of 255 pokémonitems
** The item packcode is currently hasstill required to run the 255Nickname itemsWriter
* For new saves only
* The item code is currently still required to run the Nickname Writer
** We currently have two badges set as obtained
* We are currently located in the Celadon Pokémon center, while we need to return to Pallet Town to pick up the starter pokémon
** Our pokédex currently has 152 pokémon species caught, preventing the story from continuing
** Setting up SRAM glitch has given us a party of 255 pokémon
** We are currently located in the Celadon Pokémon center, while we need to return to Pallet Town to pick up the starter pokémon
 
We will be removing all these side effect using the Nickname Writer. The nicknames we need to enter will be generated by the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]. Simply open the link, copy paste theone entireof the codecodes below into the converter, then press the "Run" button to display the list of nicknames. Please make sure that you use the Nickname Writer within a poké center, to ensure that the checksums are displayed properly.
 
'''When using the Nickname Writer, the generated nicknames need to be entered from top to bottom.'''
 
Please ensure to pick the code that suits both your language and your type of save.
 
{| class="wikitable"
|+ Codes to be used with the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]
! Language !! New Saves !! Older Saves
|-
! French || German || Italian || Spanish
|-
| <pre>21 B2 D5 CB AE
AF EA 5A D3 21
Line 358 ⟶ 388:
3E 21 65 DA 36
6E 23 36 D6 C9
</pre>|| <pre>21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 42 3E
</pre>
|-
||<pre>21 B2 D5 CB AE
! German
| <pre>21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
Line 370 ⟶ 408:
3E 21 65 DA 36
6E 23 36 D6 C9
</pre> || <pre>21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 44 3E
</pre>
|-
|| <pre>21 B2 D5 CB AE
! Italian
| <pre>21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
Line 381 ⟶ 427:
01 01 59 CD 3D
3E 21 65 DA 36
6E 23 36 D6 C9</pre>
</pre> || <pre>21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 3D 3E
</pre>
|-
! Spanish
| <pre>21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
Line 393 ⟶ 448:
3E 21 65 DA 36
6E 23 36 D6 C9
</pre> || <pre>21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 44 3E
</pre>
|}
 
Once all 11 codesnicknames have been entered and verified, you can press START during input mode to execute the code.
 
This will activate the following effects:
* For all saves:
* Reset the state of Eevee's poké ball, allowing it to be picked up again at a later point
** Reset the state of Eevee's poké ball, allowing it to be picked up again at a later point
* Reset all badges
** Empty the current active box
** Resets the bag, removing all items aside from 4F and removing the inventory underflow state
* Reset all Pokédex flags
** Rewire 4F so that it can activate the Nickname Writer independently of the item code
* Removes all party pokémon
* Only for new saves:
* Resets the bag, removing all items aside from 4F and removing the inventory underflow state
** Reset all badges
* Alters the exit of the poké center to lead out to Pallet Town
** Reset all Pokédex flags
** Removes all party pokémon
** Alters the exit of the poké center to lead out to Pallet Town
 
From this point onward, you can exit the Poké Centerpenthouse and continue the story as normal.
 
==Addendum: Additional codesapplications of the Nickname Writer==
 
The Nickname Writer allows you to easily write and execute arbitrary payloads. You can either make and execute your own codes, or head to the [[Guides:Nickname Writer Codes|Nickname Writer codes]] page. This page contains a collection of assembly for nickname codes that can be used for a variety of common purposes such as editing pokémon and items, editing player stats, resetting legendaries etc..
The following codes can be used with the Nickname Writer:
 
[[Guides:Nickname Writer Codes|Nickname Writer Codes]]
===PokeGiver script===
 
=Addendum: raw text transcripts of nickname codes=
Effects:
* Change second bag item to ACE item "4F" (This glitch item will have different names depending on the language).
* Set up everything so that 4F will activate the PokéGiver script (regardless of the current active box).
 
These are provided as an alternative in case images fail to load.
How to use the PokéGiver script:
* Please use a different box than the one that contains the Nickname Writer.
* Use -g m to activate the script. Once activated, the script will do the following:
** Give a pokémon.
** If the pokémon is deposited to the PC, the Pokémon will be made shiny. The default code will give female shiny pokémon (if the gender ratio allows it).
** Display two numbers (in hexadecimal) on screen. The left number indicates the species ID of the pokémon to be given, the right number indicated the level the pokémon is to be given at.
** The numbers can be altered by using the d-pad. Press A to confirm the values and give the next pokémon. Press Start to stop the script without giving any more pokémon.
** The script will stop automatically once the current active box is full.
 
==Infinite Eevee Mode Nickname==
Warnings:
* Species IDs do not match pokédex IDs in gen 1. Please use the Big Hex List article to determine which Species IDs give which pokémon.
* Be mindful of using this code to give yourself glitch pokémon, as the seen flags set by these glitch pokémon can alter the contents of the bag.
* The script is located in the area of memory that corresponds with enemy trainer party data. The script persists through saves, but will be destroyed when battling any trainer.
* Nickname writer codes with a length of up to 4 nicknames can be used without overwriting the PokéGiver script.
 
{| class="wikitable"
! Nickname (FR/IT/SP) !! Nickname (DE)
|+ Codes to be used with the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]
|-
|<pre>
! French || German || Italian || Spanish
C l l U ) : : ; W ;</pre>||<pre>
|-
C l d e d M : ; W ;</pre>
| <pre>3E 59 EA 24 D3
21 B1 D8 11 64
DA 01 03 00 C3
B1 00 C3 B5 D8
00 3E 01 E0 B7
01 01 01 CD 5C
3E D0 21 B5 DA
36 2A 23 36 AA
21 BB D8 11 91
C4 CD F5 D8 13
2B CD F5 D8 CD
21 38 F0 B5 FE
01 28 DA 07 38
10 07 38 0B 23
07 38 09 07 38
04 07 30 D9 D8
34 34 35 18 D3
CD F8 D8 CB 36
7E E6 0F C6 F6
F6 80 12 13 C9</pre>
||<pre>3E 59 EA 24 D3
21 B1 D8 11 64
DA 01 03 00 C3
B1 00 C3 B5 D8
00 3E 01 E0 B7
01 01 01 CD 5E
3E D0 21 B5 DA
36 2A 23 36 AA
21 BB D8 11 91
C4 CD F5 D8 13
2B CD F5 D8 CD
23 38 F0 B5 FE
01 28 DA 07 38
10 07 38 0B 23
07 38 09 07 38
04 07 30 D9 D8
34 34 35 18 D3
CD F8 D8 CB 36
7E E6 0F C6 F6
F6 80 12 13 C9</pre>
|| <pre>3E 59 EA 24 D3
21 B1 D8 11 64
DA 01 03 00 C3
B1 00 C3 B5 D8
00 3E 01 E0 B7
01 01 01 CD 57
3E D0 21 B5 DA
36 2A 23 36 AA
21 BB D8 11 91
C4 CD F5 D8 13
2B CD F5 D8 CD
1C 38 F0 B5 FE
01 28 DA 07 38
10 07 38 0B 23
07 38 09 07 38
04 07 30 D9 D8
34 34 35 18 D3
CD F8 D8 CB 36
7E E6 0F C6 F6
F6 80 12 13 C9</pre>
|| <pre>3E 59 EA 24 D3
21 B1 D8 11 64
DA 01 03 00 C3
B1 00 C3 B5 D8
00 3E 01 E0 B7
01 01 01 CD 5E
3E D0 21 B5 DA
36 2A 23 36 AA
21 BB D8 11 91
C4 CD F5 D8 13
2B CD F5 D8 CD
23 38 F0 B5 FE
01 28 DA 07 38
10 07 38 0B 23
07 38 09 07 38
04 07 30 D9 D8
34 34 35 18 D3
CD F8 D8 CB 36
7E E6 0F C6 F6
F6 80 12 13 C9</pre>
|}
 
==4F Bootstrap Nicknames==
===Changing the gender of pokémon given by the PokéGiver script===
 
With the PokéGiver script installed, you can use the following codes to change the gender of the pokémon given by the script.
 
{| class="wikitable"
! List of nicknames (FR/IT/SP) !! List of nicknames (DE)
|+ Codes to be used with the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]
|-
|<pre>
! rowspan="7" | All Languages
g . [ . ] , k Mn * Pk
|-
* ( u z z , , . ] ,
! Female Shiny !! Male Shiny
a Pk z q R r k Mn Pk X
|-
</pre>|| <pre>3E 2A EA C4 D8
ü u v ö ö k ü m M l
C9 00 00 00 00</pre>
Mn y y r z , , . ] ,
|| <pre>3E FA EA C4 D8
Ü ; w w * * ü m v ♂
C9 00 00 00 00</pre>
</pre>
|}
 
==Nickname Writer==
===Making a VC transferable Mew===
 
This code changes the data of the 6th party pokémon to have an OT ID of 22796 and a nickname of "GF". By putting a Mew in the sixth party slot and executing the code, the Mew can be passed through poké transporter to gen 7.
 
It is small enough to not destroy the PokéGiver script.
 
{| class="wikitable"
! French !! German !! Italian !! Spanish
|+ Codes to be used with the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]
|-
| <pre>
! All Languages
a b v v ) l l C d d
|-
j ? ) V t v v v l Mn
| <pre>21 57 D2 3E 59
q p y y ] z y p g F
22 36 0C 21 AE
a Pk j ? t K K b c c
D2 3E 86 22 3E
R j j m v w w P P p
85 22 36 50 C9</pre>
l l M v U U u l : ♀
P x w v v W M m m w
A B r q x Pk z g g h
i z , [ o w o x w x
( ) ) ) ) , , ] ] .
j ! U ? ? u w v u !
a Pk y o x ♀ ♂ ♂ ( ?
r p O ; ; [ : ; : ;
</pre>
|| <pre>
a b v v l L L Ü U Ö
ä s R j t v v v Ü u
q p y y o ) ] Pk ) )
a - ä s t K K b c c
R j j m v w w P P p
l l M v V V u l u ü
P x w v v W M m m w
A B Ä S ü ü Ü U u L
T - - Ä Ä S Z Pk z r
Q p ) ) ) , , ] ] .
Ä z y [ ♀ W w v ü ü
a Pk Mn ? ! U M v u u
r p O ; ; [ : ; : ;
</pre>
|| <pre>
a b v v ) l l C d d
j ? ) V t v v v l Mn
q p y y ] z y p g F
u u j ? t K K b c c
R j j m v w w P P p
l l M v V V u l : ♀
P x w v v W M m m w
A B r q x Pk z g g h
i z , [ o w o x w x
( ) ) ) ) , , ] ] .
j ! U ? ? u w v u !
a Pk ] g y . P p p x
r p O ; ; [ : ; : ;
</pre>
|| <pre>
a b v v ) l l C d d
j ? ) V t v v v l Mn
q p y y ] z y p g F
a - j ? t K K b c c
R j j m v w w P P p
l l M v V V u l : ♀
P x w v v W M m m w
A B r q x Pk z g g h
i z , [ o w o x w x
( ) ) ) ) , , ] ] .
j ! U ? ? u w v u !
a Pk , , - : : V u u
r p O ; ; [ : ; : ;
</pre>
|}
 
=Addendum: technical explanation of the setup=
===Installing a RAM writer===
 
==Nickname Converter Item Code==
A RAM writer is an installable program that allows you to view and change any value in memory using a graphical user interface. This allows you to easily change specific values, set up and run small payloads and verify specific values in memory.
 
===Explanation===
{| class="wikitable"
|+ Codes to be used with the [https://timovm.github.io/NicknameConverter/ Nickname Converter webtool]
|-
! French !! German !! Italian !! Spanish
|-
| <pre>3E 03 CD 91 D9 3E 59 EA 22 D3
01 C0 00 11 53 BA 21 BF D8 CD
B1 00 11 64 DA D5 0E 1B C3 B1
00 21 3D 0F E5 7C E0 B6 E0 B7
21 00 DA CD D4 C9 E5 11 F8 FF
19 54 5D 01 0C 00 CD 74 DA 21
A9 C3 CD C5 C9 3E 7C 22 7A CD
C5 C9 7B CD C5 C9 3E E3 22 1A
CD C5 C9 36 7C 09 13 7D FE 13
20 E5 26 00 74 21 50 C4 36 ED
E1 18 C4 F5 CB 37 CD CC C9 F1
E6 0F C6 F6 F6 80 22 C9 CD 1E
CA CB 5F 20 39 CB 57 28 0A 0F
30 01 E9 F0 FD 83 E0 FD C9 0F
30 2A E5 CD 74 DA 4E CD 1E CA
0F 38 12 0F 30 01 4B 79 83 4F
21 50 C4 36 EC 23 CD C5 C9 18
E8 E1 71 E5 06 1C 21 17 7B CD
87 3E E1 C9 0F 30 03 53 1E 00
19 C9 CD 21 38 F0 B5 76 11 00
00 F5 07 30 01 13 07 30 01 1B
07 30 03 11 F0 FF 07 30 02 1E
10 F1 C9 3E 03 CD 76 DA 11 7D
C9 D5 4A 21 53 BA C3 B1 00 F0
FD E5 26 0A 74 26 40 77 E1 C9</pre>
|| <pre>3E 03 CD 91 D9 3E 59 EA 22 D3
01 C0 00 11 53 BA 21 BF D8 CD
B1 00 11 64 DA D5 0E 1B C3 B1
00 21 3D 0F E5 7C E0 B6 E0 B7
21 00 DA CD D4 C9 E5 11 F8 FF
19 54 5D 01 0C 00 CD 74 DA 21
A9 C3 CD C5 C9 3E 7C 22 7A CD
C5 C9 7B CD C5 C9 3E E3 22 1A
CD C5 C9 36 7C 09 13 7D FE 13
20 E5 26 00 74 21 50 C4 36 ED
E1 18 C4 F5 CB 37 CD CC C9 F1
E6 0F C6 F6 F6 80 22 C9 CD 1E
CA CB 5F 20 39 CB 57 28 0A 0F
30 01 E9 F0 FD 83 E0 FD C9 0F
30 2A E5 CD 74 DA 4E CD 1E CA
0F 38 12 0F 30 01 4B 79 83 4F
21 50 C4 36 EC 23 CD C5 C9 18
E8 E1 71 E5 06 1C 21 25 7B CD
89 3E E1 C9 0F 30 03 53 1E 00
19 C9 CD 23 38 F0 B5 76 11 00
00 F5 07 30 01 13 07 30 01 1B
07 30 03 11 F0 FF 07 30 02 1E
10 F1 C9 3E 03 CD 76 DA 11 7D
C9 D5 4A 21 53 BA C3 B1 00 F0
FD E5 26 0A 74 26 40 77 E1 C9</pre>
|| <pre>3E 03 CD 91 D9 3E 59 EA 22 D3
01 C0 00 11 53 BA 21 BF D8 CD
B1 00 11 64 DA D5 0E 1B C3 B1
00 21 3D 0F E5 7C E0 B6 E0 B7
21 00 DA CD D4 C9 E5 11 F8 FF
19 54 5D 01 0C 00 CD 74 DA 21
A9 C3 CD C5 C9 3E 7C 22 7A CD
C5 C9 7B CD C5 C9 3E E3 22 1A
CD C5 C9 36 7C 09 13 7D FE 13
20 E5 26 00 74 21 50 C4 36 ED
E1 18 C4 F5 CB 37 CD CC C9 F1
E6 0F C6 F6 F6 80 22 C9 CD 1E
CA CB 5F 20 39 CB 57 28 0A 0F
30 01 E9 F0 FD 83 E0 FD C9 0F
30 2A E5 CD 74 DA 4E CD 1E CA
0F 38 12 0F 30 01 4B 79 83 4F
21 50 C4 36 EC 23 CD C5 C9 18
E8 E1 71 E5 06 1C 21 86 7B CD
82 3E E1 C9 0F 30 03 53 1E 00
19 C9 CD 1C 38 F0 B5 76 11 00
00 F5 07 30 01 13 07 30 01 1B
07 30 03 11 F0 FF 07 30 02 1E
10 F1 C9 3E 03 CD 76 DA 11 7D
C9 D5 4A 21 53 BA C3 B1 00 F0
FD E5 26 0A 74 26 40 77 E1 C9</pre>
|| <pre>3E 03 CD 91 D9 3E 59 EA 22 D3
01 C0 00 11 53 BA 21 BF D8 CD
B1 00 11 64 DA D5 0E 1B C3 B1
00 21 3D 0F E5 7C E0 B6 E0 B7
21 00 DA CD D4 C9 E5 11 F8 FF
19 54 5D 01 0C 00 CD 74 DA 21
A9 C3 CD C5 C9 3E 7C 22 7A CD
C5 C9 7B CD C5 C9 3E E3 22 1A
CD C5 C9 36 7C 09 13 7D FE 13
20 E5 26 00 74 21 50 C4 36 ED
E1 18 C4 F5 CB 37 CD CC C9 F1
E6 0F C6 F6 F6 80 22 C9 CD 1E
CA CB 5F 20 39 CB 57 28 0A 0F
30 01 E9 F0 FD 83 E0 FD C9 0F
30 2A E5 CD 74 DA 4E CD 1E CA
0F 38 12 0F 30 01 4B 79 83 4F
21 50 C4 36 EC 23 CD C5 C9 18
E8 E1 71 E5 06 1C 21 36 7B CD
89 3E E1 C9 0F 30 03 53 1E 00
19 C9 CD 23 38 F0 B5 76 11 00
00 F5 07 30 01 13 07 30 01 1B
07 30 03 11 F0 FF 07 30 02 1E
10 F1 C9 3E 03 CD 76 DA 11 7D
C9 D5 4A 21 53 BA C3 B1 00 F0
FD E5 26 0A 74 26 40 77 E1 C9</pre>
|}
 
The item code itself consists of two components. The first 10 items are used to write a program that takes text characters from the nicknames of characters currently within the active box, converts them, then writes the resulting values to unused memory starting from $D66E.
====Using the full RAM writer====
 
Pairs of text characters are converted to single values through a [(2a + b)%256] formula, where a is the value of the first character and b the value of the second. text terminators are skipped, the code will stop and execute the newly written code once it either reads a $00 value or if values are being read past $DEFF.
Assuming the program was entered correctly, the game should open up one of the screens as seen in the below screenshots. The RAM writer will draw various values on the screen. The leftmost 4 columns describe the addresses that are currently in view. The rightmost two columns describe the values at each of these addresses. All values on screen are represented in hexadecimal format.
 
<pre>
For example: DA01>05 means that the address $DA01 is currently holding the value of $05.
11 6E D6 ld de, UNUSED_MEMORY ; Memory between $D66F and $D6F4 goes unused
D5 push de
21 0A DE ld hl, wBoxNicks
.loop
2A ldi a, (hl)
03 inc bc ; Filler, no effect on flags
87 add a
0B dec bc ; Filler, compensates previous inc bc, no effect on flags
30 04 jp nc, .notChar ; Aside from space (should not be used), "add a" will only give nc if value read is not a text char
86 add a, (hl)
12 ld (de), a
2C inc l ; Affects z flag
13 inc de
.notChar
20 F4 jp nz, .loop ; Loop unless l rolled over to $00 or value read was $00
C9 ret ; Due to previous push de, this ret will cause execution to resume from $D66A onward, immediately running the newly written code
</pre>
 
The last item, the X Accuracy, simply form a pointer to $F32E. Due to echo RAM this address is equivalent to $D32E, which correspond to item #7's item ID, the start of the item code. By replacing the map script pointer with this item, we can redirect the map script routine to execute the item code instead. This routine is executed on every frame, as long as the start menu isn't open.
'''Make sure to save the game after you've confirmed that the RAM writer is fully functional.'''
 
===Raw Assembly===
The RAM writer can also be used during battle. Opening and closing the RAM writer in battle will pass your turn to the enemy and cause the battle to continue as usual.
 
<pre>
Due to the location the RAM writer is buffered, upon closing the RAM writer in battle in Red/Blue, you will see a slight graphical corruption at the bottom of the screen that will immediately be overwritten by the battle text box. This corruption is purely cosmetic and temporary, meaning that it will not cause any harm to your game.
11 6E Max Potion x110
D6 D5 TM14 x213
21 0A Thunderstone x10
DA 2A TM22 x42
03 87 Great Ball x135
0B 30 Antidote x48
04 86 Poké Ball x134
12 2C Hyper Potion x44
13 20 Super Potion x32
F4 C9 TM44 x201
 
2E F3 x243
====Full Writer Controls====
</pre>
 
==Infinite Eevee Nickname==
The RAM writer uses two modes of operation. In Read mode you are able to navigate memory and view the values at specific addresses. in Write mode you'll lock in a single address and manipulate the value at that address. By default, the RAM writer will open in Read mode.
 
===Explanation===
{| class="wikitable"
 
|[[file:Full RB DA96 Read mode.png|288px]]||[[file:Full_RB_DA96_Write_mode.png|288px]]
The Infinite Eevee mode nickname writes $00 to the lower byte of wMissableObjectList, causing a misalignment in how the game applies NPC disappearance, causing Eevee's pokéball to stay permanently visible until the game is reset or the player leaves the Celadon Mansion penthouse.
|-
|RAM writer in Read mode ||RAM writer in Write mode.
|}
 
=====Read mode controls=====
<pre>
AF xor a ; a = $00
up: address -1
EA D2 D5 ld (wMissableObjectList), a ; Misaligns which objects are made invisible
down: address +1
C9 ret
left: address -10
</pre>
right: address +10
B + up: address -1
B + down: address +1
B + left: address -10
B + right: address +10
start: exit program
A: toggle write mode
 
===Raw Assembly===
select + up: sram bank -1
 
select + down: sram bank +1
<pre>
select + left: sram bank -10
AF EA D2 D5 C9
select + right: sram bank +10
select + A: start executing code from current address onwards (use with caution!)
</pre>
 
==4F Boostrap Nicknames==
=====Write mode controls=====
 
This set of nicknames, when converted, will modify item #1's ID to be 4F and writes a bootstrap so that using it will lead to execution of the item code from $D32E onward. It requires the presence of the Infinite Eevee Mode Nickname (see previous section) to properly return.
 
<pre>
21 22 D3 ld hl, wBagItems ; item #1's ID
up: value -1
36 59 ld (hl), $59 ; 4F's item ID
down: value +1
7C ld a, h ; a = $D3
left: value -10
21 66 DA ld hl, 4F_Execution_Pointer +2
right: value +10
32 ldd (hl), a
B: set current value to 0
3E 2E ld a, $2E
A: exit write mode and load final value into the address
22 ldi (hl), a
36 C3 ld (hl), $C3
; The contents of the first nickname (see previous section) are written right after this, ensuring safe return.
</pre>
 
===Raw Assembly===
 
<pre>
21 22 D3 36 59
7C 21 66 DA 32
3E 2E 32 36 C3
</pre>
 
==Using 4F==
 
===Explanation===
 
Using 4F, an invalid item, will cause the game to index the item effects table out of bounds, leading to an invalid execution pointer. For 4F, this causes the game to execute code from $FA64 onward. Due to echo RAM, this address is equivalent to $DA64. Thanks to the bootstrap that was applied earlier, this will then cause the game to jump to $D32E, corresponding to the start of the item code.
 
<pre>
C3 2E D3 jp ITEM_7_ID
</pre>
 
===Raw Assembly===
 
<pre>C3 2E D3</pre>
 
==Nickname Writer==
 
===Explanation===
 
The Nickname Writer is a small program that, using nicknames as input, is able to write arbitrary amounts of custom code relatively quickly. It first request a nickname as input, then converts that data to custom code, then displays a checksum of the written data and finally asks the player to provide additional input.
 
The value of the checksum is calculated by [($80 + the sum of all written values)%256]. Custom code is buffered and executed within enemy party data. Due to how it calls DisplayNameRaterScreen, it will also nickname a party pokémon corresponding to the item slot that 4F currently occupies.
 
====French====
 
<pre>
11 B9 D8 ld de, $D8B9 ; location written to
D5 push de
.newMail
D5 push de
21 1E 63 ld hl, AskName + 39h ; Prepares data and calls DisplayNamingScreen
CD 1A 39 call $391A ; sets b to 01, then jumps to Bankswitch, calling b:hl
0E 80 ld c, $80 ; Ensure checksum consistency
21 4F CF ld hl, wStringBuffer ; Address where new name gets written to
D1 pop de ; Continue writing from last saved de
.newChar
2A ld a, (hli)
87 add a
30 09 jp nc, .terminator ; If blank space as first character of pair, only terminator $50 will result in a nc result
86 add a, (hl)
12 ld (de), a
13 inc de
23 inc hl
81 add a, c ; Current checksum total is buffered in c
12 ld (de), a
4F ld c, a
18 F3 jp .newChar
.terminator
D5 push de
21 00 C4 ld hl, $C400 ; Corresponds to screen tile
0E 01 ld c, $01 ; How many bytes printed as numbers?
CD BC 13 call PrintBCDNumber.loop
.numLoop
2D dec l
CB FE set 7, (hl)
20 FB jp nz, .numLoop ; Repeat until hl == $C400
75 ld (hl), l ; Nulls out $C400
.inputLoop
CD 21 38 call JoypadLowSensitivity ; Halt execution until frame has passed, get joypad status and store result in hJoy5
F0 B5 ld a, (hJoy5)
E6 0F and $0F ; Set z flag if A, B, START, SELECT not pressed
28 F7 jp z, .inputLoop
1F rra ; Is A pressed? If yes, set c flag
D1 pop de
38 CB jr c, .newMail
1B dec de
1F rra ; Is B pressed? If yes, set c flag
38 E1 jr c, .terminator
1F rra ; Is SELECT pressed? If yes, set c flag
E1 pop hl ; pop starting address to hl
D8 ret c ; If SELECT pressed, simply return to normal operations
E9 jp hl ; If START pressed, jump to hl to execute newly written code
</pre>
 
====German====
 
<pre>
11 B9 D8 ld de, $D8B9 ; location written to
D5 push de
.newMail
D5 push de
21 AA 62 ld hl, AskName + 39h ; Prepares data and calls DisplayNamingScreen
CD 1C 39 call $391C ; sets b to 01, then jumps to Bankswitch, calling b:hl
0E 80 ld c, $80 ; Ensure checksum consistency
21 4F CF ld hl, wStringBuffer ; Address where new name gets written to
D1 pop de ; Continue writing from last saved de
.newChar
2A ld a, (hli)
87 add a
30 09 jp nc, .terminator ; If blank space as first character of pair, only terminator $50 will result in a nc result
86 add a, (hl)
12 ld (de), a
13 inc de
23 inc hl
81 add a, c ; Current checksum total is buffered in c
12 ld (de), a
4F ld c, a
18 F3 jp .newChar
.terminator
D5 push de
21 00 C4 ld hl, $C400 ; Corresponds to screen tile
0E 01 ld c, $01 ; How many bytes printed as numbers?
CD BF 13 call PrintBCDNumber.loop
.numLoop
2D dec l
CB FE set 7, (hl)
20 FB jp nz, .numLoop ; Repeat until hl == $C400
75 ld (hl), l ; Nulls out $C400
.inputLoop
CD 23 38 call JoypadLowSensitivity ; Halt execution until frame has passed, get joypad status and store result in hJoy5
F0 B5 ld a, (hJoy5)
E6 0F and $0F ; Set z flag if A, B, START, SELECT not pressed
28 F7 jp z, .inputLoop
1F rra ; Is A pressed? If yes, set c flag
D1 pop de
38 CB jr c, .newMail
1B dec de
1F rra ; Is B pressed? If yes, set c flag
38 E1 jr c, .terminator
1F rra ; Is SELECT pressed? If yes, set c flag
E1 pop hl ; pop starting address to hl
D8 ret c ; If SELECT pressed, simply return to normal operations
E9 jp hl ; If START pressed, jump to hl to execute newly written code
</pre>
 
====Italian====
 
<pre>
11 B9 D8 ld de, $D8B9 ; location written to
D5 push de
.newMail
D5 push de
21 E4 62 ld hl, AskName + 39h ; Prepares data and calls DisplayNamingScreen
CD 15 39 call $3915 ; sets b to 01, then jumps to Bankswitch, calling b:hl
0E 80 ld c, $80 ; Ensure checksum consistency
21 4F CF ld hl, wStringBuffer ; Address where new name gets written to
D1 pop de ; Continue writing from last saved de
.newChar
2A ld a, (hli)
87 add a
30 09 jp nc, .terminator ; If blank space as first character of pair, only terminator $50 will result in a nc result
86 add a, (hl)
12 ld (de), a
13 inc de
23 inc hl
81 add a, c ; Current checksum total is buffered in c
12 ld (de), a
4F ld c, a
18 F3 jp .newChar
.terminator
D5 push de
21 00 C4 ld hl, $C400 ; Corresponds to screen tile
0E 01 ld c, $01 ; How many bytes printed as numbers?
CD BF 13 call PrintBCDNumber.loop
.numLoop
2D dec l
CB FE set 7, (hl)
20 FB jp nz, .numLoop ; Repeat until hl == $C400
75 ld (hl), l ; Nulls out $C400
.inputLoop
CD 1C 38 call JoypadLowSensitivity ; Halt execution until frame has passed, get joypad status and store result in hJoy5
F0 B5 ld a, (hJoy5)
E6 0F and $0F ; Set z flag if A, B, START, SELECT not pressed
28 F7 jp z, .inputLoop
1F rra ; Is A pressed? If yes, set c flag
D1 pop de
38 CB jr c, .newMail
1B dec de
1F rra ; Is B pressed? If yes, set c flag
38 E1 jr c, .terminator
1F rra ; Is SELECT pressed? If yes, set c flag
E1 pop hl ; pop starting address to hl
D8 ret c ; If SELECT pressed, simply return to normal operations
E9 jp hl ; If START pressed, jump to hl to execute newly written code
</pre>
 
====Spanish====
 
<pre>
11 B9 D8 ld de, $D8B9 ; location written to
D5 push de
.newMail
D5 push de
21 DC 62 ld hl, AskName + 39h ; Prepares data and calls DisplayNamingScreen
CD 1C 39 call $391C ; sets b to 01, then jumps to Bankswitch, calling b:hl
0E 80 ld c, $80 ; Ensure checksum consistency
21 4F CF ld hl, wStringBuffer ; Address where new name gets written to
D1 pop de ; Continue writing from last saved de
.newChar
2A ld a, (hli)
87 add a
30 09 jp nc, .terminator ; If blank space as first character of pair, only terminator $50 will result in a nc result
86 add a, (hl)
12 ld (de), a
13 inc de
23 inc hl
81 add a, c ; Current checksum total is buffered in c
12 ld (de), a
4F ld c, a
18 F3 jp .newChar
.terminator
D5 push de
21 00 C4 ld hl, $C400 ; Corresponds to screen tile
0E 01 ld c, $01 ; How many bytes printed as numbers?
CD BF 13 call PrintBCDNumber.loop
.numLoop
2D dec l
CB FE set 7, (hl)
20 FB jp nz, .numLoop ; Repeat until hl == $C400
75 ld (hl), l ; Nulls out $C400
.inputLoop
CD 23 38 call JoypadLowSensitivity ; Halt execution until frame has passed, get joypad status and store result in hJoy5
F0 B5 ld a, (hJoy5)
E6 0F and $0F ; Set z flag if A, B, START, SELECT not pressed
28 F7 jp z, .inputLoop
1F rra ; Is A pressed? If yes, set c flag
D1 pop de
38 CB jr c, .newMail
1B dec de
1F rra ; Is B pressed? If yes, set c flag
38 E1 jr c, .terminator
1F rra ; Is SELECT pressed? If yes, set c flag
E1 pop hl ; pop starting address to hl
D8 ret c ; If SELECT pressed, simply return to normal operations
E9 jp hl ; If START pressed, jump to hl to execute newly written code
</pre>
 
===Raw Assembly===
 
====French====
 
<pre>
11 B9 D8 D5 D5
21 1E 63 CD 1A
39 0E 80 21 4F
CF D1 2A 87 30
09 86 12 13 23
81 12 4F 18 F3
D5 21 00 C4 0E
01 CD BC 13 2D
CB FE 20 FB CD
21 38 F0 B5 E6
0F 28 F7 1F D1
38 CB 1B 1F 38
E1 1F E1 D8 E9
</pre>
 
====German====
 
<pre>
11 B9 D8 D5 D5
21 AA 62 CD 1C
39 0E 80 21 4F
CF D1 2A 87 30
09 86 12 13 23
81 12 4F 18 F3
D5 21 00 C4 0E
01 CD BF 13 2D
CB FE 20 FB CD
23 38 F0 B5 E6
0F 28 F7 1F D1
38 CB 1B 1F 38
E1 1F E1 D8 E9
</pre>
 
====Italian====
 
<pre>
11 B9 D8 D5 D5
21 E4 62 CD 15
39 0E 80 21 4F
CF D1 2A 87 30
09 86 12 13 23
81 12 4F 18 F3
D5 21 00 C4 0E
01 CD BF 13 2D
CB FE 20 FB CD
1C 38 F0 B5 E6
0F 28 F7 1F D1
38 CB 1B 1F 38
E1 1F E1 D8 E9
</pre>
 
====Spanish====
 
<pre>
11 B9 D8 D5 D5
21 DC 62 CD 1C
39 0E 80 21 4F
CF D1 2A 87 30
09 86 12 13 23
81 12 4F 18 F3
D5 21 00 C4 0E
01 CD BF 13 2D
CB FE 20 FB CD
23 38 F0 B5 E6
0F 28 F7 1F D1
38 CB 1B 1F 38
E1 1F E1 D8 E9
</pre>
 
==Cleanup Code (new save)==
 
===Explanation===
 
This code cleans up every negative side effect brought on by the setup and allows the player to continue the story as intended, with the exception of 4F being added to the item bag, enabling use of the Nickname Writer.
 
The negative effects targeted are:
* By picking up Eevee, we have flagged its poké ball as "obtained"
* The current active box is filled with nicknamed Eevees
* The item pack currently has 255 items
* The item code is currently still required to run the Nickname Writer
* We currently have two badges set as obtained
* Our pokédex currently has 152 pokémon species caught, preventing the story from continuing
* Setting up SRAM glitch has given us a party of 255 pokémon
* We are currently located in the Celadon Pokémon center, while we need to return to Pallet Town to pick up the starter pokémon
 
====French====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
EA 5A D3 ld (wObtainedBadges), a ; Reset badges
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
01 26 00 ld bc, 0026
21 FB D2 ld hl, wPokedexOwned
.loop
22 ldi (hl), a
0D dec c
20 FC jp nz, .loop ; Fully clear all Pokédex flags
2E B5 ld l, $B5 ; hl = $D3B6, within wWarpEntries
22 ldi (hl), a
22 ldi (hl), a
23 inc hl
23 inc hl
22 ldi (hl), a
22 ldi (hl), a ; Changes first two warp tiles to lead to Pallet Town instead
EA 67 D1 ld (wPartyCount), a ; Set amount of pokémon in party to 0
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
01 01 59 ld bc, $5901
CD 42 3E call GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
21 64 DA ld hl, $DA64 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
C9 ret
</pre>
 
====German====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
EA 5A D3 ld (wObtainedBadges), a ; Reset badges
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
01 26 00 ld bc, 0026
21 FB D2 ld hl, wPokedexOwned
.loop
22 ldi (hl), a
0D dec c
20 FC jp nz, .loop ; Fully clear all Pokédex flags
2E B5 ld l, $B5 ; hl = $D3B6, within wWarpEntries
22 ldi (hl), a
22 ldi (hl), a
23 inc hl
23 inc hl
22 ldi (hl), a
22 ldi (hl), a ; Changes first two warp tiles to lead to Pallet Town instead
EA 67 D1 ld (wPartyCount), a ; Set amount of pokémon in party to 0
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
01 01 59 ld bc, $5901
CD 44 3E call GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
21 64 DA ld hl, $DA64 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
C9 ret
</pre>
 
====Italian====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
EA 5A D3 ld (wObtainedBadges), a ; Reset badges
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
01 26 00 ld bc, 0026
21 FB D2 ld hl, wPokedexOwned
.loop
22 ldi (hl), a
0D dec c
20 FC jp nz, .loop ; Fully clear all Pokédex flags
2E B5 ld l, $B5 ; hl = $D3B6, within wWarpEntries
22 ldi (hl), a
22 ldi (hl), a
23 inc hl
23 inc hl
22 ldi (hl), a
22 ldi (hl), a ; Changes first two warp tiles to lead to Pallet Town instead
EA 67 D1 ld (wPartyCount), a ; Set amount of pokémon in party to 0
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
01 01 59 ld bc, $5901
CD 3D 3E call GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
21 64 DA ld hl, $DA64 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
C9 ret
</pre>
 
====Spanish====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
EA 5A D3 ld (wObtainedBadges), a ; Reset badges
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
01 26 00 ld bc, 0026
21 FB D2 ld hl, wPokedexOwned
.loop
22 ldi (hl), a
0D dec c
20 FC jp nz, .loop ; Fully clear all Pokédex flags
2E B5 ld l, $B5 ; hl = $D3B6, within wWarpEntries
22 ldi (hl), a
22 ldi (hl), a
23 inc hl
23 inc hl
22 ldi (hl), a
22 ldi (hl), a ; Changes first two warp tiles to lead to Pallet Town instead
EA 67 D1 ld (wPartyCount), a ; Set amount of pokémon in party to 0
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
01 01 59 ld bc, $5901
CD 44 3E call GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
21 64 DA ld hl, $DA64 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
C9 ret
</pre>
 
===Raw Assembly===
 
====French====
 
<pre>
21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
AF 01 26 00 21
FB D2 22 0D 20
FC 2E B5 22 22
23 23 22 22 EA
67 D1 EA 21 D3
01 01 59 CD 42
3E 21 65 DA 36
6E 23 36 D6 C9
</pre>
 
====German====
 
<pre>
21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
AF 01 26 00 21
FB D2 22 0D 20
FC 2E B5 22 22
23 23 22 22 EA
67 D1 EA 21 D3
01 01 59 CD 44
3E 21 65 DA 36
6E 23 36 D6 C9
</pre>
 
====Italian====
 
<pre>
21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
AF 01 26 00 21
FB D2 22 0D 20
FC 2E B5 22 22
23 23 22 22 EA
67 D1 EA 21 D3
01 01 59 CD 3D
3E 21 65 DA 36
6E 23 36 D6 C9
</pre>
 
====Spanish====
 
<pre>
21 B2 D5 CB AE
AF EA 5A D3 21
84 DA 22 3D 22
AF 01 26 00 21
FB D2 22 0D 20
FC 2E B5 22 22
23 23 22 22 EA
67 D1 EA 21 D3
01 01 59 CD 44
3E 21 65 DA 36
6E 23 36 D6 C9
</pre>
 
==Cleanup Code (existing save)==
 
===Explanation===
 
This code cleans up every negative side effect brought on by the setup and allows the player to continue the story as intended, with the exception of 4F being added to the item bag, enabling use of the Nickname Writer.
 
The negative effects targeted are:
* By picking up Eevee, we have flagged its poké ball as "obtained"
* The current active box is filled with nicknamed Eevees
* The item pack currently has 255 items
* The item code is currently still required to run the Nickname Writer
 
Since existing saves do not have to set up SRAM glitch, there are a lot less side effects that need to be addressed by the cleanup code.
 
====French====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
21 65 DA ld hl, $DA65 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
01 01 59 ld bc, $5901
C3 42 3E jp GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
</pre>
 
====German====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
21 65 DA ld hl, $DA65 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
01 01 59 ld bc, $5901
C3 44 3E jp GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
</pre>
 
====Italian====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
21 65 DA ld hl, $DA65 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
01 01 59 ld bc, $5901
C3 3D 3E jp GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
</pre>
 
====Spanish====
 
<pre>
21 B2 D5 ld hl, $D5B2 ; Part of wMissableObjectFlags
CB AE res 5, (hl) ; Reenable Eevee's poké ball
AF xor a ; a = $00
21 84 DA ld hl, wBoxCount
22 ldi (hl), a ; Set amount of pokémon in box to 0
3D dec a ; a = $FF
22 ldi (hl), a ; Add proper terminator to wBoxSpecies
AF xor a ; a = $00
EA 21 D3 ld (wNumBagItems), a ; Set amount of items to 0
21 65 DA ld hl, $DA65 ; Part of 4F bootstrap
36 6E ld (hl), $6E
23 inc hl
36 D6 ld (hl), $D6 ; 4F now redirects directly to Nickname Writer
01 01 59 ld bc, $5901
C3 44 3E jp GiveItem ; Gives c amount of b item, giving 1 copy of 4F.
</pre>
 
===Raw Assembly===
 
====French====
 
<pre>
21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 42 3E
</pre>
 
====German====
 
<pre>
21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 44 3E
</pre>
 
====Italian====
 
<pre>
21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 3D 3E
</pre>
 
====Spanish====
 
<pre>
21 B2 D5 CB AE
AF 21 84 DA 22
3D 22 AF EA 21
D3 21 65 DA 36
6E 23 36 D6 01
01 59 C3 44 3E
</pre>
 
[[Category:Guides]]
1,514

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.