Guides:Fast 0x1500 ACE: Difference between revisions
Jump to navigation
Jump to search
m
no edit summary
mNo edit summary |
mNo edit summary |
||
(19 intermediate revisions by 2 users not shown) | |||
Line 7:
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].
'''When playing on cartridge or emulator, it is
The contents of this guide are demonstrated in the following video:
{{youtube|iJRb3PwUrkg|TimoVM}}
=Setting up initial ACE=
Line 76 ⟶ 80:
{| class="wikitable" style="margin-left: auto; margin-right: auto; border: none;"
|
[[File:
||
[[File:
|}
Line 102 ⟶ 106:
# Sell TMs in specific quantities so that the amount of TMs in the TM/HM pocket spell out a small mail writer program.
==Step 4:
* Rename box names to form the following language dependent codes. '''Please mind the differences between uppercase X ([[File:Character UCX.png]]), lowercase x ([[File:Character lcx.png]]) and multiplication symbol ([[File:Character mul.png]]).'''
Line 336 ⟶ 340:
|-
! scope="row"| English
|| <pre>Box 1: 0 ♀ ♀ Pk ? ♂ E
Box 2:
Box 3: 'v 9 é [SPACE] 5 'v , F
Box 4: 's [SPACE] 5 ? E 's [SPACE] 5
Line 348 ⟶ 352:
Box 11: 'v 9 é E 5 Pk 0 9
Box 12: 's B 5 é C 5 Pk 'v
Box 13: 'v Pk é T 2
Box 14: p 0 5 ♀ Pk 'v G 1</pre>
! scope="row" | Italian
|| <pre>Box 1: 0 ♀ ♀ Pk ? ¡ E
Box 2:
Box 3: ° 9 é [SPACE] 5 ° , F
Box 4: ó [SPACE] 5 ? E ó [SPACE] 5
Line 363 ⟶ 367:
Box 11: ° 9 é E 5 Pk 0 9
Box 12: ó B 5 é C 5 Pk °
Box 13: ° Pk é T 2
Box 14: p 0 5 ♀ Pk ° G 1</pre>
! scope="row"| Spanish
|| <pre>
Box 2:
Box 3: ° 9 é [SPACE] 5 ° , F
Box 4: ó [SPACE] 5 ? E ó [SPACE] 5
Line 378 ⟶ 382:
Box 11: ° 9 é E 5 Pk 0 9
Box 12: ó B 5 é C 5 Pk °
Box 13: ° Pk é T 2
Box 14: p 0 5 ♀ Pk ° G 1</pre>
|}
Line 395 ⟶ 399:
Box 5: 0 'm 's h 5 'v M F
Box 6: 's h 5 'v B A 'd Pk
Box 7: Pk
Box 14: p 0 5 ♀ Pk 'v G 1</pre>
! scope="row" | Italian
|| <pre>Box 1: p 0 Mn È 2 ♀ Pk 5
Box 2: ° y é
Box 3: Ù
Box 4: È Á Ù
Box 5: Ù
Box 6: Pk Pk
Box 14: p 0 5 ♀ Pk ° G 1 </pre>
! scope="row"| Spanish
|| <pre>Box 1: p 0 Mn È 2 ♀ Pk 5
Box 2: ° y é
Box 3: Ù
Box 4: È Á Ù
Box 5: Ù
Box 6: Pk Pk
Box 14: p 0 5 ♀ Pk ° G 1 </pre>
Line 430 ⟶ 434:
! Address !! Function
|-
| $C4A0 || Starting address of wTilemap
|-
| $C4BE || Address of the tilemap where the name of the current active box will be printed when viewing the withdraw screen.
|-
| $CD70 || Starting address of wBGMapBufferPointers
|-
| $D073 || Address where the names of pokémon are buffered.
Line 439 ⟶ 447:
|-
| $D109 || Address where the current selected party pokémon’s party slot is buffered.
|}
*
* Selecting Spearow in the party screen will buffer 15 00 at $D108.
* Viewing the unterminated name pokémon in the withdraw screen will cause the game to attempt to print its name. Since the name doesn't contain a terminator, the game will continue printing text until it find and executes the $15 control character at $D108.
* The presence of the $00 at $D109 will erroneously cause the game to call $CD52. Due to the specific movement pattern and location used, the area between $CD52 and $CD70 is filled with $00 values, allowing safe passage.
* Thanks to the jump buffered at $CD70, the game will jump to $C49B. Since we're in the withdraw screen, the area between $C49B and $C4A0 is filled with $00 values, allowing safe passage. The jump will always pass, since both the carry and zero flags are reset when the game calls $CD52.
* Between $C4A0 and $C4BE are a bunch of screen tiles that are either blank ($7F) or edges of text boxes ($79, $7A, $7B and $7C). These opcodes are all harmless and simply load register values to other registers, allowing safe passage.
* $C4BE holds the text characters of the current active box, allowing us to form arbitrary jumps to other locations in memory.
===Effect of the test box name===
====English====
<pre>
E1 pop hl
E1 pop hl ; popping hl twice then returning will cause the game to continue printing from de to hl. The second pop ensures hl will point to the $7000 region, allowing safe exit.
A7 and a ; reset carry flag
D0 ret nc ; Safely return to normal game operation
</pre>
Line 490 ⟶ 473:
<pre>
E1 pop hl
E1 pop hl ; popping hl twice then returning will cause the game to continue printing from de to hl. The second pop ensures hl will point to the $7000 region, allowing safe exit.
C9 ret ; Safely return to normal game operation
</pre>
Line 503 ⟶ 488:
<pre>
Box 1: $DB75
F5 push af
E1 pop hl ; hl = $F500
84 add a, h ; af = $DA10
E1 pop hl
50 ld d, b
Box 2: $DB7E
F5 push af
E1 pop hl ; hl = $DA10, overwritten to $22, ldi (hl), a
D0 ret nc ; On first pass, ignored. Taken whenever $DB7F is called
D6 B9 sub $B9 ; a = $21
EA 81 FB ld ($FB81), a
50 ld d, b
Box 3: $DB87
D6 FF sub $FF ; a = $22
EA 7F FB ld ($FB7F), a
D6 F4 sub $F4 ; a = $2E
85 add a, l ; a = $3E, reset carry flag
50 ld d, b
Box 4: $DB90
50 ld d, b
Box 5: $DB99
FB ei
50 ld d, b
Box 6: $DBA2
EA
D6 F1 sub $F1 ; a = $41
EA 88 FB ld ($FB88), a
50 ld d, b
Box 7: $DBAB
F6 82 or $82 ; a = $C3, reset carry flag
D4 7F FB call nc, $FB7F
EA 87 FB ld ($FB87), a
50 ld d, b
Box 8: $DBB4
EA
F5 push af
D6 A7 sub $A7 ; a = $59
A7 and a ; Reset carry flag
50 ld d, b
Box 9: $DBBD
EA
50 ld d, b
Box 10: $DBC6
D4 7F FB call nc, $FB7F
EA 83 FB ld ($FB83), a
F1 pop af ; a = $00
50 ld d, b
Box 11: $DBCF
D6 FF sub $FF ; a = $01
E1 pop hl
50 ld d, b
Box 12: $DBD8
D4 81 FB call nc, $FB81 ; $FB81 was rewritten to 21 59 D8 01 32 00 C3 41 30
EA 82 FB ld ($FB82), a ; Replace $59 by $FF to prevent possible crash when viewing $59 as text
E1 pop hl
Box 13: $DBE1
D6 E1 sub $E1 ; a = $CE
EA 93 F8 ld (wItems), a ; Replace first item in item pocket with TM15
AF xor a ; a = $00
85 add a, l
F7 rst30h ; Resume text function, immediately hit terminator
50 ld d, b
Box 14: displayed as screen tiles at $C4BE
AF xor a ; a = $00
F6 FB or $FB ; a = $FB
F5 push af
E1 pop hl ; h = $FB
D6 86 sub $86 ; a = $75
F7 rst30h ; hl = $FB75, de = $C4C5, jump to hl
Bootstrap: $DA10
Line 600 ⟶ 595:
<pre>
Box 1: $DB75
F5 push af
E1 pop hl ; hl = $F500
E6 E5 and $E5 ; a = $E5
84 add a, h ; af = $DA10
E1 pop hl
50 ld d, b
Box 2: $DB7E
F5 push af
E1 pop hl ; hl = $DA10, overwritten to $22, ldi (hl), a
D0 ret nc ; On first pass, ignored. Taken whenever $DB7F is called
D6 B9 sub $B9 ; a = $21
EA 81 FB ld ($FB81), a
50 ld d, b
Box 3: $DB87
D6 FF sub $FF ; a = $22
EA 7F FB ld ($FB7F), a
D6 F4 sub $F4 ; a = $2E
85 add a, l ; a = $3E, reset carry flag
50 ld d, b
Box 4: $DB90
E6 84 and $84 ; a = $04
50 ld d, b
Box 5: $DB99
D6 D5 sub $D5 ; a = $2F
EA 88 FB ld ($FB88), a
D6 FF sub $FF ; a = $30
FB ei
50 ld d, b
Box 6: $DBA2
EA 89
D6 FE sub $FE ; a = $32
EA 85 FB ld ($FB85), a
50 ld d, b
Box 7: $DBAB
D4 7F FB call nc, $FB7F
EA 87 FB ld ($FB87), a
50 ld d, b
Box 8: $DBB4
F5 push af
D6 A7 sub $A7 ; a = $59
A7 and a ; Reset carry flag
50 ld d, b
Box 9: $DBBD
EA 82 FB ld ($FB82), a
D6 81 sub $81 ; a = $D8
50 ld d, b
Box 10: $DBC6
D4 7F FB call nc, $FB7F
EA 83 FB ld ($FB83), a
F1 pop af ; a = $00
50 ld d, b
Box 11: $DBCF
D6 FF sub $FF ; a = $01
EA 84 FB ld ($FB84), a
E1 pop hl
F6 FF or $FF ; a = $FF
50 ld d, b
Box 12: $DBD8
D4 81 FB call nc, $FB81 ; $FB81 was rewritten to 21 59 D8 01 32 00 C3 2F 30
EA 82 FB ld ($FB82), a ; Replace $59 by $FF to prevent possible crash when viewing $59 as text
E1 pop hl
D6 50 sub $50 ; a = $AF
Box 13: $DBE1
D6 E1 sub $E1 ; a = $CE
EA 93 F8 ld (wItems), a ; Replace first item in item pocket with TM15
AF xor a ; a = $00
85 add a, l
F7 rst30h ; Resume text function, immediately hit terminator
50 ld d, b
Box 14: displayed as screen tiles at $C4BE
AF xor a ; a = $00
F6 FB or $FB ; a = $FB
F5 push af
E1 pop hl ; h = $FB
D6 86 sub $86 ; a = $75
F7 rst30h ; hl = $FB75, de = $C4C5, jump to hl
Bootstrap: $DA10
Line 673 ⟶ 702:
<pre>
Box 1: $DB75
F5 push af
E1 pop hl ; hl = $F500
E6 E5 and $E5 ; a = $E5
84 add a, h ; af = $DA10
E1 pop hl
50 ld d, b
Box 2: $DB7E
F5 push af
E1 pop hl ; hl = $DA10, overwritten to $22, ldi (hl), a
D0 ret nc ; On first pass, ignored. Taken whenever $DB7F is called
D6 B9 sub $B9 ; a = $21
EA 81 FB ld ($FB81), a
50 ld d, b
Box 3: $DB87
D6 FF sub $FF ; a = $22
EA 7F FB ld ($FB7F), a
D6 F4 sub $F4 ; a = $2E
85 add a, l ; a = $3E, reset carry flag
50 ld d, b
Box 4: $DB90
E6 84 and $84 ; a = $04
50 ld d, b
Box 5: $DB99
D6 D4 sub $D4 ; a = $30
EA 89 FB ld ($FB89), a
C6 FB add $FB ; a = $2B
FB ei
50 ld d, b
Box 6: $DBA2
EA 88
D6 F9 sub $F9 ; a = $32
EA 85 FB ld ($FB85), a
50 ld d, b
Box 7: $DBAB
D4 7F FB call nc, $FB7F
EA 87 FB ld ($FB87), a
50 ld d, b
Box 8: $DBB4
F5 push af
D6 A7 sub $A7 ; a = $59
A7 and a ; Reset carry flag
50 ld d, b
Box 9: $DBBD
EA 82 FB ld ($FB82), a
D6 81 sub $81 ; a = $D8
50 ld d, b
Box 10: $DBC6
D4 7F FB call nc, $FB7F
EA 83 FB ld ($FB83), a
F1 pop af ; a = $00
50 ld d, b
Box 11: $DBCF
D6 FF sub $FF ; a = $01
EA 84 FB ld ($FB84), a
E1 pop hl
F6 FF or $FF ; a = $FF
50 ld d, b
Box 12: $DBD8
D4 81 FB call nc, $FB81 ; $FB81 was rewritten to 21 59 D8 01 32 00 C3 2B 30
EA 82 FB ld ($FB82), a ; Replace $59 by $FF to prevent possible crash when viewing $59 as text
E1 pop hl
D6 50 sub $50 ; a = $AF
Box 13: $DBE1
D6 E1 sub $E1 ; a = $CE
EA 93 F8 ld (wItems), a ; Replace first item in item pocket with TM15
AF xor a ; a = $00
85 add a, l
F7 rst30h ; Resume text function, immediately hit terminator
50 ld d, b
Box 14: displayed as screen tiles at $C4BE
AF xor a ; a = $00
F6 FB or $FB ; a = $FB
F5 push af
E1 pop hl ; h = $FB
D6 86 sub $86 ; a = $75
F7 rst30h ; hl = $FB75, de = $C4C5, jump to hl
Bootstrap: $DA10
Line 859 ⟶ 922:
===Effect of the reset box name code===
Converting the characters from box names to assembly results in the following code. This code
====English====
Line 878 ⟶ 941:
E1 pop hl ; hl = $DA10
D6 B8 sub $B8 ; a = $22
EA
50 ld d, b
Box 3: $DB87
85 add a, l ; a = $33
D6 F4 sub $F4 ; a = $3E
A7 and a ; Reset carry flag
D4
AF xor a ; a = $00
50 ld d, b
Line 892 ⟶ 955:
D6 FC sub $FC ; a = $04
A7 and a ; Reset carry flag
D4
AF xor a ; a = $00
AF xor a
Line 899 ⟶ 962:
Box 5: $DB99
F6 D2 or $D2 ; a = $D2
D4
D6 8C sub $8C ; a = $46
85 add a, l ; a = $59
Line 905 ⟶ 968:
Box 6: $D8A2
D4
D6 81 sub $81 ; a = $D8, carry flag set
22 ldi (hl), a ; .write
D0
E1 pop hl
50 ld d, b
Box 7: $D8AC
E1 pop hl
E1 pop hl
AF xor a ; a = $00
85 add a, l
F7 rst30h ; Resume text function, immediately hit terminator
Box 14: displayed as screen tiles at $C4BE
AF xor a ; a = $00
F6 FB or $FB ; a = $FB
F5 push af
E1 pop hl ; h = $FB
D6 86 sub $86 ; a = $75
F7 rst30h ; hl = $FB75, de = $C4C5, jump to hl
</pre>
Line 930 ⟶ 1,005:
Box 2: $DB7E
D6 B8 sub $B8 ; a = $22
EA
85 add a, l
D6 F4 sub $F4 ; a = $3E
50 ld d, b
Box 3: $DB87
CD
C6 C6 add $C6 ; a = $04
CD
50 ld d, b
Box 4: $DB90
C6 BF add $BF ; a = $C3
CD
FB ei
C6 96 add $96 ; a = $59
Line 949 ⟶ 1,024:
Box 5: $DB99
CD
C6 7F add $7F ; a = $D8
CD A8 FB call .write
50 ld d, b
Box 6: $DBA2
E1 pop hl
E1 pop hl ; Prevent side effects when returning to text printer
E1 pop hl
AF xor a ; a = $00
85 add a, l
F7 rst30h ; Resume text function, immediately hit terminator
22 ldi (hl), a ; .write
C9 ret
Box 14: displayed as screen tiles at $C4BE
F6 FB or $FB ; a = $FB
F5 push af
E1 pop hl ; h = $FB
D6 86 sub $86 ; a = $75
F7 rst30h ; hl = $FB75, de = $C4C5, jump to hl
</pre>
[[Category:Guides]]
|