implement full character backups on GC

This commit is contained in:
Martin Michelsen
2024-04-06 19:52:22 -07:00
parent 91131f8b36
commit af4d3a3325
64 changed files with 3155 additions and 2208 deletions
@@ -0,0 +1,13 @@
# r3 = dest ptr
# r4 = src ptr
# r5 = size
# Clobbers r3, r4, r5
addi r5, r5, 3
rlwinm r5, r5, 30, 2, 31 # r5 = number of words to copy
mtctr r5
subi r3, r3, 4 # r3 = r3 - 4 (so we can use stwu)
subi r4, r4, 4 # r4 = r4 - 4 (so we can use lwzu)
copy_word_again:
lwzu r5, [r4 + 4]
stwu [r3 + 4], r5
bdnz copy_word_again
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DB0E0 # malloc9
.data 0x802021D0 # get_character_file
.data 0x802021AC # get_selected_character_file_index
.data 0x805C4D80 # root_protocol (anchor: send_05)
.data 0x803DB138 # free9
.data 0x800787B0 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DB138 # malloc9
.data 0x802021D0 # get_character_file
.data 0x802021AC # get_selected_character_file_index
.data 0x805CBD60 # root_protocol (anchor: send_05)
.data 0x803DB190 # free9
.data 0x800787B0 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DE838 # malloc9
.data 0x80202BA0 # get_character_file
.data 0x80202B7C # get_selected_character_file_index
.data 0x805D5580 # root_protocol (anchor: send_05)
.data 0x803DE890 # free9
.data 0x8007889C # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803D9E38 # malloc9
.data 0x802019D4 # get_character_file
.data 0x802019B0 # get_selected_character_file_index
.data 0x805C4488 # root_protocol (anchor: send_05)
.data 0x803D9E90 # free9
.data 0x8007848C # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DC818 # malloc9
.data 0x80202248 # get_character_file
.data 0x80202224 # get_selected_character_file_index
.data 0x805CEA50 # root_protocol (anchor: send_05)
.data 0x803DC870 # free9
.data 0x800785F0 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DE6B8 # malloc9
.data 0x801FD950 # get_character_file
.data 0x80222C0C # get_selected_character_file_index
.data 0x805D5ED0 # root_protocol (anchor: send_05)
.data 0x803DE710 # free9
.data 0x80078748 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DE468 # malloc9
.data 0x8020286C # get_character_file
.data 0x80202848 # get_selected_character_file_index
.data 0x805D5C70 # root_protocol (anchor: send_05)
.data 0x803DE4C0 # free9
.data 0x800786A0 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,19 @@
# .meta hide_from_patches_menu
.meta name="GetExtendedPlayerInfo"
.meta description=""
entry_ptr:
reloc0:
.offsetof start
start:
mflr r12
bl get_data_addr
data:
.data 0x803DD328 # malloc9
.data 0x80202AB4 # get_character_file
.data 0x80202A90 # get_selected_character_file_index
.data 0x805D17C0 # root_protocol (anchor: send_05)
.data 0x803DD380 # free9
.data 0x80078820 # TProtocol_wait_send_drain
get_data_addr:
.include GetExtendedPlayerInfoGC
@@ -0,0 +1,81 @@
stwu [r1 - 0x20], r1
stw [r1 + 0x24], r12
stw [r1 + 0x08], r31
stw [r1 + 0x0C], r30
stw [r1 + 0x10], r29
stw [r1 + 0x14], r28
mflr r30
li r3, 0x279C
lwz r0, [r30]
mtctr r0
bctrl # malloc9
mr. r31, r3
beq malloc9_failed
lis r0, 0x3000
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
bl memcpy
mr r28, r31
li r29, 0x279C
send_again:
lwz r3, [r30 + 0x0C]
lwz r0, [r30 + 0x14]
mtctr r0
bctrl # TProtocol_wait_send_drain(root_protocol)
mr. r0, r3
bne drain_failed
lwz r3, [r30 + 0x0C]
lwz r3, [r3] # root_protocol
mr r4, r28
mr r5, r29
cmplwi r5, 0x05B4
ble skip_adjust_size
li r5, 0x05B4
skip_adjust_size:
add r28, r28, r5
sub r29, r29, r5
lwz r12, [r3 + 0x18]
lwz r12, [r12 + 0x28]
mtctr r12
bctrl # root_protocol->send(&cmd, sizeof(cmd))
cmplwi r29, 0
bne send_again
drain_failed:
mr r3, r31
lwz r0, [r30 + 0x10]
mtctr r0
bctrl # free9
li r3, 1
malloc9_failed:
lwz r28, [r1 + 0x14]
lwz r29, [r1 + 0x10]
lwz r30, [r1 + 0x0C]
lwz r31, [r1 + 0x08]
lwz r0, [r1 + 0x24]
addi r1, r1, 0x20
mtlr r0
blr
memcpy:
.include CopyDataWords
blr