diff --git a/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OEF.patch.s b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OEF.patch.s new file mode 100644 index 00000000..a476f49b --- /dev/null +++ b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OEF.patch.s @@ -0,0 +1,16 @@ +.meta hide_from_patches_menu +.meta name="GetExtendedPlayerInfo" +.meta description="" + +entry_ptr: +reloc0: + .offsetof start +start: + .include GetExtendedPlayerInfoDC +data: + .data 0x8C379C6A # malloc9 + .data 0x8C4EC4E0 # char_file_part1 (anchor: send_61) + .data 0x8C4EC4E4 # char_file_part2 (anchor: send_61) + .data 0x8C429500 # root_protocol (anchor: send_61) + .data 0x8C379D38 # free9 + .data 0x8C010A1C # TProtocol_wait_send_drain diff --git a/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJ5.patch.s b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJ5.patch.s new file mode 100644 index 00000000..a476f49b --- /dev/null +++ b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJ5.patch.s @@ -0,0 +1,16 @@ +.meta hide_from_patches_menu +.meta name="GetExtendedPlayerInfo" +.meta description="" + +entry_ptr: +reloc0: + .offsetof start +start: + .include GetExtendedPlayerInfoDC +data: + .data 0x8C379C6A # malloc9 + .data 0x8C4EC4E0 # char_file_part1 (anchor: send_61) + .data 0x8C4EC4E4 # char_file_part2 (anchor: send_61) + .data 0x8C429500 # root_protocol (anchor: send_61) + .data 0x8C379D38 # free9 + .data 0x8C010A1C # TProtocol_wait_send_drain diff --git a/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJF.patch.s b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJF.patch.s new file mode 100644 index 00000000..05d628f8 --- /dev/null +++ b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OJF.patch.s @@ -0,0 +1,16 @@ +.meta hide_from_patches_menu +.meta name="GetExtendedPlayerInfo" +.meta description="" + +entry_ptr: +reloc0: + .offsetof start +start: + .include GetExtendedPlayerInfoDC +data: + .data 0x8C3772AE # malloc9 + .data 0x8C4E5F80 # char_file_part1 (anchor: send_61) + .data 0x8C4E5F84 # char_file_part2 (anchor: send_61) + .data 0x8C422F80 # root_protocol (anchor: send_61) + .data 0x8C37737C # free9 + .data 0x8C010A1C # TProtocol_wait_send_drain diff --git a/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OPF.patch.s b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OPF.patch.s new file mode 100644 index 00000000..e8006882 --- /dev/null +++ b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfo.2OPF.patch.s @@ -0,0 +1,16 @@ +.meta hide_from_patches_menu +.meta name="GetExtendedPlayerInfo" +.meta description="" + +entry_ptr: +reloc0: + .offsetof start +start: + .include GetExtendedPlayerInfoDC +data: + .data 0x8C36CD2A # malloc9 + .data 0x8C4DB9E0 # char_file_part1 (anchor: send_61) + .data 0x8C4DB9E4 # char_file_part2 (anchor: send_61) + .data 0x8C418A00 # root_protocol (anchor: send_61) + .data 0x8C36CDF8 # free9 + .data 0x8C010A1C # TProtocol_wait_send_drain diff --git a/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfoDC.sh4.inc.s b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfoDC.sh4.inc.s new file mode 100644 index 00000000..576a45fd --- /dev/null +++ b/system/client-functions/ExtendedPlayerInfo/GetExtendedPlayerInfoDC.sh4.inc.s @@ -0,0 +1,120 @@ +start: + sts.l -[r15], pr + mov.l -[r15], r8 + mov.l -[r15], r9 + mov.l -[r15], r10 + mov.l -[r15], r11 + + mova r0, [data] # r8 = data pointer + mov r8, r0 + + # outbound_cmd = malloc9(0x16F8) + mov r0, 0x16 + shl r0, 8 + or r0, 0xF8 + mov r4, r0 + mov r11, r0 + mov.l r0, [r8] + calls [r0] + nop + cmpeq r0, 0 + bt malloc9_failed + mov r9, r0 + + # header = 30 00 F8 16 + # r11 = 0x16F8 (size used later in send loop) + mov r0, 0x30 + mov.w [r9], r0 + mov r0, r11 + mov.w [r9 + 2], r0 + + # memcpy(outbound_cmd.part1, char_file_part1, sizeof(char_file_part1)) + mov r4, r9 + add r4, 4 + mov.l r5, [r8 + 4] + mov.l r5, [r5] + mov r0, 0x04 + shl r0, 8 + or r0, 0x1C + calls memcpy + mov r6, r0 + + # memcpy(outbound_cmd.part2, char_file_part2, sizeof(char_file_part2)) + mov r0, 0x04 + shl r0, 8 + or r0, 0x20 + mov r4, r9 + add r4, r0 + mov.l r5, [r8 + 8] + mov.l r5, [r5] + mov r0, 0x12 + shl r0, 8 + or r0, 0xD8 + calls memcpy + mov r6, r0 + + # r10 = send ptr, r11 = send bytes remaining (already set earlier) + mov r10, r9 +send_again: + # root_protocol->wait_send_drain() + mov.l r4, [r8 + 0x0C] + mov.l r4, [r4] + mov.l r0, [r8 + 0x14] + calls [r0] + nop + cmpeq r0, 0 + bf drain_failed + + # root_protocol->send(send_ptr, min(send_bytes_remaining, 0x5B4)) + mov.l r4, [r8 + 0x0C] + mov.l r4, [r4] + mov r5, r10 + mov r6, r11 + mov r0, 0x05 + shl r0, 8 + or r0, 0xB4 + cmpge r0, r6 + bt skip_adjust_size + mov r6, r0 +skip_adjust_size: + add r10, r6 # adjust send_ptr + sub r11, r6 # adjust send_bytes_remaining + mov.l r0, [r4 + 0x18] + mov.l r0, [r0 + 0x2C] + calls [r0] + nop + + cmpgt r11, 0 + bt send_again + +drain_failed: + # free(outbound_cmd) + mov r4, r9 + mov.l r0, [r8 + 0x10] + calls [r0] + nop + mov r0, 0 + +malloc9_failed: + mov.l r11, [r15]+ + mov.l r10, [r15]+ + mov.l r9, [r15]+ + mov.l r8, [r15]+ + lds.l pr, [r15]+ + rets + nop + +memcpy: + test r6, r6 + bt memcpy_done + mov.l r0, [r5]+ + mov.l [r4], r0 + add r4, 4 + bs memcpy + add r6, -4 +memcpy_done: + rets + nop + + .align 4 +data: