08-08-2020, 01:56 AM
(This post was last modified: 03-14-2025, 02:17 PM by Vega.
Edit Reason: many optimizations
)
Change Mii Name In Between Races -Online- [Vega]
This code will allow you to change Mii Names in between online races/battles via two different button activators. Everyone will see the effects. As an fyi, Mii Names use 16-bit ASCII.
STUV = Mii Name Characters to fill in. If full Mii name isn't used, fill in rest of values with 0000.
XXXX = Controller Address
ZZZZ = Activator to Change to new Mii Name
zzzz = Activator to Change back to original Mii Name
q value (PAL Code Only):
5 = GCN
4 = Non-GCN
Do NOT press/hold-down other buttons when pressing an activator.
Appropriate Times of when to Press ZZZZ/zzzz~
If you press ZZZZ/zzzz at any other time, the Mii Name may not update til race after next, or they won't be in sync (what opponents see won't match what you see)
NOTE: This code uses memory addresses 0x800007D0 thru 0x800007D3. Make sure no other codes in your GCT/Cheat-Manager are using those addresses.
Video - https://www.youtube.com/watch?v=MwQekiMjEKU
PAL
C25FB094 00000002
3C808000 8003006C
906407D0 00000000
C21AA9CC 00000019
7C7E1B78 3D80809C
818C2108 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D60803q A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C78D0 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-U
C25DA7B0 00000002
3C808000 8003006C
906407D0 00000000
C21AA92C 00000019
7C7E1B78 3D80809C
818CD958 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608034 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C7830 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-J
C25FA970 00000002
3C808000 8003006C
906407D0 00000000
C21AA8EC 00000019
7C7E1B78 3D80809C
818C1168 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608034 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C77F0 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-K
C25E94B4 00000002
3C808000 8003006C
906407D0 00000000
C21AAD28 00000019
7C7E1B78 3D80809B
818C0748 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608033 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D96B8
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C7930 3880004C
7D8903A6 4E800421
B07F004A 00000000
Code creator: Vega
Code credits: Seeky (USER Static Ptr)
First ASM:
Second ASM:
This code will allow you to change Mii Names in between online races/battles via two different button activators. Everyone will see the effects. As an fyi, Mii Names use 16-bit ASCII.
STUV = Mii Name Characters to fill in. If full Mii name isn't used, fill in rest of values with 0000.
XXXX = Controller Address
ZZZZ = Activator to Change to new Mii Name
zzzz = Activator to Change back to original Mii Name
q value (PAL Code Only):
5 = GCN
4 = Non-GCN
Do NOT press/hold-down other buttons when pressing an activator.
Appropriate Times of when to Press ZZZZ/zzzz~
- During a Race
- At Results Screen
- At Screen to choose between Next Race or Quit
- In Idle Room before Host starts room
If you press ZZZZ/zzzz at any other time, the Mii Name may not update til race after next, or they won't be in sync (what opponents see won't match what you see)
NOTE: This code uses memory addresses 0x800007D0 thru 0x800007D3. Make sure no other codes in your GCT/Cheat-Manager are using those addresses.
Video - https://www.youtube.com/watch?v=MwQekiMjEKU
PAL
C25FB094 00000002
3C808000 8003006C
906407D0 00000000
C21AA9CC 00000019
7C7E1B78 3D80809C
818C2108 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D60803q A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C78D0 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-U
C25DA7B0 00000002
3C808000 8003006C
906407D0 00000000
C21AA92C 00000019
7C7E1B78 3D80809C
818CD958 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608034 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C7830 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-J
C25FA970 00000002
3C808000 8003006C
906407D0 00000000
C21AA8EC 00000019
7C7E1B78 3D80809C
818C1168 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608034 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D9698
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C77F0 3880004C
7D8903A6 4E800421
B07F004A 00000000
NTSC-K
C25E94B4 00000002
3C808000 8003006C
906407D0 00000000
C21AAD28 00000019
7C7E1B78 3D80809B
818C0748 2C0C0000
418200B4 880C0000
2C000000 418200A8
3D608033 A16BXXXX
280BZZZZ 3D408000
814A07D0 41820028
280Bzzzz 40A20088
892A0008 816D96B8
1D29004A 816B0010
7D6B4A14 396B0002
48000024 4800001D
00000000 STUVSTUV
STUVSTUV STUVSTUV
STUVSTUV STUVSTUV
7D6802A6 38000005
394A0064 3BEC0010
398C000E 7C0903A6
840B0004 940A0004
940C0004 4200FFF4
38000000 B01F004A
3D80800C 7FE3FB78
618C7930 3880004C
7D8903A6 4E800421
B07F004A 00000000
Code creator: Vega
Code credits: Seeky (USER Static Ptr)
First ASM:
Code:
#This code stores the r3 ptr (Your Slef Mii Struct ptr thingy) to the exception vector area
#Address Ports
#PAL 805FB094
#NTSC-U 805DA7B0
#NTSC-J 805FA970
#NTSC-K 805E94B4
lis r4, 0x8000 #r4 safe for use
lwz r0, 0x006C (r3) #Original Instruction
stw r3, 0x7D0 (r4) #Save the ptr
Second ASM:
Code:
#Hooked at Arg Save of OSSleepThread
#PAL 801AA9CC
#NTSC-U 801AA92C
#NTSC-J 801AA8EC
#NTSC-K 801AAD28
#Region Assembling Option
.set region, '' #Fill in E, P, J, or K within the quotes for your region when Compiling! Lowercase letters can also be used.
#EVA Notes
#800007D0 (word) is Online Self Mii Struct Ptr
#NOTE: There's NO need to make a Stack Frame because the only register that needs to be intact now is r30 and that was already saved earlier in the Hook's Func Prologue. The only non-vol register this code edits is r31, old r31 was already saved too, and new r31 gets written by game 5 sequential instructions after Hook Address. r3 doesn't need to be saved because next Hook's Child Func requires No Args.
#Directives
.if (region == 'P' || region == 'p') #PAL
.set USER_Static_ptr, 0x809c2108
.set CRC16, 0x800C78D0
.macro load_unk_ptr register
lwz \register, -0x6968 (r13) #func 0x800bc3e0
.endm
.elseif (region == 'E' || region == 'e') #NTSC-U
.set USER_Static_ptr, 0x809bd958
.set CRC16, 0x800C7830
.macro load_unk_ptr register
lwz \register, -0x6968 (r13) #func 0x800bc340
.endm
.elseif (region == 'J' || region == 'j') #NTSC-J
.set USER_Static_ptr, 0x809c1168
.set CRC16, 0x800C77F0
.macro load_unk_ptr register
lwz \register, -0x6968 (r13) #func 0x800bc300
.endm
.elseif (region == 'K' || region == 'k') #NTSC-K
.set USER_Static_ptr, 0x809b0748
.set CRC16, 0x800C7930
.macro load_unk_ptr register
lwz \register, -0x6948 (r13) #func 0x800bc440
.endm
.else #Invalid Region
.err #Region match not detected. Tell the Assembler to halt and throw an error.
.endif
#Original Instruction: Save r3 (only) Arg of OSSleepThread
mr r30, r3
#Load USER Packet Static Ptr. Check if we have one, and then check if a room is active
lis r12, USER_Static_ptr@ha
lwz r12, USER_Static_ptr@l (r12)
cmpwi r12, 0
beq- end
lbz r0, 0 (r12)
cmpwi r0, 0 #Will be non-null if room is active
beq- end
#Check if ZZZZ was pressed
lis r11, 0x8035 #GCN PAL used for test source
lhz r11, 0xFFFF8200 (r11) #GCN PAL used for test source
cmplwi r11, 0x0880 #GCN Y button used for test source
#Grab Online Self Mii Struct Ptr Thingy
lis r10, 0x8000
lwz r10, 0x7D0 (r10)
#Now branch for ZZZZ
beq- grab_mii_name_from_table
#Check if zzzz was pressed
cmplwi r11, 0x0480 #GCN X button used for test source
bne+ end
#Since zzzz pressed, set r11 to MiiName-4 in Mii Database
lbz r9, 0x8 (r10) #Grab Mii DB Index from Online Self Mii Struct Thingy
load_unk_ptr r11
mulli r9, r9, 74 #Each Mii Entry is 74 bytes in len
lwz r11, 0x10 (r11) #Grab Mii DB root ptr
add r11, r11, r9 #Will point to MiiData-4 because we didn't account for 4-byte RNOD Magic Header
addi r11, r11, 2 #Add 2 so we're at MiiName-4 (Mii Name starts at 0x2 offset of Mii Data)
b transfer_mii_name
#Since ZZZZ pressed set r11 to MiiName-4 in Table
grab_mii_name_from_table:
bl mii_names
.long 0x00000000 #Padding to reduce source by 1 executable instruction
.llong 0x006d006b00770069 #mkwii.com\0 used for example Mii name
.llong 0x0069002e0063006f
.long 0x006d0000
mii_names:
mflr r11
#Copy Mii Name from Table/DB to Mii Struct & USER Packet
transfer_mii_name:
li r0, 5 #5 words is 20 bytes
addi r10, r10, 0x64 #Points to Mii Name-4 in Online Self Struct
addi r31, r12, 0x10 #Need exact ptr to USER Packet Mii DATA (not name) for later CRC16 checksumming
addi r12, r12, 0xE #Points to your Mii Name-4 in USER Packet
mtctr r0
loop:
lwzu r0, 0x4 (r11)
stwu r0, 0x4 (r10)
stwu r0, 0x4 (r12)
bdnz+ loop
#Write over current Mii Checksum in USER Packet, game CRC's Mii Data with an included null checksum
li r0, 0
sth r0, 0x4A (r31)
#Setup args for CRC16 and call it
lis r12, CRC16@h
mr r3, r31
ori r12, r12, CRC16@l
li r4, 0x4C #Size of Mii Data w/ null checksum
mtctr r12
bctrl
#Write new checksum
sth r3, 0x4A (r31)
#END Code
end: