From ee23d29019f37d08c58f352047ed330562765684 Mon Sep 17 00:00:00 2001 From: minirop Date: Fri, 20 Sep 2024 17:53:18 +0200 Subject: [PATCH] proc.c done (non-matching remaining) --- FireEmblem7J.lds | 6 +- asm/proc.s | 1346 ---------------------------------------------- src/proc.c | 1046 +++++++++++++++++++++++++++++++++++ 3 files changed, 1051 insertions(+), 1347 deletions(-) delete mode 100644 asm/proc.s create mode 100644 src/proc.c diff --git a/FireEmblem7J.lds b/FireEmblem7J.lds index cbfe7f1..81c9bc4 100644 --- a/FireEmblem7J.lds +++ b/FireEmblem7J.lds @@ -96,6 +96,10 @@ SECTIONS . = 0x020140; . = ALIGN(4); src/hardware.o(ewram_data); . = ALIGN(4); src/move-data.o(ewram_data); + . = 0x024E20; Unk_02024E20 = .; + . = 0x026920; Unk_02026920 = .; + . = 0x026A24; Unk_02026A24 = .; + . = 0x026A28; Unk_02026A28 = .; . = 0x026A48; . = ALIGN(4); src/icon.o(ewram_data); . = 0x028D68; gActiveFont = .; @@ -210,7 +214,7 @@ SECTIONS src/oam.o(.text); asm/sound.o(.text); asm/ram-funcs.o(.text); - asm/proc.o(.text); + src/proc.o(.text); src/icon.o(.text); asm/debug-text.o(.text); asm/text.o(.text); diff --git a/asm/proc.s b/asm/proc.s deleted file mode 100644 index 7a9317e..0000000 --- a/asm/proc.s +++ /dev/null @@ -1,1346 +0,0 @@ - .include "macro.inc" - - .syntax unified - - thumb_func_start Proc_Init -Proc_Init: @ 0x080042FC - push {r4, r5, r6, r7, lr} - movs r4, #0 - ldr r7, _08004360 @ =0x02024E20 - ldr r5, _08004364 @ =0x02026920 - ldr r0, _08004368 @ =0x02026A24 - mov ip, r0 - movs r2, #0 - adds r6, r5, #0 - movs r3, #0 -_0800430E: - adds r1, r3, r7 - str r2, [r1] - str r2, [r1, #4] - str r2, [r1, #8] - str r2, [r1, #0xc] - str r2, [r1, #0x10] - str r2, [r1, #0x14] - str r2, [r1, #0x18] - str r2, [r1, #0x1c] - str r2, [r1, #0x20] - strh r2, [r1, #0x24] - adds r0, r1, #0 - adds r0, #0x26 - strb r2, [r0] - adds r0, #1 - strb r2, [r0] - adds r0, #1 - strb r2, [r0] - stm r6!, {r1} - adds r3, #0x6c - adds r4, #1 - cmp r4, #0x3f - ble _0800430E - movs r0, #0x80 - lsls r0, r0, #1 - adds r1, r5, r0 - movs r0, #0 - str r0, [r1] - mov r0, ip - str r5, [r0] - ldr r1, _0800436C @ =0x02026A28 - movs r2, #0 - adds r0, r1, #0 - adds r0, #0x1c -_08004352: - str r2, [r0] - subs r0, #4 - cmp r0, r1 - bge _08004352 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08004360: .4byte 0x02024E20 -_08004364: .4byte 0x02026920 -_08004368: .4byte 0x02026A24 -_0800436C: .4byte 0x02026A28 - - thumb_func_start Proc_Start -Proc_Start: @ 0x08004370 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r1, #0 - bl AllocateProcess - adds r5, r0, #0 - str r4, [r5] - str r4, [r5, #4] - movs r0, #0 - str r0, [r5, #8] - str r0, [r5, #0xc] - str r0, [r5, #0x14] - str r0, [r5, #0x18] - str r0, [r5, #0x1c] - str r0, [r5, #0x20] - movs r1, #0 - strh r0, [r5, #0x24] - adds r0, r5, #0 - adds r0, #0x26 - strb r1, [r0] - adds r0, #2 - strb r1, [r0] - adds r1, r5, #0 - adds r1, #0x27 - movs r0, #8 - strb r0, [r1] - cmp r6, #7 - bgt _080043B2 - adds r0, r5, #0 - adds r1, r6, #0 - bl InsertRootProcess - b _080043BA -_080043B2: - adds r0, r5, #0 - adds r1, r6, #0 - bl InsertChildProcess -_080043BA: - adds r0, r5, #0 - bl sub_8004A60 - adds r1, r5, #0 - adds r1, #0x27 - movs r0, #0xf7 - ldrb r2, [r1] - ands r0, r2 - strb r0, [r1] - adds r0, r5, #0 - pop {r4, r5, r6} - pop {r1} - bx r1 - - thumb_func_start Proc_StartBlocking -Proc_StartBlocking: @ 0x080043D4 - push {lr} - bl Proc_Start - adds r2, r0, #0 - ldr r0, [r2] - cmp r0, #0 - beq _080043FC - adds r1, r2, #0 - adds r1, #0x27 - movs r0, #2 - ldrb r3, [r1] - orrs r0, r3 - strb r0, [r1] - ldr r0, [r2, #0x14] - adds r0, #0x28 - ldrb r1, [r0] - adds r1, #1 - strb r1, [r0] - adds r0, r2, #0 - b _080043FE -_080043FC: - movs r0, #0 -_080043FE: - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start DeleteProcessRecursive -DeleteProcessRecursive: @ 0x08004404 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - beq _08004412 - bl DeleteProcessRecursive -_08004412: - ldr r0, [r4, #0x18] - cmp r0, #0 - beq _0800441C - bl DeleteProcessRecursive -_0800441C: - adds r6, r4, #0 - adds r6, #0x27 - movs r5, #1 - ldrb r0, [r6] - ands r5, r0 - cmp r5, #0 - bne _0800445A - ldr r1, [r4, #8] - cmp r1, #0 - beq _08004436 - adds r0, r4, #0 - bl _call_via_r1 -_08004436: - adds r0, r4, #0 - bl FreeProcess - str r5, [r4] - str r5, [r4, #0xc] - movs r0, #1 - ldrb r1, [r6] - orrs r0, r1 - strb r0, [r6] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _0800445A - ldr r0, [r4, #0x14] - adds r0, #0x28 - ldrb r1, [r0] - subs r1, #1 - strb r1, [r0] -_0800445A: - pop {r4, r5, r6} - pop {r0} - bx r0 - - thumb_func_start Proc_End -Proc_End: @ 0x08004460 - push {r4, lr} - adds r4, r0, #0 - cmp r4, #0 - beq _08004472 - bl UnlinkProcess - adds r0, r4, #0 - bl DeleteProcessRecursive -_08004472: - pop {r4} - pop {r0} - bx r0 - - thumb_func_start AllocateProcess -AllocateProcess: @ 0x08004478 - ldr r1, _08004484 @ =0x02026A24 - ldr r2, [r1] - ldm r2!, {r0} - str r2, [r1] - bx lr - .align 2, 0 -_08004484: .4byte 0x02026A24 - - thumb_func_start FreeProcess -FreeProcess: @ 0x08004488 - ldr r2, _08004494 @ =0x02026A24 - ldr r1, [r2] - subs r1, #4 - str r1, [r2] - str r0, [r1] - bx lr - .align 2, 0 -_08004494: .4byte 0x02026A24 - - thumb_func_start InsertRootProcess -InsertRootProcess: @ 0x08004498 - adds r2, r0, #0 - adds r3, r1, #0 - lsls r1, r3, #2 - ldr r0, _080044B4 @ =0x02026A28 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - beq _080044AC - str r2, [r0, #0x1c] - str r0, [r2, #0x20] -_080044AC: - str r3, [r2, #0x14] - str r2, [r1] - bx lr - .align 2, 0 -_080044B4: .4byte 0x02026A28 - - thumb_func_start InsertChildProcess -InsertChildProcess: @ 0x080044B8 - adds r2, r0, #0 - ldr r0, [r1, #0x18] - cmp r0, #0 - beq _080044C6 - str r2, [r0, #0x1c] - ldr r0, [r1, #0x18] - str r0, [r2, #0x20] -_080044C6: - str r2, [r1, #0x18] - str r1, [r2, #0x14] - bx lr - - thumb_func_start UnlinkProcess -UnlinkProcess: @ 0x080044CC - adds r2, r0, #0 - ldr r1, [r2, #0x1c] - cmp r1, #0 - beq _080044D8 - ldr r0, [r2, #0x20] - str r0, [r1, #0x20] -_080044D8: - ldr r1, [r2, #0x20] - cmp r1, #0 - beq _080044E2 - ldr r0, [r2, #0x1c] - str r0, [r1, #0x1c] -_080044E2: - ldr r1, [r2, #0x14] - cmp r1, #8 - ble _080044F4 - ldr r0, [r1, #0x18] - cmp r0, r2 - bne _08004504 - ldr r0, [r2, #0x20] - str r0, [r1, #0x18] - b _08004504 -_080044F4: - lsls r0, r1, #2 - ldr r1, _0800450C @ =0x02026A28 - adds r1, r0, r1 - ldr r0, [r1] - cmp r0, r2 - bne _08004504 - ldr r0, [r2, #0x20] - str r0, [r1] -_08004504: - movs r0, #0 - str r0, [r2, #0x1c] - str r0, [r2, #0x20] - bx lr - .align 2, 0 -_0800450C: .4byte 0x02026A28 - - thumb_func_start RunProcessRecursive -RunProcessRecursive: @ 0x08004510 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - beq _0800451E - bl RunProcessRecursive -_0800451E: - adds r0, r4, #0 - adds r0, #0x28 - ldrb r0, [r0] - cmp r0, #0 - bne _0800455C - adds r1, r4, #0 - adds r1, #0x27 - movs r0, #8 - ldrb r2, [r1] - ands r0, r2 - adds r5, r1, #0 - cmp r0, #0 - bne _0800455C - ldr r0, [r4, #0xc] - cmp r0, #0 - bne _0800454A - adds r0, r4, #0 - bl sub_8004A60 - ldr r0, [r4, #0xc] - cmp r0, #0 - beq _08004552 -_0800454A: - ldr r1, [r4, #0xc] - adds r0, r4, #0 - bl _call_via_r1 -_08004552: - movs r0, #1 - ldrb r5, [r5] - ands r0, r5 - cmp r0, #0 - bne _08004566 -_0800455C: - ldr r0, [r4, #0x18] - cmp r0, #0 - beq _08004566 - bl RunProcessRecursive -_08004566: - pop {r4, r5} - pop {r0} - bx r0 - - thumb_func_start Proc_Run -Proc_Run: @ 0x0800456C - push {lr} - cmp r0, #0 - beq _08004576 - bl RunProcessRecursive -_08004576: - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start Proc_Break -Proc_Break: @ 0x0800457C - movs r1, #0 - str r1, [r0, #0xc] - bx lr - .align 2, 0 - - thumb_func_start Proc_Find -Proc_Find: @ 0x08004584 - adds r3, r0, #0 - ldr r1, _08004594 @ =0x02024E20 - movs r2, #0 -_0800458A: - ldr r0, [r1] - cmp r0, r3 - bne _08004598 - adds r0, r1, #0 - b _080045A2 - .align 2, 0 -_08004594: .4byte 0x02024E20 -_08004598: - adds r2, #1 - adds r1, #0x6c - cmp r2, #0x3f - ble _0800458A - movs r0, #0 -_080045A2: - bx lr - - thumb_func_start Proc_FindNonBlocked -Proc_FindNonBlocked: @ 0x080045A4 - adds r3, r0, #0 - ldr r1, _080045C0 @ =0x02024E20 - movs r2, #0 -_080045AA: - ldr r0, [r1] - cmp r0, r3 - bne _080045C4 - adds r0, r1, #0 - adds r0, #0x28 - ldrb r0, [r0] - cmp r0, #0 - bne _080045C4 - adds r0, r1, #0 - b _080045CE - .align 2, 0 -_080045C0: .4byte 0x02024E20 -_080045C4: - adds r2, #1 - adds r1, #0x6c - cmp r2, #0x3f - ble _080045AA - movs r0, #0 -_080045CE: - bx lr - - thumb_func_start sub_80045D0 -sub_80045D0: @ 0x080045D0 - adds r3, r0, #0 - ldr r1, _080045EC @ =0x02024E20 - movs r2, #0 -_080045D6: - ldr r0, [r1] - cmp r0, #0 - beq _080045F0 - adds r0, r1, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, r3 - bne _080045F0 - adds r0, r1, #0 - b _080045FA - .align 2, 0 -_080045EC: .4byte 0x02024E20 -_080045F0: - adds r2, #1 - adds r1, #0x6c - cmp r2, #0x3f - ble _080045D6 - movs r0, #0 -_080045FA: - bx lr - - thumb_func_start Proc_Goto -Proc_Goto: @ 0x080045FC - push {r4, r5, r6, lr} - adds r4, r1, #0 - adds r1, r0, #0 - ldr r2, [r1] - ldrh r3, [r2] - movs r5, #0 - ldrsh r0, [r2, r5] - cmp r0, #0 - beq _0800462E - movs r5, #0 -_08004610: - cmp r3, #0xb - bne _08004622 - movs r6, #2 - ldrsh r0, [r2, r6] - cmp r0, r4 - bne _08004622 - str r2, [r1, #4] - str r5, [r1, #0xc] - b _0800462E -_08004622: - adds r2, #8 - ldrh r3, [r2] - movs r6, #0 - ldrsh r0, [r2, r6] - cmp r0, #0 - bne _08004610 -_0800462E: - pop {r4, r5, r6} - pop {r0} - bx r0 - - thumb_func_start sub_8004634 -sub_8004634: @ 0x08004634 - str r1, [r0, #4] - movs r1, #0 - str r1, [r0, #0xc] - bx lr - - thumb_func_start sub_800463C -sub_800463C: @ 0x0800463C - adds r0, #0x26 - strb r1, [r0] - bx lr - .align 2, 0 - - thumb_func_start sub_8004644 -sub_8004644: @ 0x08004644 - str r1, [r0, #8] - bx lr - - thumb_func_start sub_8004648 -sub_8004648: @ 0x08004648 - push {r4, r5, r6, lr} - adds r6, r0, #0 - ldr r4, _0800466C @ =0x02024E20 - movs r5, #0x3f -_08004650: - ldr r0, [r4] - cmp r0, #0 - beq _0800465C - adds r0, r4, #0 - bl _call_via_r6 -_0800465C: - subs r5, #1 - adds r4, #0x6c - cmp r5, #0 - bge _08004650 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_0800466C: .4byte 0x02024E20 - - thumb_func_start Proc_ForEach -Proc_ForEach: @ 0x08004670 - push {r4, r5, r6, r7, lr} - adds r7, r0, #0 - adds r6, r1, #0 - ldr r4, _08004694 @ =0x02024E20 - movs r5, #0x3f -_0800467A: - ldr r0, [r4] - cmp r0, r7 - bne _08004686 - adds r0, r4, #0 - bl _call_via_r6 -_08004686: - subs r5, #1 - adds r4, #0x6c - cmp r5, #0 - bge _0800467A - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08004694: .4byte 0x02024E20 - - thumb_func_start sub_8004698 -sub_8004698: @ 0x08004698 - push {r4, r5, r6, r7, lr} - adds r7, r0, #0 - adds r6, r1, #0 - ldr r4, _080046C0 @ =0x02024E20 - movs r5, #0x3f -_080046A2: - adds r0, r4, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, r7 - bne _080046B2 - adds r0, r4, #0 - bl _call_via_r6 -_080046B2: - subs r5, #1 - adds r4, #0x6c - cmp r5, #0 - bge _080046A2 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080046C0: .4byte 0x02024E20 - - thumb_func_start Proc_BlockEachMarked -Proc_BlockEachMarked: @ 0x080046C4 - adds r3, r0, #0 - movs r2, #0x3f - ldr r0, _080046E4 @ =0x02024E20 - adds r1, r0, #0 - adds r1, #0x26 -_080046CE: - ldrb r0, [r1] - cmp r0, r3 - bne _080046DA - ldrb r0, [r1, #2] - adds r0, #1 - strb r0, [r1, #2] -_080046DA: - subs r2, #1 - adds r1, #0x6c - cmp r2, #0 - bge _080046CE - bx lr - .align 2, 0 -_080046E4: .4byte 0x02024E20 - - thumb_func_start Proc_UnblockEachMarked -Proc_UnblockEachMarked: @ 0x080046E8 - adds r3, r0, #0 - movs r2, #0x3f - ldr r0, _0800470C @ =0x02024E20 - adds r1, r0, #0 - adds r1, #0x26 -_080046F2: - ldrb r0, [r1] - cmp r0, r3 - bne _08004702 - ldrb r0, [r1, #2] - cmp r0, #0 - beq _08004702 - subs r0, #1 - strb r0, [r1, #2] -_08004702: - subs r2, #1 - adds r1, #0x6c - cmp r2, #0 - bge _080046F2 - bx lr - .align 2, 0 -_0800470C: .4byte 0x02024E20 - - thumb_func_start Proc_EndEachMarked -Proc_EndEachMarked: @ 0x08004710 - push {r4, r5, r6, lr} - adds r6, r0, #0 - ldr r4, _08004738 @ =0x02024E20 - movs r5, #0x3f -_08004718: - adds r0, r4, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, r6 - bne _08004728 - adds r0, r4, #0 - bl Proc_End -_08004728: - subs r5, #1 - adds r4, #0x6c - cmp r5, #0 - bge _08004718 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_08004738: .4byte 0x02024E20 - - thumb_func_start EndProc -EndProc: @ 0x0800473C - push {lr} - bl Proc_End - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start Proc_EndEach -Proc_EndEach: @ 0x08004748 - push {lr} - ldr r1, _08004754 @ =EndProc - bl Proc_ForEach - pop {r0} - bx r0 - .align 2, 0 -_08004754: .4byte EndProc - - thumb_func_start ClearNativeCallback -ClearNativeCallback: @ 0x08004758 - push {lr} - bl Proc_Break - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start Proc_BreakEach -Proc_BreakEach: @ 0x08004764 - push {lr} - ldr r1, _08004770 @ =ClearNativeCallback - bl Proc_ForEach - pop {r0} - bx r0 - .align 2, 0 -_08004770: .4byte ClearNativeCallback - - thumb_func_start ForAllFollowingProcs -ForAllFollowingProcs: @ 0x08004774 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - beq _08004784 - bl ForAllFollowingProcs -_08004784: - adds r0, r4, #0 - bl _call_via_r5 - ldr r0, [r4, #0x18] - cmp r0, #0 - beq _08004796 - adds r1, r5, #0 - bl ForAllFollowingProcs -_08004796: - pop {r4, r5} - pop {r0} - bx r0 - - thumb_func_start sub_800479C -sub_800479C: @ 0x0800479C - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - bl _call_via_r5 - ldr r0, [r4, #0x18] - cmp r0, #0 - beq _080047B2 - adds r1, r5, #0 - bl ForAllFollowingProcs -_080047B2: - pop {r4, r5} - pop {r0} - bx r0 - - thumb_func_start sub_80047B8 -sub_80047B8: @ 0x080047B8 - push {lr} - bl Proc_End - movs r0, #0 - pop {r1} - bx r1 - - thumb_func_start sub_80047C4 -sub_80047C4: @ 0x080047C4 - ldr r1, [r0, #4] - ldr r2, [r1, #4] - str r2, [r0, #0x10] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - .align 2, 0 - - thumb_func_start sub_80047D4 -sub_80047D4: @ 0x080047D4 - push {lr} - ldr r1, [r0, #4] - ldr r2, [r1, #4] - adds r1, #8 - str r1, [r0, #4] - bl _call_via_r2 - movs r0, #1 - pop {r1} - bx r1 - - thumb_func_start sub_80047E8 -sub_80047E8: @ 0x080047E8 - push {lr} - ldr r1, [r0, #4] - ldr r2, [r1, #4] - adds r1, #8 - str r1, [r0, #4] - bl _call_via_r2 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004800 -sub_8004800: @ 0x08004800 - push {lr} - adds r1, r0, #0 - ldr r2, [r1, #4] - ldrh r0, [r2, #2] - ldr r3, [r2, #4] - adds r2, #8 - str r2, [r1, #4] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - bl _call_via_r3 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004820 -sub_8004820: @ 0x08004820 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r1, [r0, #4] - adds r0, #8 - str r0, [r4, #4] - adds r0, r4, #0 - bl _call_via_r1 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #1 - beq _0800483E - movs r0, #1 - b _08004846 -_0800483E: - ldr r0, [r4, #4] - subs r0, #8 - str r0, [r4, #4] - movs r0, #0 -_08004846: - pop {r4} - pop {r1} - bx r1 - - thumb_func_start sub_800484C -sub_800484C: @ 0x0800484C - ldr r1, [r0, #4] - ldr r2, [r1, #4] - str r2, [r0, #0xc] - adds r1, #8 - str r1, [r0, #4] - movs r0, #0 - bx lr - .align 2, 0 - - thumb_func_start sub_800485C -sub_800485C: @ 0x0800485C - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r1, [r0, #4] - adds r0, r4, #0 - bl sub_8004644 - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - - thumb_func_start sub_8004878 -sub_8004878: @ 0x08004878 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - adds r1, r4, #0 - bl Proc_Start - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - - thumb_func_start sub_8004894 -sub_8004894: @ 0x08004894 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - adds r1, r4, #0 - bl Proc_StartBlocking - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #0 - pop {r4} - pop {r1} - bx r1 - - thumb_func_start sub_80048B0 -sub_80048B0: @ 0x080048B0 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - movs r2, #0x24 - ldrsh r1, [r4, r2] - bl Proc_Start - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_80048D0 -sub_80048D0: @ 0x080048D0 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - bl Proc_Find - rsbs r1, r0, #0 - orrs r1, r0 - cmp r1, #0 - blt _080048EE - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - b _080048F0 -_080048EE: - movs r0, #0 -_080048F0: - pop {r4} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_80048F8 -sub_80048F8: @ 0x080048F8 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - bl Proc_EndEach - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004914 -sub_8004914: @ 0x08004914 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - ldr r0, [r0, #4] - bl Proc_BreakEach - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004930 -sub_8004930: @ 0x08004930 - ldr r1, [r0, #4] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - .align 2, 0 - - thumb_func_start sub_800493C -sub_800493C: @ 0x0800493C - push {lr} - ldr r1, [r0, #4] - ldr r1, [r1, #4] - bl sub_8004634 - movs r0, #1 - pop {r1} - bx r1 - - thumb_func_start sub_800494C -sub_800494C: @ 0x0800494C - push {lr} - ldr r1, [r0, #4] - movs r2, #2 - ldrsh r1, [r1, r2] - bl Proc_Goto - movs r0, #1 - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004960 -sub_8004960: @ 0x08004960 - push {lr} - adds r1, r0, #0 - ldrh r0, [r1, #0x24] - subs r0, #1 - strh r0, [r1, #0x24] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08004976 - adds r0, r1, #0 - bl Proc_Break -_08004976: - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start sub_800497C -sub_800497C: @ 0x0800497C - adds r1, r0, #0 - ldr r0, [r1, #4] - ldrh r2, [r0, #2] - movs r3, #2 - ldrsh r0, [r0, r3] - cmp r0, #0 - beq _08004990 - strh r2, [r1, #0x24] - ldr r0, _0800499C @ =sub_8004960 - str r0, [r1, #0xc] -_08004990: - ldr r0, [r1, #4] - adds r0, #8 - str r0, [r1, #4] - movs r0, #0 - bx lr - .align 2, 0 -_0800499C: .4byte sub_8004960 - - thumb_func_start sub_80049A0 -sub_80049A0: @ 0x080049A0 - ldr r1, [r0, #4] - ldrh r1, [r1, #2] - adds r2, r0, #0 - adds r2, #0x26 - strb r1, [r2] - ldr r1, [r0, #4] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - - thumb_func_start sub_80049B4 -sub_80049B4: @ 0x080049B4 - ldr r1, [r0, #4] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - .align 2, 0 - - thumb_func_start sub_80049C0 -sub_80049C0: @ 0x080049C0 - movs r0, #0 - bx lr - - thumb_func_start sub_80049C4 -sub_80049C4: @ 0x080049C4 - push {r4, r5, lr} - adds r3, r0, #0 - ldr r2, _080049F0 @ =0x02024E20 - movs r4, #0 - ldr r5, [r3] - movs r1, #0x3f -_080049D0: - ldr r0, [r2] - cmp r0, r5 - bne _080049D8 - adds r4, #1 -_080049D8: - subs r1, #1 - adds r2, #0x6c - cmp r1, #0 - bge _080049D0 - cmp r4, #1 - bgt _080049F4 - ldr r0, [r3, #4] - adds r0, #8 - str r0, [r3, #4] - movs r0, #1 - b _080049FC - .align 2, 0 -_080049F0: .4byte 0x02024E20 -_080049F4: - adds r0, r3, #0 - bl Proc_End - movs r0, #0 -_080049FC: - pop {r4, r5} - pop {r1} - bx r1 - .align 2, 0 - - thumb_func_start sub_8004A04 -sub_8004A04: @ 0x08004A04 - push {r4, lr} - adds r4, r0, #0 - ldr r2, _08004A10 @ =0x02024E20 - movs r3, #0 - b _08004A18 - .align 2, 0 -_08004A10: .4byte 0x02024E20 -_08004A14: - adds r3, #1 - adds r2, #0x6c -_08004A18: - cmp r3, #0x3f - bgt _08004A2E - cmp r2, r4 - beq _08004A14 - ldr r1, [r2] - ldr r0, [r4] - cmp r1, r0 - bne _08004A14 - adds r0, r2, #0 - bl Proc_End -_08004A2E: - ldr r0, [r4, #4] - adds r0, #8 - str r0, [r4, #4] - movs r0, #1 - pop {r4} - pop {r1} - bx r1 - - thumb_func_start sub_8004A3C -sub_8004A3C: @ 0x08004A3C - ldr r1, [r0, #4] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - .align 2, 0 - - thumb_func_start sub_8004A48 -sub_8004A48: @ 0x08004A48 - adds r2, r0, #0 - adds r2, #0x27 - movs r1, #4 - ldrb r3, [r2] - orrs r1, r3 - strb r1, [r2] - ldr r1, [r0, #4] - adds r1, #8 - str r1, [r0, #4] - movs r0, #1 - bx lr - .align 2, 0 - - thumb_func_start sub_8004A60 -sub_8004A60: @ 0x08004A60 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, [r4] - cmp r0, #0 - beq _08004AA2 - adds r0, r4, #0 - adds r0, #0x28 - ldrb r0, [r0] - cmp r0, #0 - bne _08004AA2 - ldr r0, [r4, #0xc] - cmp r0, #0 - bne _08004AA2 - ldr r5, _08004A80 @ =gUnk_08BBFD28 - b _08004A8A - .align 2, 0 -_08004A80: .4byte gUnk_08BBFD28 -_08004A84: - ldr r0, [r4] - cmp r0, #0 - beq _08004AA2 -_08004A8A: - ldr r0, [r4, #4] - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r0, r0, #2 - adds r0, r0, r5 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08004A84 -_08004AA2: - pop {r4, r5} - pop {r0} - bx r0 - - thumb_func_start nullsub_2 -nullsub_2: @ 0x08004AA8 - bx lr - .align 2, 0 - - thumb_func_start sub_8004AAC -sub_8004AAC: @ 0x08004AAC - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - beq _08004ABC - bl sub_8004AAC -_08004ABC: - adds r0, r4, #0 - bl nullsub_2 - ldr r1, [r4, #0x18] - cmp r1, #0 - beq _08004ADC - ldr r0, [r5] - adds r0, #2 - str r0, [r5] - adds r0, r1, #0 - adds r1, r5, #0 - bl sub_8004AAC - ldr r0, [r5] - subs r0, #2 - str r0, [r5] -_08004ADC: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start sub_8004AE4 -sub_8004AE4: @ 0x08004AE4 - push {r4, lr} - sub sp, #4 - adds r4, r0, #0 - movs r0, #4 - str r0, [sp] - adds r0, r4, #0 - bl nullsub_2 - ldr r1, [r4, #0x18] - cmp r1, #0 - beq _08004B0E - ldr r0, [sp] - adds r0, #2 - str r0, [sp] - adds r0, r1, #0 - mov r1, sp - bl sub_8004AAC - ldr r0, [sp] - subs r0, #2 - str r0, [sp] -_08004B0E: - add sp, #4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start nullsub_22 -nullsub_22: @ 0x08004B18 - bx lr - .align 2, 0 - - thumb_func_start sub_8004B1C -sub_8004B1C: @ 0x08004B1C - str r1, [r0, #0xc] - bx lr - - thumb_func_start sub_8004B20 -sub_8004B20: @ 0x08004B20 - adds r0, #0x28 - ldrb r1, [r0] - adds r1, #1 - strb r1, [r0] - bx lr - .align 2, 0 - - thumb_func_start sub_8004B2C -sub_8004B2C: @ 0x08004B2C - adds r0, #0x28 - ldrb r1, [r0] - subs r1, #1 - strb r1, [r0] - bx lr - .align 2, 0 - - thumb_func_start Proc_FindAfter -Proc_FindAfter: @ 0x08004B38 - adds r3, r0, #0 - cmp r1, #0 - bne _08004B4C - ldr r1, _08004B44 @ =0x02024E20 - b _08004B4E - .align 2, 0 -_08004B44: .4byte 0x02024E20 -_08004B48: - adds r0, r1, #0 - b _08004B64 -_08004B4C: - adds r1, #0x6c -_08004B4E: - ldr r0, _08004B68 @ =0x02026920 - cmp r1, r0 - bhs _08004B62 - adds r2, r0, #0 -_08004B56: - ldr r0, [r1] - cmp r0, r3 - beq _08004B48 - adds r1, #0x6c - cmp r1, r2 - blo _08004B56 -_08004B62: - movs r0, #0 -_08004B64: - bx lr - .align 2, 0 -_08004B68: .4byte 0x02026920 - - thumb_func_start Proc_FindAfterWithParent -Proc_FindAfterWithParent: @ 0x08004B6C - adds r2, r0, #0 - cmp r2, #0 - bne _08004B80 - ldr r2, _08004B78 @ =0x02024E20 - b _08004B82 - .align 2, 0 -_08004B78: .4byte 0x02024E20 -_08004B7C: - adds r0, r2, #0 - b _08004B98 -_08004B80: - adds r2, #0x6c -_08004B82: - ldr r0, _08004B9C @ =0x02026920 - cmp r2, r0 - bhs _08004B96 - adds r3, r0, #0 -_08004B8A: - ldr r0, [r2, #0x14] - cmp r0, r1 - beq _08004B7C - adds r2, #0x6c - cmp r2, r3 - blo _08004B8A -_08004B96: - movs r0, #0 -_08004B98: - bx lr - .align 2, 0 -_08004B9C: .4byte 0x02026920 - - thumb_func_start sub_8004BA0 -sub_8004BA0: @ 0x08004BA0 - movs r2, #0x40 - ldr r1, _08004BBC @ =0x02024E20 - ldr r0, _08004BC0 @ =0x00001A94 - adds r3, r1, r0 -_08004BA8: - ldr r0, [r1] - cmp r0, #0 - beq _08004BB0 - subs r2, #1 -_08004BB0: - adds r1, #0x6c - cmp r1, r3 - ble _08004BA8 - adds r0, r2, #0 - bx lr - .align 2, 0 -_08004BBC: .4byte 0x02024E20 -_08004BC0: .4byte 0x00001A94 diff --git a/src/proc.c b/src/proc.c new file mode 100644 index 0000000..3435e84 --- /dev/null +++ b/src/proc.c @@ -0,0 +1,1046 @@ +#include "gbafe.h" + +void UnlinkProcess(struct Proc *); +struct Proc * AllocateProcess(); +void FreeProcess(struct Proc * proc); +void InsertRootProcess(struct Proc * proc, ProcPtr parent); +void InsertChildProcess(struct Proc * proc, struct Proc * parent); +void sub_8004A60(ProcPtr proc); + +#define PROC_COUNT 64 + +typedef bool (*BoolProcFunc)(ProcPtr); + +extern EWRAM_DATA struct Proc Unk_02024E20[PROC_COUNT]; // sProcArray +extern EWRAM_DATA struct Proc * Unk_02026920[PROC_COUNT + 1]; // sProcAllocList +extern EWRAM_DATA struct Proc ** Unk_02026A24; // sProcAllocListHead +extern EWRAM_DATA struct Proc * Unk_02026A28[8]; // gProcTreeRootArray + +void Proc_Init() +{ + int i; + + for (i = 0; i < PROC_COUNT; i++) + { + struct Proc * ptr = &Unk_02024E20[i]; + ptr->proc_script = 0; + ptr->proc_scrCur = 0; + ptr->proc_endCb = 0; + ptr->proc_idleCb = 0; + ptr->proc_name = 0; + ptr->proc_parent = 0; + ptr->proc_child = 0; + ptr->proc_next = 0; + ptr->proc_prev = 0; + ptr->proc_sleepTime = 0; + ptr->proc_mark = 0; + ptr->proc_flags = 0; + ptr->proc_lockCnt = 0; + + Unk_02026920[i] = ptr; + } + + Unk_02026920[PROC_COUNT] = 0; + Unk_02026A24 = Unk_02026920; + + for (i = 0; i < 8; i++) + { + Unk_02026A28[i] = 0; + } +} + +ProcPtr Proc_Start(const struct ProcCmd * script, ProcPtr parent) +{ + struct Proc * proc = AllocateProcess(); + proc->proc_script = script; + proc->proc_scrCur = script; + proc->proc_endCb = 0; + proc->proc_idleCb = 0; + proc->proc_parent = 0; + proc->proc_child = 0; + proc->proc_next = 0; + proc->proc_prev = 0; + proc->proc_sleepTime = 0; + proc->proc_mark = 0; + proc->proc_lockCnt = 0; + proc->proc_flags = 8; + + if ((s32)parent < 8) + { + InsertRootProcess(proc, parent); + } + else + { + InsertChildProcess(proc, parent); + } + + sub_8004A60(proc); + proc->proc_flags &= 0xf7; + + return proc; +} + +ProcPtr Proc_StartBlocking(const struct ProcCmd * script, ProcPtr parent) +{ + struct Proc * proc = Proc_Start(script, parent); + + if (!proc->proc_script) + { + return 0; + } + + proc->proc_flags |= 2; + ((struct Proc *)proc->proc_parent)->proc_lockCnt++; + + return proc; +} + +void DeleteProcessRecursive(struct Proc * proc) +{ + if (proc->proc_prev) + { + DeleteProcessRecursive(proc->proc_prev); + } + + if (proc->proc_child) + { + DeleteProcessRecursive(proc->proc_child); + } + + if (!(proc->proc_flags & 1)) + { + if (proc->proc_endCb) + { + proc->proc_endCb(proc); + } + + FreeProcess(proc); + + proc->proc_script = 0; + proc->proc_idleCb = 0; + + proc->proc_flags |= 1; + + if (proc->proc_flags & 2) + { + ((struct Proc *)proc->proc_parent)->proc_lockCnt--; + } + } +} + +void Proc_End(ProcPtr proc) +{ + if (proc) + { + UnlinkProcess(proc); + DeleteProcessRecursive(proc); + } +} + +struct Proc * AllocateProcess() +{ + ProcPtr proc = *Unk_02026A24; + Unk_02026A24++; + + return proc; +} + +void FreeProcess(struct Proc * proc) +{ + Unk_02026A24--; + *Unk_02026A24 = proc; +} + +#if NONMATCHING + +// ASM is matching but binary has a different byte 0x44AB + +void InsertRootProcess(struct Proc * proc, ProcPtr parent) +{ + struct Proc ** ptr = &Unk_02026A28[(s32)parent]; + + if (*ptr != 0) + { + (*ptr)->proc_next = proc; + proc->proc_prev = ptr; + } + + proc->proc_parent = parent; + *ptr = proc; +} + +#else + +NAKEDFUNC +void InsertRootProcess(struct Proc * proc, ProcPtr parent) +{ + asm("\n\ + .syntax unified\n\ + adds r2, r0, #0\n\ + adds r3, r1, #0\n\ + lsls r1, r3, #2\n\ + ldr r0, _080044B4 @ =0x02026A28\n\ + adds r1, r1, r0\n\ + ldr r0, [r1]\n\ + cmp r0, #0\n\ + beq _080044AC\n\ + str r2, [r0, #0x1c]\n\ + str r0, [r2, #0x20]\n\ +_080044AC:\n\ + str r3, [r2, #0x14]\n\ + str r2, [r1]\n\ + bx lr\n\ + .align 2, 0\n\ +_080044B4: .4byte 0x02026A28\n\ + .syntax divided\n\ +"); +} + +#endif + +void InsertChildProcess(struct Proc * proc, struct Proc * parent) +{ + if (parent->proc_child) + { + ((struct Proc *)parent->proc_child)->proc_next = proc; + proc->proc_prev = parent->proc_child; + } + + parent->proc_child = proc; + proc->proc_parent = parent; +} + +void UnlinkProcess(struct Proc * proc) +{ + if (proc->proc_next) + { + ((struct Proc *)proc->proc_next)->proc_prev = proc->proc_prev; + } + + if (proc->proc_prev) + { + ((struct Proc *)proc->proc_prev)->proc_next = proc->proc_next; + } + + if ((s32)proc->proc_parent > 8) + { + if (((struct Proc *)proc->proc_parent)->proc_child == proc) + { + ((struct Proc *)proc->proc_parent)->proc_child = proc->proc_prev; + } + } + else + { + s32 idx = (s32)proc->proc_parent; + if (*(idx + Unk_02026A28) == proc) + { + Unk_02026A28[idx] = proc->proc_prev; + } + } + + proc->proc_next = 0; + proc->proc_prev = 0; +} + +void RunProcessRecursive(struct Proc * proc) +{ + if (proc->proc_prev) + { + RunProcessRecursive(proc->proc_prev); + } + + if (proc->proc_lockCnt != 0 || (proc->proc_flags & 8)) + { + goto skip_exec; + } + + if (!proc->proc_idleCb) + { + sub_8004A60(proc); + } + + if (proc->proc_idleCb) + { + proc->proc_idleCb(proc); + } + + if (proc->proc_flags & 1) + { + return; + } + +skip_exec: + if (proc->proc_child) + { + RunProcessRecursive(proc->proc_child); + } +} + +void Proc_Run(ProcPtr proc) +{ + if (proc) + { + RunProcessRecursive(proc); + } +} + +void Proc_Break(ProcPtr proc) +{ + ((struct Proc*)proc)->proc_idleCb = 0; +} + +ProcPtr Proc_Find(const struct ProcCmd * script) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script == script) + { + return ptr; + } + } + + return 0; +} + +ProcPtr Proc_FindNonBlocked(const struct ProcCmd * script) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script == script && ptr->proc_lockCnt == 0) + { + return ptr; + } + } + + return 0; +} + +ProcPtr sub_80045D0(int mark) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script && ptr->proc_mark == mark) + { + return ptr; + } + } + + return 0; +} + +void Proc_Goto(ProcPtr proc, int label) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_script; + while (cmd_ptr->opcode != 0) + { + if (cmd_ptr->opcode == 0xB && cmd_ptr->dataImm == label) + { + p->proc_scrCur = cmd_ptr; + p->proc_idleCb = 0; + return; + } + + cmd_ptr++; + } +} + +void sub_8004634(ProcPtr proc, const struct ProcCmd * script) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_scrCur = script; + p->proc_idleCb = 0; +} + +void sub_800463C(ProcPtr proc, u8 mark) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_mark = mark; +} + +void sub_8004644(ProcPtr proc, ProcFunc func) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_endCb = func; +} + +void sub_8004648(ProcFunc func) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script) + { + func(ptr); + } + } +} + +void Proc_ForEach(const struct ProcCmd * script, ProcFunc func) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script == script) + { + func(ptr); + } + } +} + +void sub_8004698(int mark, ProcFunc func) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_mark == mark) + { + func(ptr); + } + } +} + +void Proc_BlockEachMarked(int mark) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_mark == mark) + { + ptr->proc_lockCnt++; + } + } +} + +void Proc_UnblockEachMarked(int mark) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_mark == mark) + { + if (ptr->proc_lockCnt) + { + ptr->proc_lockCnt--; + } + } + } +} + +void Proc_EndEachMarked(int mark) +{ + int i; + struct Proc * ptr = Unk_02024E20; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_mark == mark) + { + Proc_End(ptr); + } + } +} + +void EndProc(ProcPtr proc) +{ + Proc_End(proc); +} + +void Proc_EndEach(const struct ProcCmd * script) +{ + Proc_ForEach(script, EndProc); +} + +void ClearNativeCallback(ProcPtr proc) +{ + Proc_Break(proc); +} + +void Proc_BreakEach(const struct ProcCmd * script) +{ + Proc_ForEach(script, ClearNativeCallback); +} + +void ForAllFollowingProcs(ProcPtr proc, ProcFunc func) +{ + struct Proc * p = ((struct Proc*)proc); + + if (p->proc_prev) + { + ForAllFollowingProcs(p->proc_prev, func); + } + + func(proc); + + if (p->proc_child) + { + ForAllFollowingProcs(p->proc_child, func); + } +} + +void sub_800479C(ProcPtr proc, ProcFunc func) +{ + struct Proc * p = ((struct Proc*)proc); + + func(proc); + + if (p->proc_child) + { + ForAllFollowingProcs(p->proc_child, func); + } +} + +int sub_80047B8(ProcPtr proc) +{ + Proc_End(proc); + return 0; +} + +int sub_80047C4(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_name = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + + return 1; +} + +int sub_80047D4(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + ProcFunc func = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + func(p); + + return 1; +} + +bool sub_80047E8(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + BoolProcFunc func = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + + return func(p); +} + +#if NONMATCHING + +// r1 and r2 are swapped + +bool sub_8004800(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + short arg = p->proc_scrCur->dataImm; + bool(* func)(short) = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + + return func(arg); +} + +#else + +NAKEDFUNC +bool sub_8004800(ProcPtr proc) +{ + asm("\n\ + .syntax unified\n\ + push {lr}\n\ + adds r1, r0, #0\n\ + ldr r2, [r1, #4]\n\ + ldrh r0, [r2, #2]\n\ + ldr r3, [r2, #4]\n\ + adds r2, #8\n\ + str r2, [r1, #4]\n\ + lsls r0, r0, #0x10\n\ + asrs r0, r0, #0x10\n\ + bl _call_via_r3\n\ + lsls r0, r0, #0x18\n\ + asrs r0, r0, #0x18\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ + .syntax divided\n\ +"); +} + +#endif + +bool sub_8004820(ProcPtr proc) +{ + bool ret; + struct Proc * p = ((struct Proc*)proc); + + BoolProcFunc func = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + + ret = func(p); + if (ret == TRUE) + { + p->proc_scrCur--; + return FALSE; + } + + return TRUE; +} + +int sub_800484C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_idleCb = p->proc_scrCur->dataPtr; + p->proc_scrCur++; + + return 0; +} + +int sub_800485C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + ProcFunc func = p->proc_scrCur->dataPtr; + sub_8004644(p, func); + p->proc_scrCur++; + + return 1; +} + +int sub_8004878(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + Proc_Start(cmd_ptr, p); + p->proc_scrCur++; + + return 1; +} + +int sub_8004894(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + Proc_StartBlocking(cmd_ptr, p); + p->proc_scrCur++; + + return 0; +} + +int sub_80048B0(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + Proc_Start(cmd_ptr, (ProcPtr)(s32)p->proc_sleepTime); + p->proc_scrCur++; + + return 1; +} + +int sub_80048D0(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + s32 ret = (s32)Proc_Find(cmd_ptr); + if (((0 - ret) | ret) < 0) // ??? + { + return 0; + } + + p->proc_scrCur++; + return 1; +} + +int sub_80048F8(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + Proc_EndEach(cmd_ptr); + + p->proc_scrCur++; + return 1; +} + +int sub_8004914(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + Proc_BreakEach(cmd_ptr); + + p->proc_scrCur++; + return 1; +} + +int sub_8004930(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_scrCur++; + return 1; +} + +int sub_800493C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd * cmd_ptr = p->proc_scrCur->dataPtr; + sub_8004634(proc, cmd_ptr); + + return 1; +} + +int sub_800494C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + Proc_Goto(proc, p->proc_scrCur->dataImm); + + return 1; +} + +void sub_8004960(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + if (--p->proc_sleepTime == 0) + { + Proc_Break(p); + } +} + +int sub_800497C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + const struct ProcCmd **proc_scrCur = &p->proc_scrCur; + if ((*proc_scrCur)->dataImm) + { + p->proc_sleepTime = (*proc_scrCur)->dataImm; + p->proc_idleCb = sub_8004960; + } + + (*proc_scrCur)++; + return 0; +} + +int sub_80049A0(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_mark = p->proc_scrCur->dataImm; + p->proc_scrCur++; + + return 1; +} + +int sub_80049B4(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_scrCur++; + + return 1; +} + +int sub_80049C0(ProcPtr proc) +{ + return 0; +} + +int sub_80049C4(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + struct Proc * ptr = Unk_02024E20; + int i, j; + + for (i = 0, j = 0; i < PROC_COUNT; i++, ptr++) + { + if (ptr->proc_script == p->proc_script) + { + j++; + } + } + + if (j > 1) + { + Proc_End(p); + return 0; + } + else + { + p->proc_scrCur++; + return 1; + } +} + +int sub_8004A04(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + struct Proc * ptr = Unk_02024E20; + int i; + + for (i = 0; i < PROC_COUNT; i++, ptr++) + { + if (((struct Proc*)ptr) != p && ptr->proc_script == p->proc_script) + { + Proc_End(ptr); + break; + } + } + + p->proc_scrCur++; + return 1; +} + +int sub_8004A3C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_scrCur++; + + return 1; +} + +int sub_8004A48(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + p->proc_flags |= 4; + p->proc_scrCur++; + + return 1; +} + +#if NONMATCHING + +// seems to be a local static variable (cf StepProcScr in fe6j) +extern BoolProcFunc gUnk_08BBFD28[]; + +void sub_8004A60(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + + if (p->proc_script && !p->proc_lockCnt && !p->proc_idleCb && p->proc_scrCur) + { + while (gUnk_08BBFD28[p->proc_scrCur->opcode](p)) + { + if (p->proc_script) + { + break; + } + } + } +} + +#else + +NAKEDFUNC +void sub_8004A60(ProcPtr proc) +{ + asm("\n\ + .syntax unified\n\ + push {r4, r5, lr}\n\ + adds r4, r0, #0\n\ + ldr r0, [r4]\n\ + cmp r0, #0\n\ + beq _08004AA2\n\ + adds r0, r4, #0\n\ + adds r0, #0x28\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne _08004AA2\n\ + ldr r0, [r4, #0xc]\n\ + cmp r0, #0\n\ + bne _08004AA2\n\ + ldr r5, _08004A80 @ =gUnk_08BBFD28\n\ + b _08004A8A\n\ + .align 2, 0\n\ +_08004A80: .4byte gUnk_08BBFD28\n\ +_08004A84:\n\ + ldr r0, [r4]\n\ + cmp r0, #0\n\ + beq _08004AA2\n\ +_08004A8A:\n\ + ldr r0, [r4, #4]\n\ + movs r1, #0\n\ + ldrsh r0, [r0, r1]\n\ + lsls r0, r0, #2\n\ + adds r0, r0, r5\n\ + ldr r1, [r0]\n\ + adds r0, r4, #0\n\ + bl _call_via_r1\n\ + lsls r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne _08004A84\n\ +_08004AA2:\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n\ +"); +} + +#endif + +void nullsub_2(ProcPtr proc) +{ +} + +void sub_8004AAC(ProcPtr proc, int * a1) +{ + struct Proc * p = ((struct Proc*)proc); + + if (p->proc_prev) + { + sub_8004AAC(p->proc_prev, a1); + } + + nullsub_2(proc); + + if (p->proc_child) + { + *a1 += 2; + sub_8004AAC(p->proc_child, a1); + *a1 -= 2; + } +} + +void sub_8004AE4(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + int i = 4; + + nullsub_2(p); + + if (p->proc_child) + { + i += 2; + sub_8004AAC(p->proc_child, &i); + i -= 2; + } +} + +void nullsub_22() +{ +} + +void sub_8004B1C(ProcPtr proc, ProcFunc func) +{ + struct Proc * p = ((struct Proc*)proc); + p->proc_idleCb = func; +} + +void sub_8004B20(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + p->proc_lockCnt++; +} + +void sub_8004B2C(ProcPtr proc) +{ + struct Proc * p = ((struct Proc*)proc); + p->proc_lockCnt--; +} + +ProcPtr Proc_FindAfter(struct ProcCmd * script, struct Proc * proc) +{ + struct Proc * proc_ptr = proc; + + if (!proc_ptr) + { + proc_ptr = Unk_02024E20; + } + else + { + proc_ptr++; + } + + while (proc_ptr < (struct Proc *)Unk_02026920) + { + if (proc_ptr->proc_script == script) + { + return proc_ptr; + } + + proc_ptr++; + } + + return 0; +} + +struct Proc * Proc_FindAfterWithParent(struct Proc * proc, struct Proc * parent) +{ + struct Proc * proc_ptr = proc; + + if (!proc_ptr) + { + proc_ptr = Unk_02024E20; + } + else + { + proc_ptr++; + } + + while (proc_ptr < (struct Proc *)Unk_02026920) + { + if (proc_ptr->proc_parent == parent) + { + return proc_ptr; + } + + proc_ptr++; + } + + return 0; +} + +int sub_8004BA0() +{ + int i = PROC_COUNT; + struct Proc * ptr = Unk_02024E20; + s32 target = (s32)ptr + 0x00001A94; + + do + { + if (ptr->proc_script) + { + i--; + } + + ptr++; + } + while ((s32)ptr <= target); + + return i; +}