Jump to content

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

m
no edit summary
mNo edit summary
mNo edit summary
Tags: Mobile edit Mobile web edit
 
(21 intermediate revisions by the same user not shown)
Line 6:
 
If you encounter any issues when going through this guide or would like to provide feedback, please contact TimoVM on the [https://discord.gg/EA7jxJ6 Glitch City Research Institute Discord].
 
The contents of this guide are demonstrated in the following video:
 
{{youtube|jxu9VgwvkJw|TimoVM}}
 
=Setting up initial ACE=
Line 154 ⟶ 158:
| [[File:RareCandyLocation.png]] || Rare Candy|| x243 || At the Thunderstone spot, walk 7 steps to the right to get Rare Candy x0. Toss 13 from the stack, then swap to slot #16.
|-
| [[File:TM14Location.png]] || TM14 || x213 || At the Thunderstone spot, swap the Thunderstone with the TM23 x64 stack 4 slots below, then toss 63 TM23s. Walk 1 step up and 9 steps left to get TM21TM14 x0. Toss 43 from the stack, then swap to slot #17.
|}
 
Line 250 ⟶ 254:
===Setting up 4F to execute item codes===
 
Next, we'll be entering a list of fivethree nicknames that gives us 4F and the necessary bootstrap. This ensures that using 4F will activate the item code.
 
