105 lines
1.6 KiB
ArmAsm
105 lines
1.6 KiB
ArmAsm
.meta visibility="menu"
|
|
.meta key="PsoPeepsV2EXP5xDC"
|
|
.meta name="V2 5x"
|
|
.meta description="Dreamcast V2 EXP"
|
|
|
|
.versions 2OEF
|
|
|
|
entry_ptr:
|
|
reloc0:
|
|
.offsetof start
|
|
|
|
start:
|
|
# Active DC V2 online EXP table copy.
|
|
# Idempotent:
|
|
# - base table => multiply by 5
|
|
# - 10x table => halve into 5x
|
|
# - 5x table => do nothing
|
|
|
|
mova r0, [active_table_addr]
|
|
mov.l r4, [r0]
|
|
|
|
# r5 = sentinel at index 2: active_table + (2 * 0x24)
|
|
mov r5, r4
|
|
add r5, 0x48
|
|
mov.w r5, [r5]
|
|
|
|
mova r0, [factor_table]
|
|
mov r6, r0
|
|
mov r7, 8
|
|
|
|
find_factor:
|
|
mov.w r0, [r6]
|
|
cmpeq r0, r5
|
|
bt factor_found
|
|
add r6, 4
|
|
add r7, -1
|
|
cmpgt r7, 0
|
|
bt find_factor
|
|
rets
|
|
nop
|
|
|
|
factor_found:
|
|
add r6, 2
|
|
mov.w r5, [r6]
|
|
test r5, r5
|
|
bt halve_table
|
|
|
|
# r7 = 212 entries
|
|
mov r7, 0x0D
|
|
shl r7, 4
|
|
add r7, 4
|
|
|
|
# r6 = stride
|
|
mov r6, 0x24
|
|
|
|
multiply_loop:
|
|
mov.w r0, [r4]
|
|
mulu.w r5, r0
|
|
sts macl, r0
|
|
mov.w [r4], r0
|
|
add r4, r6
|
|
add r7, -1
|
|
cmpgt r7, 0
|
|
bt multiply_loop
|
|
rets
|
|
nop
|
|
|
|
halve_table:
|
|
# r7 = 212 entries
|
|
mov r7, 0x0D
|
|
shl r7, 4
|
|
add r7, 4
|
|
|
|
# r6 = stride
|
|
mov r6, 0x24
|
|
|
|
halve_loop:
|
|
mov.w r0, [r4]
|
|
shlr r0
|
|
mov.w [r4], r0
|
|
add r4, r6
|
|
add r7, -1
|
|
cmpgt r7, 0
|
|
bt halve_loop
|
|
rets
|
|
nop
|
|
|
|
.align 4
|
|
|
|
active_table_addr:
|
|
.data 0x8CD313DC
|
|
|
|
factor_table:
|
|
# base -> 5x
|
|
.binary 05000500
|
|
.binary 2a000500
|
|
.binary 5a000500
|
|
.binary 04010500
|
|
|
|
# 10x -> 5x by halving
|
|
.binary 32000000
|
|
.binary a4010000
|
|
.binary 84030000
|
|
.binary 280a0000
|