137 lines
2.8 KiB
ArmAsm
137 lines
2.8 KiB
ArmAsm
.meta key="GetExtendedPlayerInfo"
|
|
.meta name="Get extended player info"
|
|
.meta description=""
|
|
|
|
.versions 2OJ5 2OJF 2OEF 2OPF
|
|
|
|
entry_ptr:
|
|
reloc0:
|
|
.offsetof start
|
|
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:
|
|
.data <VERS 0x8C379C6A 0x8C3772AE 0x8C379C6A 0x8C36CD2A> # malloc9
|
|
.data <VERS 0x8C4EC4E0 0x8C4E5F80 0x8C4EC4E0 0x8C4DB9E0> # char_file_part1 (anchor: send_61)
|
|
.data <VERS 0x8C4EC4E4 0x8C4E5F84 0x8C4EC4E4 0x8C4DB9E4> # char_file_part2 (anchor: send_61)
|
|
.data <VERS 0x8C429500 0x8C422F80 0x8C429500 0x8C418A00> # root_protocol (anchor: send_61)
|
|
.data <VERS 0x8C379D38 0x8C37737C 0x8C379D38 0x8C36CDF8> # free9
|
|
.data <VERS 0x8C010A1C 0x8C010A1C 0x8C010A1C 0x8C010A1C> # TProtocol_wait_send_drain
|