summaryrefslogtreecommitdiff
path: root/arm9/asm/FS_overlay.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/FS_overlay.s')
-rw-r--r--arm9/asm/FS_overlay.s546
1 files changed, 546 insertions, 0 deletions
diff --git a/arm9/asm/FS_overlay.s b/arm9/asm/FS_overlay.s
new file mode 100644
index 00000000..78635558
--- /dev/null
+++ b/arm9/asm/FS_overlay.s
@@ -0,0 +1,546 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FS_UnloadOverlay
+FS_UnloadOverlay: ; 0x020D2040
+ stmdb sp!, {lr}
+ sub sp, sp, #0x2c
+ mov r3, r0
+ mov r2, r1
+ add r0, sp, #0x0
+ mov r1, r3
+ bl FS_LoadOverlayInfo
+_020D205C:
+ cmp r0, #0x0
+ beq _020D2074
+ add r0, sp, #0x0
+ bl FS_UnloadOverlayImage
+ cmp r0, #0x0
+ bne _020D2084
+_020D2074:
+ add sp, sp, #0x2c
+ mov r0, #0x0
+ ldmfd sp!, {lr}
+ bx lr
+_020D2084:
+ mov r0, #0x1
+ add sp, sp, #0x2c
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlay
+FS_LoadOverlay: ; 0x020D2094
+ stmdb sp!, {lr}
+ sub sp, sp, #0x2c
+ mov r3, r0
+ mov r2, r1
+ add r0, sp, #0x0
+ mov r1, r3
+ bl FS_LoadOverlayInfo
+_020D20B0:
+ cmp r0, #0x0
+ beq _020D20C8
+ add r0, sp, #0x0
+ bl FS_LoadOverlayImage
+ cmp r0, #0x0
+ bne _020D20D8
+_020D20C8:
+ add sp, sp, #0x2c
+ mov r0, #0x0
+ ldmfd sp!, {lr}
+ bx lr
+_020D20D8:
+ add r0, sp, #0x0
+ bl FS_StartOverlay
+ mov r0, #0x1
+ add sp, sp, #0x2c
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FS_UnloadOverlayImage
+FS_UnloadOverlayImage: ; 0x020D20F0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl FS_EndOverlay
+ mov r0, #0x1
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FS_EndOverlay
+FS_EndOverlay: ; 0x020D210C
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ ldr r8, _020D220C ; =0x021D74C8
+ mov r11, r0
+ mov r9, #0x0
+_020D2120:
+ ldr r1, [r11, #0x8]
+ ldr r0, [r11, #0xc]
+ ldr r5, [r11, #0x4]
+ add r0, r1, r0
+ mov r7, r9
+ mov r6, r9
+ add r4, r5, r0
+ bl OS_DisableInterrupts
+ ldr lr, [r8, #0x0]
+ mov r10, r9
+ mov r12, lr
+ cmp lr, #0x0
+ beq _020D21C4
+_020D2154:
+ ldr r2, [r12, #0x8]
+ ldr r3, [r12, #0x0]
+ cmp r2, #0x0
+ ldr r1, [r12, #0x4]
+ bne _020D2178
+ cmp r1, r5
+ blo _020D2178
+ cmp r1, r4
+ blo _020D2188
+_020D2178:
+ cmp r2, r5
+ blo _020D21B4
+ cmp r2, r4
+ bhs _020D21B4
+_020D2188:
+ cmp r6, #0x0
+ strne r12, [r6, #0x0]
+ moveq r7, r12
+ cmp lr, r12
+ streq r3, [r8, #0x0]
+ moveq lr, r3
+ str r9, [r12, #0x0]
+ cmp r10, #0x0
+ mov r6, r12
+ strne r3, [r10, #0x0]
+ b _020D21B8
+_020D21B4:
+ mov r10, r12
+_020D21B8:
+ mov r12, r3
+ cmp r3, #0x0
+ bne _020D2154
+_020D21C4:
+ bl OS_RestoreInterrupts
+_020D21C8:
+ cmp r7, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r11, lr}
+ bxeq lr
+_020D21D8:
+ ldr r1, [r7, #0x4]
+ ldr r4, [r7]
+ cmp r1, #0x0
+ beq _020D21F0
+ ldr r0, [r7, #0x8]
+ blx r1
+_020D21F0:
+ mov r7, r4
+ cmp r4, #0x0
+ bne _020D21D8
+ b _020D2120
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11, lr}
+ bx lr
+_020D220C: .word 0x021D74C8
+
+ arm_func_start FS_StartOverlay
+FS_StartOverlay: ; 0x020D2210
+ stmdb sp!, {r4-r6,lr}
+ mov r5, r0
+ bl FSi_GetOverlayBinarySize
+ ldr r1, _020D2300 ; =0x027FFC40
+ mov r4, r0
+ ldrh r0, [r1, #0x0]
+ cmp r0, #0x2
+ bne _020D22A4
+ ldrb r1, [r5, #0x1f]
+ mov r0, #0x0
+ ands r1, r1, #0x2
+ beq _020D2280
+ ldr r1, _020D2304 ; =0x02106F84
+ ldr r3, _020D2308 ; =0x02106F84
+ ldr r2, _020D230C ; =0x66666667
+ sub r12, r1, r3
+ smull r1, lr, r2, r12
+ mov lr, lr, asr #0x3
+ mov r1, r12, lsr #0x1f
+ ldr r2, [r5, #0x0]
+ add lr, r1, lr
+ cmp r2, lr
+ bhs _020D2280
+ mov r0, #0x14
+ mla r0, r2, r0, r3
+ ldr r1, [r5, #0x4]
+ mov r2, r4
+ bl FSi_CompareDigest
+_020D2280:
+ cmp r0, #0x0
+ bne _020D22A4
+ ldr r0, [r5, #0x4]
+ mov r2, r4
+ mov r1, #0x0
+ bl MI_CpuFill8
+ bl OS_Terminate
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+_020D22A4:
+ ldrb r0, [r5, #0x1f]
+ ands r0, r0, #0x1
+ beq _020D22BC
+ ldr r0, [r5, #0x4]
+ add r0, r0, r4
+ bl MIi_UncompressBackward
+_020D22BC:
+ ldr r0, [r5, #0x4]
+ ldr r1, [r5, #0x8]
+ bl DC_FlushRange
+ ldr r6, [r5, #0x10]
+ ldr r4, [r5, #0x14]
+ cmp r6, r4
+ ldmcsia sp!, {r4-r6,lr}
+ bxcs lr
+_020D22DC:
+ ldr r0, [r6, #0x0]
+ cmp r0, #0x0
+ beq _020D22EC
+ blx r0
+_020D22EC:
+ add r6, r6, #0x4
+ cmp r6, r4
+ blo _020D22DC
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D2300: .word 0x027FFC40
+_020D2304: .word 0x02106F84
+_020D2308: .word 0x02106F84
+_020D230C: .word 0x66666667
+
+ arm_func_start FSi_CompareDigest
+FSi_CompareDigest:
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x58
+ mov r4, r0
+ mov r6, r1
+ mov r5, r2
+ add r0, sp, #0x4
+ mov r1, #0x0
+ mov r2, #0x14
+ bl MI_CpuFill8
+ ldr r0, _020D23AC ; =0x02106834
+ ldr r1, _020D23B0 ; =0x02106838
+ ldr r0, [r0, #0x0]
+ ldr r2, [r1, #0x0]
+ add r1, sp, #0x18
+ bl MI_CpuCopy8
+ ldr r3, _020D23B0 ; =0x02106838
+ mov r1, r6
+ ldr r12, [r3, #0x0]
+ mov r2, r5
+ add r0, sp, #0x4
+ add r3, sp, #0x18
+ str r12, [sp, #0x0]
+ bl MATH_CalcHMACSHA1
+ add r2, sp, #0x4
+ mov r3, #0x0
+_020D2374:
+ ldr r1, [r2, #0x0]
+ ldr r0, [r4, r3]
+ cmp r1, r0
+ bne _020D2394
+ add r3, r3, #0x4
+ cmp r3, #0x14
+ add r2, r2, #0x4
+ blo _020D2374
+_020D2394:
+ cmp r3, #0x14
+ moveq r0, #0x1
+ movne r0, #0x0
+ add sp, sp, #0x58
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D23AC: .word 0x02106834
+_020D23B0: .word 0x02106838
+
+ arm_func_start FS_LoadOverlayImage
+FS_LoadOverlayImage: ; 0x020D23B4
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x54
+ mov r5, r0
+ add r0, sp, #0x8
+ bl FS_InitFile
+_020D23C8:
+ add r0, sp, #0x0
+ mov r1, r5
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x0
+ add r0, sp, #0x8
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x54
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r5, lr}
+ bxeq lr
+ mov r0, r5
+ bl FSi_GetOverlayBinarySize
+ mov r4, r0
+ mov r0, r5
+ bl FS_ClearOverlayImage
+ ldr r1, [r5, #0x4]
+ add r0, sp, #0x8
+ mov r2, r4
+ bl FS_ReadFile
+ cmp r4, r0
+ beq _020D243C
+ add r0, sp, #0x8
+ bl FS_CloseFile
+ add sp, sp, #0x54
+ mov r0, #0x0
+ ldmia sp!, {r4-r5, lr}
+ bx lr
+_020D243C:
+ add r0, sp, #0x8
+ bl FS_CloseFile
+ mov r0, #0x1
+ add sp, sp, #0x54
+ ldmia sp!, {r4-r5, lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlayImageAsync
+FS_LoadOverlayImageAsync: ; 0x020D2454
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x8
+ mov r5, r1
+ mov r6, r0
+ mov r0, r5
+ bl FS_InitFile
+_020D246C:
+ add r0, sp, #0x0
+ mov r1, r6
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x0
+ mov r0, r5
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x8
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r6, lr}
+ bxeq lr
+ mov r0, r6
+ bl FSi_GetOverlayBinarySize
+ mov r4, r0
+ mov r0, r6
+ bl FS_ClearOverlayImage
+ ldr r1, [r6, #0x4]
+ mov r0, r5
+ mov r2, r4
+ bl FS_ReadFileAsync
+ cmp r4, r0
+ addeq sp, sp, #0x8
+ moveq r0, #0x1
+ ldmeqia sp!, {r4-r6, lr}
+ bxeq lr
+ mov r0, r5
+ bl FS_CloseFile
+ mov r0, #0x0
+ add sp, sp, #0x8
+ ldmia sp!, {r4-r6, lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlayInfo
+FS_LoadOverlayInfo:
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x64
+ movs r4, r1
+ mov r5, r0
+ ldreq r0, _020D25EC ; =0x021D5404
+ ldrne r0, _020D25F0 ; =0x021D540C
+ ldr r3, [r0, #0x0]
+ cmp r3, #0x0
+ beq _020D25A8
+ ldr r0, [r0, #0x4]
+ mov r2, r2, lsl #0x5
+ cmp r2, r0
+ addcs sp, sp, #0x64
+ movcs r0, #0x0
+ ldmcsia sp!, {r4-r5,lr}
+ bxcs lr
+ add r0, r3, r2
+ mov r1, r5
+ mov r2, #0x20
+ bl MI_CpuCopy8
+ add r0, sp, #0x18
+ str r4, [r5, #0x20]
+ bl FS_InitFile
+ add r0, sp, #0x10
+ mov r1, r5
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x10
+ add r0, sp, #0x18
+ ldmia r1, {r1-r2}
+ bl FS_OpenFileFast
+_020D2564:
+ cmp r0, #0x0
+ addeq sp, sp, #0x64
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ ldr r1, [sp, #0x3c]
+ add r0, sp, #0x18
+ str r1, [r5, #0x24]
+ ldr r2, [sp, #0x40]
+ ldr r1, [sp, #0x3c]
+ sub r1, r2, r1
+ str r1, [r5, #0x28]
+ bl FS_CloseFile
+ add sp, sp, #0x64
+ mov r0, #0x1
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D25A8:
+ ldr r1, _020D25F4 ; =0x027FFE50
+ ldr ip, _020D25F8 ; =0x027FFE58
+ ldr r0, [r1, #0x0]
+ ldr r3, _020D25FC ; =0x021D5414
+ str r0, [sp, #0x0]
+ ldr r1, [r1, #0x4]
+ mov r0, r5
+ str r1, [sp, #0x4]
+ ldr r5, [r12, #0x0]
+ mov r1, r4
+ str r5, [sp, #0x8]
+ ldr r4, [r12, #0x4]
+ str r4, [sp, #0xc]
+ bl FSi_LoadOverlayInfoCore
+ add sp, sp, #0x64
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D25EC: .word 0x021D5404
+_020D25F0: .word 0x021D540C
+_020D25F4: .word 0x027FFE50
+_020D25F8: .word 0x027FFE58
+_020D25FC: .word 0x021D5414
+
+ arm_func_start FSi_LoadOverlayInfoCore
+FSi_LoadOverlayInfoCore: ; 0x020D2600
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x54
+ movs r9, r1
+ ldreq r5, [sp, #0x74]
+ ldreq r6, [sp, #0x70]
+ ldrne r5, [sp, #0x7c]
+ ldrne r6, [sp, #0x78]
+ mov r7, r2, lsl #0x5
+ cmp r7, r5
+ mov r4, r0
+ mov r8, r3
+ addcs sp, sp, #0x54
+ movcs r0, #0x0
+ ldmcsia sp!, {r4-r9,lr}
+ bxcs lr
+ add r0, sp, #0xc
+ bl FS_InitFile
+ mvn r12, #0x0
+ add r0, sp, #0xc
+ mov r1, r8
+ add r2, r6, r7
+ add r3, r6, r5
+ str r12, [sp, #0x0]
+ bl FS_OpenFileDirect
+_020D2660:
+ cmp r0, #0
+ addeq sp, sp, #0x54
+ moveq r0, #0
+ ldmeqia sp!, {r4-r9, lr}
+ bxeq lr
+ add r0, sp, #12
+ mov r1, r4
+ mov r2, #32
+ bl FS_ReadFile
+ cmp r0, #32
+ beq _020D26A4
+ add r0, sp, #12
+ bl FS_CloseFile
+ add sp, sp, #0x54
+ mov r0, #0x0
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020D26A4:
+ add r0, sp, #0xC
+ bl FS_CloseFile
+ add r0, sp, #0x4
+ mov r1, r4
+ str r9, [r4, #0x20]
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x4
+ add r0, sp, #0xC
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x54
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r9, lr}
+ bxeq lr
+ ldr r1, [sp, #0x30]
+ add r0, sp, #0xC
+ str r1, [r4, #0x24]
+ ldr r2, [sp, #0x34]
+ ldr r1, [sp, #0x30]
+ sub r1, r2, r1
+ str r1, [r4, #0x28]
+ bl FS_CloseFile
+ mov r0, #0x1
+ add sp, sp, #0x54
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+
+ arm_func_start FS_GetOverlayFileID
+FS_GetOverlayFileID: ; 0x020D2710
+ sub sp, sp, #0x8
+ ldr r2, _020D2734 ; =0x021D5414
+ str r2, [sp, #0x0]
+ ldr r1, [r1, #0x18]
+ str r1, [sp, #0x4]
+ str r2, [r0, #0x0]
+ str r1, [r0, #0x4]
+ add sp, sp, #0x8
+ bx lr
+ .balign 4
+_020D2734: .word 0x021D5414
+
+ arm_func_start FS_ClearOverlayImage
+FS_ClearOverlayImage: ; 0x020D2738
+ stmdb sp!, {r4-r6,lr}
+ ldr r5, [r0, #0x8]
+ ldr r1, [r0, #0xc]
+ ldr r6, [r0, #0x4]
+ add r4, r5, r1
+ mov r0, r6
+ mov r1, r4
+ bl IC_InvalidateRange
+ mov r0, r6
+ mov r1, r4
+ bl DC_InvalidateRange
+ add r0, r6, r5
+ sub r2, r4, r5
+ mov r1, #0x0
+ bl MI_CpuFill8
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start FSi_GetOverlayBinarySize
+FSi_GetOverlayBinarySize: ; 0x020D277C
+ ldrb r1, [r0, #0x1f]
+ ands r1, r1, #0x1
+ ldrne r0, [r0, #0x1c]
+ movne r0, r0, lsl #0x8
+ movne r0, r0, lsr #0x8
+ ldreq r0, [r0, #0x8]
+ bx lr