pokediamond/arm9/asm/MSL_Common_file_pos.s
2023-05-24 09:15:59 +01:00

363 lines
6.7 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start _ftell
_ftell: ; 0x020DEDE4
ldr r1, [r0, #0x4]
mov r1, r1, lsl #0x16
mov r1, r1, lsr #0x1d
and r1, r1, #0xff
add r1, r1, #0xff
and r1, r1, #0xff
cmp r1, #0x1
bhi _020DEE10
ldrb r1, [r0, #0xd]
cmp r1, #0x0
beq _020DEE24
_020DEE10:
ldr r0, _020DEE5C ; =errno
mov r1, #0x28
str r1, [r0, #0x0]
sub r0, r1, #0x29
bx lr
_020DEE24:
ldr r1, [r0, #0x8]
mov r1, r1, lsl #0x1d
movs r12, r1, lsr #0x1d
ldreq r0, [r0, #0x18]
bxeq lr
ldr r2, [r0, #0x24]
ldr r1, [r0, #0x1c]
ldr r3, [r0, #0x34]
sub r0, r2, r1
cmp r12, #0x3
add r0, r3, r0
subcs r1, r12, #0x2
subcs r0, r0, r1
bx lr
.balign 4
_020DEE5C: .word errno
arm_func_end _ftell
arm_func_start ftell
ftell: ; 0x020DEE60
stmdb sp!, {r3-r7,lr}
ldr r1, _020DEF60 ; =__files
mov r7, r0
cmp r7, r1
moveq r6, #0x2
beq _020DEE98
ldr r0, _020DEF64 ; =__files + 0x4C
cmp r7, r0
moveq r6, #0x3
beq _020DEE98
ldr r0, _020DEF68 ; =__files + 0x98
cmp r7, r0
moveq r6, #0x4
movne r6, #0x5
_020DEE98:
mov r0, #0x18
mul r4, r6, r0
ldr r5, _020DEF6C ; =__cs
add r0, r5, r4
bl OS_TryLockMutex
cmp r0, #0x0
bne _020DEED8
ldr r0, _020DEF70 ; =OSi_ThreadInfo
ldr r2, _020DEF74 ; =__cs_id
ldr r1, [r0, #0x4]
ldr r0, _020DEF78 ; =__cs_ref
ldr r3, [r1, #0x6c]
mov r1, #0x1
str r3, [r2, r6, lsl #0x2]
str r1, [r0, r6, lsl #0x2]
b _020DEF30
_020DEED8:
ldr r0, _020DEF70 ; =OSi_ThreadInfo
ldr r1, _020DEF74 ; =__cs_id
ldr r0, [r0, #0x4]
ldr r1, [r1, r6, lsl #0x2]
ldr r0, [r0, #0x6c]
cmp r1, r0
bne _020DEF08
ldr r1, _020DEF78 ; =__cs_ref
ldr r0, [r1, r6, lsl #0x2]
add r0, r0, #0x1
str r0, [r1, r6, lsl #0x2]
b _020DEF30
_020DEF08:
add r0, r5, r4
bl OS_LockMutex
ldr r0, _020DEF70 ; =OSi_ThreadInfo
ldr r2, _020DEF74 ; =__cs_id
ldr r1, [r0, #0x4]
ldr r0, _020DEF78 ; =__cs_ref
ldr r3, [r1, #0x6c]
mov r1, #0x1
str r3, [r2, r6, lsl #0x2]
str r1, [r0, r6, lsl #0x2]
_020DEF30:
mov r0, r7
bl _ftell
ldr r1, _020DEF78 ; =__cs_ref
mov r7, r0
ldr r0, [r1, r6, lsl #0x2]
subs r0, r0, #0x1
str r0, [r1, r6, lsl #0x2]
bne _020DEF58
add r0, r5, r4
bl OS_UnlockMutex
_020DEF58:
mov r0, r7
ldmia sp!, {r3-r7,pc}
.balign 4
_020DEF60: .word __files
_020DEF64: .word __files + 0x4C
_020DEF68: .word __files + 0x98
_020DEF6C: .word __cs
_020DEF70: .word OSi_ThreadInfo
_020DEF74: .word __cs_id
_020DEF78: .word __cs_ref
arm_func_end ftell
arm_func_start _fseek
_fseek: ; 0x020DEF7C
stmdb sp!, {r0-r3}
stmdb sp!, {r3-r5,lr}
mov r5, r0
ldr r1, [r5, #0x4]
mov r4, r2
mov r1, r1, lsl #0x16
mov r1, r1, lsr #0x1d
and r1, r1, #0xff
cmp r1, #0x1
ldreqb r1, [r5, #0xd]
cmpeq r1, #0x0
beq _020DEFC8
ldr r0, _020DF160 ; =errno
mov r1, #0x28
str r1, [r0, #0x0]
sub r0, r1, #0x29
ldmia sp!, {r3-r5,lr}
add sp, sp, #0x10
bx lr
_020DEFC8:
ldr r1, [r5, #0x8]
mov r1, r1, lsl #0x1d
mov r1, r1, lsr #0x1d
cmp r1, #0x1
bne _020DF018
mov r1, #0x0
bl __flush_buffer
cmp r0, #0x0
beq _020DF018
mov r0, #0x1
strb r0, [r5, #0xd]
mov r2, #0x0
ldr r0, _020DF160 ; =errno
mov r1, #0x28
str r2, [r5, #0x28]
str r1, [r0, #0x0]
sub r0, r1, #0x29
ldmia sp!, {r3-r5,lr}
add sp, sp, #0x10
bx lr
_020DF018:
cmp r4, #0x1
bne _020DF038
mov r0, r5
mov r4, #0x0
bl _ftell
ldr r1, [sp, #0x14]
add r0, r1, r0
str r0, [sp, #0x14]
_020DF038:
cmp r4, #0x2
beq _020DF0CC
ldr r0, [r5, #0x4]
mov r0, r0, lsl #0x1b
mov r0, r0, lsr #0x1d
cmp r0, #0x3
beq _020DF0CC
ldr r0, [r5, #0x8]
mov r0, r0, lsl #0x1d
mov r0, r0, lsr #0x1d
sub r0, r0, #0x2
cmp r0, #0x1
bhi _020DF0CC
ldr r2, [sp, #0x14]
ldr r0, [r5, #0x18]
cmp r2, r0
bhs _020DF088
ldr r0, [r5, #0x34]
cmp r2, r0
bhs _020DF098
_020DF088:
ldr r0, [r5, #0x8]
bic r0, r0, #0x7
str r0, [r5, #0x8]
b _020DF0D8
_020DF098:
ldr r1, [r5, #0x1c]
sub r0, r2, r0
add r0, r1, r0
str r0, [r5, #0x24]
ldr r1, [r5, #0x18]
ldr r0, [sp, #0x14]
sub r0, r1, r0
str r0, [r5, #0x28]
ldr r0, [r5, #0x8]
bic r0, r0, #0x7
orr r0, r0, #0x2
str r0, [r5, #0x8]
b _020DF0D8
_020DF0CC:
ldr r0, [r5, #0x8]
bic r0, r0, #0x7
str r0, [r5, #0x8]
_020DF0D8:
ldr r0, [r5, #0x8]
mov r0, r0, lsl #0x1d
movs r0, r0, lsr #0x1d
bne _020DF150
ldr r12, [r5, #0x38]
cmp r12, #0x0
beq _020DF13C
ldr r0, [r5, #0x0]
ldr r3, [r5, #0x48]
add r1, sp, #0x14
mov r2, r4
blx r12
cmp r0, #0x0
beq _020DF13C
mov r0, #0x1
strb r0, [r5, #0xd]
mov r2, #0x0
ldr r0, _020DF160 ; =errno
mov r1, #0x28
str r2, [r5, #0x28]
str r1, [r0, #0x0]
sub r0, r1, #0x29
ldmia sp!, {r3-r5,lr}
add sp, sp, #0x10
bx lr
_020DF13C:
mov r1, #0x0
strb r1, [r5, #0xc]
ldr r0, [sp, #0x14]
str r0, [r5, #0x18]
str r1, [r5, #0x28]
_020DF150:
mov r0, #0x0
ldmia sp!, {r3-r5,lr}
add sp, sp, #0x10
bx lr
.balign 4
_020DF160: .word errno
arm_func_end _fseek
arm_func_start fseek
fseek:
stmdb sp!, {r3-r9,lr}
ldr r3, _020DF274 ; =__files
mov r9, r0
cmp r9, r3
mov r8, r1
mov r7, r2
moveq r6, #0x2
beq _020DF1A4
ldr r0, _020DF278 ; =__files + 0x4C
cmp r9, r0
moveq r6, #0x3
beq _020DF1A4
ldr r0, _020DF27C ; =__files + 0x98
cmp r9, r0
moveq r6, #0x4
movne r6, #0x5
_020DF1A4:
mov r0, #0x18
mul r4, r6, r0
ldr r5, _020DF280 ; =__cs
add r0, r5, r4
bl OS_TryLockMutex
cmp r0, #0x0
bne _020DF1E4
ldr r0, _020DF284 ; =OSi_ThreadInfo
ldr r2, _020DF288 ; =__cs_id
ldr r1, [r0, #0x4]
ldr r0, _020DF28C ; =__cs_ref
ldr r3, [r1, #0x6c]
mov r1, #0x1
str r3, [r2, r6, lsl #0x2]
str r1, [r0, r6, lsl #0x2]
b _020DF23C
_020DF1E4:
ldr r0, _020DF284 ; =OSi_ThreadInfo
ldr r1, _020DF288 ; =__cs_id
ldr r0, [r0, #0x4]
ldr r1, [r1, r6, lsl #0x2]
ldr r0, [r0, #0x6c]
cmp r1, r0
bne _020DF214
ldr r1, _020DF28C ; =__cs_ref
ldr r0, [r1, r6, lsl #0x2]
add r0, r0, #0x1
str r0, [r1, r6, lsl #0x2]
b _020DF23C
_020DF214:
add r0, r5, r4
bl OS_LockMutex
ldr r0, _020DF284 ; =OSi_ThreadInfo
ldr r2, _020DF288 ; =__cs_id
ldr r1, [r0, #0x4]
ldr r0, _020DF28C ; =__cs_ref
ldr r3, [r1, #0x6c]
mov r1, #0x1
str r3, [r2, r6, lsl #0x2]
str r1, [r0, r6, lsl #0x2]
_020DF23C:
mov r0, r9
mov r1, r8
mov r2, r7
bl _fseek
ldr r1, _020DF28C ; =__cs_ref
mov r7, r0
ldr r0, [r1, r6, lsl #0x2]
subs r0, r0, #0x1
str r0, [r1, r6, lsl #0x2]
bne _020DF26C
add r0, r5, r4
bl OS_UnlockMutex
_020DF26C:
mov r0, r7
ldmia sp!, {r3-r9,pc}
.balign 4
_020DF274: .word __files
_020DF278: .word __files + 0x4C
_020DF27C: .word __files + 0x98
_020DF280: .word __cs
_020DF284: .word OSi_ThreadInfo
_020DF288: .word __cs_id
_020DF28C: .word __cs_ref
arm_func_end fseek
arm_func_start rewind
rewind: ; 0x020DF290
stmdb sp!, {r4,lr}
mov r1, #0x0
mov r4, r0
mov r2, r1
strb r1, [r4, #0xd]
bl fseek
mov r0, #0x0
strb r0, [r4, #0xd]
ldmia sp!, {r4,pc}
arm_func_end rewind
exception ftell, 285, 0x00300F00
exception _fseek, 489, 0x00400320
exception fseek, 301, 0x00403F00
exception rewind, 37, 0x00100100