{| class="wikitable"
Line 272 ⟶ 276:
===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.
 
{| class="wikitable"
Line 281 ⟶ 285:
 
* 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 you'reall nicknames have been entered, look at theyour pokémontrainer centercard, 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.
Line 290 ⟶ 293:
From this point onward, whenever you use the ACE item, you should be able to open the nickname writer. Please make sure to keep note of the following:
* Since the Nickname Writer works independently of the current active box, you can change the current active box however much you like.
* 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 party pokémon corresponding with the current item slot of 4F. '''Please make sure to keep 4F in the first 6 item slots while using the Nickname Writer.'''
 
The program works as follows:
Line 298 ⟶ 300:
* 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. '''ThisIf functiona name is onlyincorrect, neededpress ifB youfive accidentallytimes confirmedbefore apressing A, entering the nickname withoutagain writingto alloverwrite 10the charactersincorrect 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.
* '''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.'''
 
{| 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
|}
 
Line 330 ⟶ 332:
** 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 one of the two codes 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.'''
Line 374 ⟶ 376:
** 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.
 
==Additional applications 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..^
 
[[Guides:Nickname Writer Codes|Nickname Writer Codes]]
 
=Addendum: raw text transcripts of nickname codes=
Line 389 ⟶ 393:
! Nickname
|-
!|<pre>
C l l U ( ( : ; W ;
</pre>
Line 399 ⟶ 403:
! List of nicknames
|-
!|<pre>
g . [y Xy w] w, k Mn (* vPk
a* Pk( z; q! g? .) y[ y[ w] w,
aw Mnv ]v -u -U ]l [k [Mn oPk MnX
z q Q P w w w w w w
g . Pk X w v v u U l
</pre>
|}
Line 413 ⟶ 415:
! List of nicknames
|-
!|<pre>
ha Mnb Lv lv ) l L Ll tC td (d
tj v? u) tV t v uv tv sl tMn
jq ?p (y ty v] vz vy vp ;g [F
ta z* j ? (t )K tK vb vc vc
aR qj Hj hm Hv Zw yw yP pP Qp
Sl *l SM jv aV *v jv ?l ): )
sP kx lw lv :v ;W M m m w
qA yB [r xq wx vPk :z *g *g Mnh
Zi Pkz Z, *[ *o ]w Yo Mnx Mnw Lx
A( H) ]) .) w) ;, , :] u] k.
aj Pk! PkU J? (? )u )w )v )u ,-
Sv jx Sw sy jy - s k Aw Aw
jr up lP lX u[ z: Pk: (; -: ];
r p . y [ : : ; : ;
</pre>
|}
Line 450 ⟶ 451:
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
Line 502 ⟶ 503:
 
<pre>
3E 59 ld a, $59 ; 4F's item ID
21 1E D3 ld hl, wBagItems ; item #1's ID
2236 59 ldild (hl), a$59 ; 4F's item ID
AF7C xorld a, h ; a = $00D3
21 6567 DA ld hl, 4F_Execution_Pointer +2
22 ldi (hl), a
2232 ldildd (hl), a
22 ldi (hl), a
22 ldi (hl), a ; clears a bunch of $FF values placed by swapping party pokémon
21 65 DA ld hl, 4F_Execution_Pointer
3E 21 ld a, $21
22 ldi (hl), a
3E 28 ld a, $28
22 ldi (hl), a
3E36 D3C3 ld a(hl), $D3C3
22 ldi (hl), a
36 E9 ld hl, $E9
; The contents of the first nickname (see previous section) are written right after this, ensuring safe return.
</pre>
Line 524 ⟶ 517:
 
<pre>
3E 59 21 1E D3 36 59
227C AF21 2267 22DA 2232
223E 2128 6532 DA36 3EC3
21 22 3E 28 22
3E D3 22 36 E9
</pre>
 
Line 538 ⟶ 529:
 
<pre>
21C3 28 D3 ld hl,jp ITEM_6_ID
E9 jp hl
</pre>
 
===Raw Assembly===
 
<pre>21C3 28 D3 E9</pre>
 
==Nickname Writer==
Line 555 ⟶ 545:
 
<pre>
11 9CB5 D8 ld de, $D89CD8B5 ; location written to
D5 push de
.newMail
D5 push de
21 24 65 ld hl, AskName + 39h ; Prepares data and calls DisplayNamingScreen
06 01 ld b, 01
CD 22 39 call $3922 ; sets b to 01, then jumps to Bankswitch, calling b:hl
21 5C 65 ld hl, DisplayNameRaterScreen
CD D6 35 call BankSwitch ; Change rom banks and call b:hl
0E 80 ld c, $80 ; Ensure checksum consistency
21 4B CF ld hl, wStringBuffer ; Address where new name gets written to
Line 578 ⟶ 567:
18 F3 jp .newChar
.terminator
21 29 C4 ld hl, $C429 ; Corresponds to screen tile
0E 01 ld c, 01
D5 push de
21 2900 C4 ld hl, $C429C400 ; Corresponds to screen tile
CD DF 15 call PrintBCDNumber.loop ; Prints c amount of bytes at de to hl in binary coded decimal format, prints checksum
0E 01 ld c, $01 ; How many bytes printed as numbers?
CD DF 15 call PrintBCDNumber.loop
.numLoop
1B2D dec del
CB FE set 7, (hl)
20 FB jp nz, .numLoop ; Repeat until hl == $C400
.inputLoop
CD 31 38 call JoypadLowSensitivity ; Halt execution until frame has passed, get joypad status and store result in hJoy5
3EF0 21B5 ld a, $21(hJoy5)
E6 0F and $0F ; Set z flag if A, B, START, SELECT not pressed
28 F7 jp z, .inputLoop
1F rra ; isIs BA pressed? If yes, set c flag
D1 pop de
F038 B5CB ldjr ac, (hJoy5).newMail
A7 and a ; Check if no buttons are pressed
28 EE jp z, .terminator ; If no buttons pressed, keep displaying checksum
1F rra ; Shift all bits to the right, transfer former bit 7 to bit 1 and store status of this bit in c flag
38 CF jp c, .loop ; Is A is pressed, start new nickname
1B dec de ; If another button outside of A is pressed, either we're using the correction function, executing or stopping
1F rra ; is B pressed?
38 E7 jp c, .terminator ; If B is pressed, de has been decremented once so continue just displaying the new value de points towards
1F rra
1F rra ; Is START pressed?
D8 ret c ; Jump to $D89C, which was pushed to the stack at the start of the code and execute newly written code
1B dec de
1B dec de
1B dec de
1F rra ; Is STARTB pressed? If yes, set c flag
1B dec de ; de's value has been decremented a total of 5 times, equal to a full nickname's worth of data
38 E1 jr c, .terminator
17 rla ; Shift all bits to the left, transfer former bit 7 to bit 1 and store status of this bit in c flag. Is SELECT pressed?
1F rra ; Is SELECT pressed? If yes, set c flag
30 C1 jp nc, loop ; If SELECT NOT pressed and dpad pressed instead, start new mail after de has been decremented a total of 5 times. Basically undoes a full nickname's worth of data
E1 pop hl ; Otherwise, pop the storedstarting address of $D89C from theto stackhl
C9D8 ret c ; SinceIf $D89CSELECT was poppedpressed, simply return to normal execution without executing newly written codeoperations
E9 jp hl ; If START pressed, jump to hl to execute newly written code
</pre>
 
Line 608 ⟶ 595:
 
<pre>
11 9CB5 D8 D5 D5
06 01 21 5C 65 CD 22
CD D6 3539 0E 80 21 4B
21 4B CF D1 2A 87 30
87 30 09 86 12 13 23
13 23 81 12 4F 18 F3
18 F3D5 21 2901 C4 4D
0ECD 01DF D515 CD2D DFCB
15FE CD20 31FB 3875 D1CD
F031 B538 A7F0 28B5 EEE6
1F0F 3828 CFF7 1B1F 1FD1
38 E7CB 1F1B 1F D838
1BE1 1B1F 1BE1 1BD8 17E9
30 C1 E1 C9 00
</pre>
 
Line 734 ⟶ 720:
01 59 C3 2E 3E
</pre>
 
[[Category:Guides]]
1,540

edits

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