implement extended $loadchar on GC
This commit is contained in:
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DB0E0 # malloc9
|
||||
.data 0x802021D0 # get_character_file
|
||||
.data 0x802021AC # get_selected_character_file_index
|
||||
.data 0x805C5760 # char_file_part1
|
||||
.data 0x805C5764 # char_file_part2
|
||||
.data 0x805C4D80 # root_protocol (anchor: send_05)
|
||||
.data 0x803DB138 # free9
|
||||
.data 0x800787B0 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DB138 # malloc9
|
||||
.data 0x802021D0 # get_character_file
|
||||
.data 0x802021AC # get_selected_character_file_index
|
||||
.data 0x805CC740 # char_file_part1
|
||||
.data 0x805CC744 # char_file_part2
|
||||
.data 0x805CBD60 # root_protocol (anchor: send_05)
|
||||
.data 0x803DB190 # free9
|
||||
.data 0x800787B0 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DE838 # malloc9
|
||||
.data 0x80202BA0 # get_character_file
|
||||
.data 0x80202B7C # get_selected_character_file_index
|
||||
.data 0x805D5F60 # char_file_part1
|
||||
.data 0x805D5F64 # char_file_part2
|
||||
.data 0x805D5580 # root_protocol (anchor: send_05)
|
||||
.data 0x803DE890 # free9
|
||||
.data 0x8007889C # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803D9E38 # malloc9
|
||||
.data 0x802019D4 # get_character_file
|
||||
.data 0x802019B0 # get_selected_character_file_index
|
||||
.data 0x805C4E68 # char_file_part1
|
||||
.data 0x805C4E6C # char_file_part2
|
||||
.data 0x805C4488 # root_protocol (anchor: send_05)
|
||||
.data 0x803D9E90 # free9
|
||||
.data 0x8007848C # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DC818 # malloc9
|
||||
.data 0x80202248 # get_character_file
|
||||
.data 0x80202224 # get_selected_character_file_index
|
||||
.data 0x805CF430 # char_file_part1
|
||||
.data 0x805CF434 # char_file_part2
|
||||
.data 0x805CEA50 # root_protocol (anchor: send_05)
|
||||
.data 0x803DC870 # free9
|
||||
.data 0x800785F0 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DE6B8 # malloc9
|
||||
.data 0x801FD950 # get_character_file
|
||||
.data 0x80222C0C # get_selected_character_file_index
|
||||
.data 0x805D68B0 # char_file_part1
|
||||
.data 0x805D68B4 # char_file_part2
|
||||
.data 0x805D5ED0 # root_protocol (anchor: send_05)
|
||||
.data 0x803DE710 # free9
|
||||
.data 0x80078748 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DE468 # malloc9
|
||||
.data 0x8020286C # get_character_file
|
||||
.data 0x80202848 # get_selected_character_file_index
|
||||
.data 0x805D6650 # char_file_part1
|
||||
.data 0x805D6654 # char_file_part2
|
||||
.data 0x805D5C70 # root_protocol (anchor: send_05)
|
||||
.data 0x803DE4C0 # free9
|
||||
.data 0x800786A0 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+3
-6
@@ -6,14 +6,11 @@ entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
mflr r12
|
||||
bl get_data_addr
|
||||
.include GetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x803DD328 # malloc9
|
||||
.data 0x80202AB4 # get_character_file
|
||||
.data 0x80202A90 # get_selected_character_file_index
|
||||
.data 0x805D21A0 # char_file_part1
|
||||
.data 0x805D21A4 # char_file_part2
|
||||
.data 0x805D17C0 # root_protocol (anchor: send_05)
|
||||
.data 0x803DD380 # free9
|
||||
.data 0x80078820 # TProtocol_wait_send_drain
|
||||
get_data_addr:
|
||||
.include GetExtendedPlayerInfoGC
|
||||
+23
-14
@@ -1,9 +1,13 @@
|
||||
stwu [r1 - 0x20], r1
|
||||
stw [r1 + 0x24], r12
|
||||
mflr r0
|
||||
stw [r1 + 0x24], r0
|
||||
stw [r1 + 0x08], r31
|
||||
stw [r1 + 0x0C], r30
|
||||
stw [r1 + 0x10], r29
|
||||
stw [r1 + 0x14], r28
|
||||
|
||||
b get_data_ptr
|
||||
get_data_ptr_ret:
|
||||
mflr r30
|
||||
|
||||
li r3, 0x279C
|
||||
@@ -17,21 +21,23 @@
|
||||
ori r0, r0, 0x9C27
|
||||
stw [r31], r0 # header = 30 00 9C 27
|
||||
|
||||
lwz r0, [r30 + 0x04]
|
||||
mtctr r0
|
||||
bctrl # get_character_file
|
||||
mr r28, r3
|
||||
|
||||
lwz r0, [r30 + 0x08]
|
||||
mtctr r0
|
||||
bctrl # get_selected_character_file_index
|
||||
mulli r3, r3, 0x2798
|
||||
addi r3, r3, 4
|
||||
add r4, r3, r28 # r4 = &character_file->characters[selected_char_file_index]
|
||||
addi r3, r31, 4
|
||||
li r5, 0x2798
|
||||
lwz r4, [r30 + 0x04]
|
||||
lwz r4, [r4] # r4 = char_file_part1
|
||||
addi r3, r31, 0x0004
|
||||
li r5, 0x041C # sizeof(part1)
|
||||
bl memcpy
|
||||
|
||||
lwz r4, [r30 + 0x08]
|
||||
lwz r4, [r4] # r4 = char_file_part2
|
||||
addi r3, r31, 0x0420
|
||||
li r5, 0x2370 # sizeof(part2)
|
||||
bl memcpy
|
||||
|
||||
li r0, 0
|
||||
stw [r31 + 0x2790], r0
|
||||
stw [r31 + 0x2794], r0
|
||||
stw [r31 + 0x2798], r0
|
||||
|
||||
mr r28, r31
|
||||
li r29, 0x279C
|
||||
send_again:
|
||||
@@ -79,3 +85,6 @@ malloc9_failed:
|
||||
memcpy:
|
||||
.include CopyDataWords
|
||||
blr
|
||||
|
||||
get_data_ptr:
|
||||
bl get_data_ptr_ret
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805C5758 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805CC738 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805D5F58 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805C4E60 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805CF428 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805D68A8 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805D6648 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,12 @@
|
||||
.meta hide_from_patches_menu
|
||||
.meta name="SetExtendedPlayerInfo"
|
||||
.meta description=""
|
||||
|
||||
entry_ptr:
|
||||
reloc0:
|
||||
.offsetof start
|
||||
start:
|
||||
.include SetExtendedPlayerInfoGC
|
||||
data:
|
||||
.data 0x805D2198 # character_file
|
||||
# Server adds a PSOGCCharacterFile::Character here
|
||||
@@ -0,0 +1,37 @@
|
||||
mflr r12
|
||||
bl get_data_ptr
|
||||
get_data_ptr_ret:
|
||||
mflr r11
|
||||
|
||||
lwz r10, [r11]
|
||||
|
||||
# Copy part1 data into place
|
||||
lwz r3, [r10 + 0x08]
|
||||
addi r4, r11, 0x0004
|
||||
li r5, 0x41C
|
||||
bl memcpy
|
||||
|
||||
# Copy part2 data into place, but retain the values of a few metadata fields
|
||||
# so the game won't think the file is corrupt
|
||||
lwz r3, [r10 + 0x0C]
|
||||
lwz r7, [r3 + 0x04] # creation_timestamp
|
||||
lwz r8, [r3 + 0x08] # signature
|
||||
lwz r9, [r3 + 0x14] # save_count
|
||||
addi r4, r11, 0x0420
|
||||
li r5, 0x2370
|
||||
bl memcpy
|
||||
lwz r3, [r10 + 0x0C]
|
||||
stw [r3 + 0x04], r7 # creation_timestamp
|
||||
stw [r3 + 0x08], r8 # signature
|
||||
stw [r3 + 0x14], r9 # save_count
|
||||
|
||||
li r3, 1
|
||||
mtlr r12
|
||||
blr
|
||||
|
||||
memcpy:
|
||||
.include CopyDataWords
|
||||
blr
|
||||
|
||||
get_data_ptr:
|
||||
bl get_data_ptr_ret
|
||||
@@ -1,7 +1,7 @@
|
||||
# r3 = dest ptr
|
||||
# r4 = src ptr
|
||||
# r5 = size
|
||||
# Clobbers r3, r4, r5
|
||||
# Clobbers r3, r4, r5, ctr
|
||||
addi r5, r5, 3
|
||||
rlwinm r5, r5, 30, 2, 31 # r5 = number of words to copy
|
||||
mtctr r5
|
||||
|
||||
Reference in New Issue
Block a user