diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | asm/battle_bg.s | 4 | ||||
-rw-r--r-- | asm/librfu_intr.s | 697 | ||||
-rw-r--r-- | asm/overworld.s | 44 | ||||
-rwxr-xr-x | asmdiff.sh | 2 | ||||
-rw-r--r-- | common_syms/help_system_812B1E0.txt | 2 | ||||
-rw-r--r-- | common_syms/link_rfu.txt | 2 | ||||
-rw-r--r-- | include/global.h | 4 | ||||
-rw-r--r-- | include/help_system.h | 34 | ||||
-rw-r--r-- | include/librfu.h | 33 | ||||
-rw-r--r-- | include/link.h | 2 | ||||
-rw-r--r-- | include/link_rfu.h | 342 | ||||
-rw-r--r-- | include/overworld.h | 2 | ||||
-rw-r--r-- | include/union_room.h | 9 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/help_system.c | 60 | ||||
-rw-r--r-- | src/help_system_812B1E0.c | 423 | ||||
-rw-r--r-- | src/librfu_intr.c | 402 | ||||
-rw-r--r-- | src/librfu_rfu.c | 271 | ||||
-rw-r--r-- | src/librfu_stwi.c | 81 | ||||
-rw-r--r-- | src/link.c | 10 | ||||
-rw-r--r-- | src/link_rfu.c | 1413 | ||||
-rw-r--r-- | src/link_rfu_2.c | 716 | ||||
-rw-r--r-- | src/link_rfu_3.c | 189 | ||||
-rw-r--r-- | src/party_menu.c | 4 | ||||
-rw-r--r-- | src/rfu_union_tool.c | 10 | ||||
-rw-r--r-- | src/union_room.c | 470 | ||||
-rw-r--r-- | src/union_room_chat.c | 8 | ||||
-rw-r--r-- | src/wireless_communication_status_screen.c | 4 |
29 files changed, 2544 insertions, 2699 deletions
@@ -173,6 +173,9 @@ $(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork $(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/flying.o: CFLAGS += -ffreestanding +$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm +$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet + ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: c_dep := else diff --git a/asm/battle_bg.s b/asm/battle_bg.s index 96f33cb3c..e21617e70 100644 --- a/asm/battle_bg.s +++ b/asm/battle_bg.s @@ -1270,7 +1270,7 @@ _0800FBF8: _0800FC00: .4byte gTrainers _0800FC04: .4byte gTrainerBattleOpponent_A _0800FC08: - bl sav1_map_get_battletype + bl GetCurrentMapBattleScene lsls r0, 24 cmp r0, 0 bne _0800FC20 @@ -1341,7 +1341,7 @@ _0800FC88: movs r0, 0x13 b _0800FCAA _0800FC90: - bl sav1_map_get_battletype + bl GetCurrentMapBattleScene lsls r0, 24 lsrs r0, 24 cmp r0, 0 diff --git a/asm/librfu_intr.s b/asm/librfu_intr.s deleted file mode 100644 index 2cc761554..000000000 --- a/asm/librfu_intr.s +++ /dev/null @@ -1,697 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - arm_func_start IntrSIO32 -IntrSIO32: @ 81DFC50 - mov r12, sp - stmdb sp!, {r11,r12,lr,pc} - ldr r3, _081DFCB0 @ =gSTWIStatus - ldr r0, [r3] - ldr r2, [r0] - sub r11, r12, 0x4 - cmp r2, 0xA - bne _081DFC8C - ldr r0, [r0, 0x20] - cmp r0, 0 - ldmdbeq r11, {r11,sp,lr} - bxeq lr - bl Callback_Dummy_ID - ldmdb r11, {r11,sp,lr} - bx lr -_081DFC8C: - ldrb r3, [r0, 0x14] - cmp r3, 0x1 - bne _081DFCA4 - bl sio32intr_clock_master - ldmdb r11, {r11,sp,lr} - bx lr -_081DFCA4: - bl sio32intr_clock_slave - ldmdb r11, {r11,sp,lr} - bx lr - .align 2, 0 -_081DFCB0: .4byte gSTWIStatus - arm_func_end IntrSIO32 - - arm_func_start sio32intr_clock_master -sio32intr_clock_master: @ 81DFCB4 - mov r12, sp - stmdb sp!, {r4-r6,r11,r12,lr,pc} - mov r0, 0x50 - sub r11, r12, 0x4 - bl STWI_set_timer_in_RAM - mov r4, 0x120 - ldr r2, _081DFF28 @ =gSTWIStatus - add r4, r4, 0x4000000 - ldr lr, [r4] - ldr r12, [r2] - ldr r3, [r12] - mov r6, r2 - cmp r3, 0 - bne _081DFD34 - cmp lr, 0x80000000 - bne _081DFDB4 - ldrb r2, [r12, 0x5] - ldrb r3, [r12, 0x4] - cmp r2, r3 - bhi _081DFD24 - ldr r3, [r12, 0x24] - mov r1, r2 - ldr r2, [r3, r1, lsl 2] - str r2, [r4] - ldrb r3, [r12, 0x5] - add r3, r3, 0x1 - strb r3, [r12, 0x5] - b _081DFE10 -_081DFD24: - mov r3, 0x1 - str r3, [r12] - str lr, [r4] - b _081DFE10 -_081DFD34: - ldr r3, [r12] - cmp r3, 0x1 - bne _081DFDC4 - mov r3, 0x99000000 - add r3, r3, 0x660000 - mov r5, 0x80000000 - and r2, lr, r5, asr 15 - cmp r2, r3 - bne _081DFDB4 - mov r3, 0 - strb r3, [r12, 0x8] - ldr r1, [r6] - ldrb r0, [r1, 0x8] - ldr r2, [r1, 0x28] - str lr, [r2, r0, lsl 2] - ldrb r3, [r1, 0x8] - add r3, r3, 0x1 - strb r3, [r1, 0x8] - ldr r2, [r6] - strb lr, [r2, 0x9] - ldr r3, [r6] - mov r2, lr, lsr 8 - strb r2, [r3, 0x7] - ldr r1, [r6] - ldrb r2, [r1, 0x7] - ldrb r3, [r1, 0x8] - cmp r2, r3 - bcc _081DFDFC - mov r3, 0x2 - str r3, [r1] - str r5, [r4] - b _081DFE10 -_081DFDB4: - bl STWI_stop_timer_in_RAM - mov r0, 0x82 - bl STWI_set_timer_in_RAM - b _081DFF3C -_081DFDC4: - ldr r3, [r12] - cmp r3, 0x2 - bne _081DFE10 - ldrb r1, [r12, 0x8] - ldr r2, [r12, 0x28] - str lr, [r2, r1, lsl 2] - ldrb r3, [r12, 0x8] - add r3, r3, 0x1 - strb r3, [r12, 0x8] - ldr r1, [r6] - ldrb r2, [r1, 0x7] - ldrb r3, [r1, 0x8] - cmp r2, r3 - bcs _081DFE08 -_081DFDFC: - mov r3, 0x3 - str r3, [r1] - b _081DFE10 -_081DFE08: - mov r3, 0x80000000 - str r3, [r4] -_081DFE10: - mov r0, 0x1 - bl handshake_wait - mov r0, r0, lsl 16 - cmp r0, 0x10000 - beq _081DFF3C - mov r4, 0x128 - add r4, r4, 0x4000000 - mov r5, 0x5000 - add r3, r5, 0xB - strh r3, [r4] - mov r0, 0 - bl handshake_wait - mov r0, r0, lsl 16 - cmp r0, 0x10000 - beq _081DFF3C - bl STWI_stop_timer_in_RAM - ldr r1, [r6] - ldr r0, [r1] - cmp r0, 0x3 - bne _081DFF2C - ldrb r3, [r1, 0x9] - cmp r3, 0xA5 - cmpne r3, 0xA7 - beq _081DFE84 - and r3, r3, 0xFF - cmp r3, 0xB5 - beq _081DFE84 - cmp r3, 0xB7 - bne _081DFECC -_081DFE84: - mov r1, 0x120 - add r1, r1, 0x4000000 - mov r12, 0x128 - add r12, r12, 0x4000000 - ldr r0, [r6] - mov r3, 0 - strb r3, [r0, 0x14] - mov r2, 0x80000000 - str r2, [r1] - add r3, r3, 0x5000 - add r2, r3, 0x2 - strh r2, [r12] - add r3, r3, 0x82 - strh r3, [r12] - ldr r2, [r6] - mov r3, 0x5 - str r3, [r2] - b _081DFEFC -_081DFECC: - cmp r3, 0xEE - bne _081DFEEC - add r3, r5, 0x3 - strh r3, [r4] - mov r2, 0x4 - str r2, [r1] - strh r0, [r1, 0x12] - b _081DFEFC -_081DFEEC: - add r3, r5, 0x3 - strh r3, [r4] - mov r2, 0x4 - str r2, [r1] -_081DFEFC: - ldr r2, [r6] - mov r3, 0 - strb r3, [r2, 0x2C] - ldr r0, [r6] - ldr r2, [r0, 0x18] - cmp r2, r3 - beq _081DFF3C - ldrh r1, [r0, 0x12] - ldrb r0, [r0, 0x6] - bl Callback_Dummy_M - b _081DFF3C - .align 2, 0 -_081DFF28: .4byte gSTWIStatus -_081DFF2C: - add r3, r5, 0x3 - strh r3, [r4] - add r2, r5, 0x83 - strh r2, [r4] -_081DFF3C: - ldmdb r11, {r4-r6,r11,sp,lr} - bx lr - arm_func_end sio32intr_clock_master - - arm_func_start sio32intr_clock_slave -sio32intr_clock_slave: @ 81DFF44 - mov r12, sp - stmdb sp!, {r4-r6,r11,r12,lr,pc} - ldr r4, _081E02F0 @ =gSTWIStatus - mov r0, 0x64 - ldr r3, [r4] - mov r6, 0 - strb r6, [r3, 0x10] - sub r11, r12, 0x4 - bl STWI_set_timer_in_RAM - mov r0, r6 - bl handshake_wait - mov r0, r0, lsl 16 - cmp r0, 0x10000 - mov r5, r4 - beq _081E0348 - mov r3, 0x128 - add r3, r3, 0x4000000 - mov r2, 0x5000 - add r2, r2, 0xA - strh r2, [r3] - mov lr, 0x120 - ldr r0, [r5] - add lr, lr, 0x4000000 - ldr r12, [lr] - ldr r3, [r0] - cmp r3, 0x5 - bne _081E0074 - ldr r3, [r0, 0x28] - mov r4, 0x1 - mov r0, 0x99000000 - str r12, [r3] - add r0, r0, 0x660000 - ldr r2, [r5] - mov r3, r0, lsr 16 - strb r4, [r2, 0x5] - cmp r3, r12, lsr 16 - bne _081E01C0 - ldr r3, [r5] - mov r2, r12, lsr 8 - strb r2, [r3, 0x4] - ldr r2, [r5] - strb r12, [r2, 0x6] - ldr r1, [r5] - ldrb r3, [r1, 0x4] - cmp r3, r6 - bne _081E0058 - ldrb r2, [r1, 0x6] - sub r3, r2, 0x27 - cmp r2, 0x36 - cmpne r3, 0x2 - bhi _081E002C - add r3, r2, 0x80 - strb r3, [r1, 0x9] - ldr r2, [r5] - ldrb r3, [r2, 0x9] - ldr r1, [r2, 0x24] - add r3, r3, r0 - b _081E00DC -_081E002C: - ldr r2, [r1, 0x24] - ldr r3, _081E02F4 @ =0x996601ee - str r3, [r2] - ldr r2, [r5] - ldrb r3, [r2, 0x6] - sub r3, r3, 0x10 - cmp r3, 0x2D - bhi _081E0114 - ldr r3, [r2, 0x24] - str r4, [r3, 0x4] - b _081E0120 -_081E0058: - mov r3, 0x80000000 - str r3, [lr] - strb r4, [r1, 0x5] - ldr r2, [r5] - add r3, r3, 0x80000006 - str r3, [r2] - b _081E01D0 -_081E0074: - ldr r3, [r0] - cmp r3, 0x6 - bne _081E0174 - ldrb r1, [r0, 0x5] - ldr r2, [r0, 0x28] - str r12, [r2, r1, lsl 2] - ldrb r3, [r0, 0x5] - add r3, r3, 0x1 - strb r3, [r0, 0x5] - ldr r1, [r5] - ldrb r2, [r1, 0x4] - ldrb r3, [r1, 0x5] - cmp r2, r3 - bcs _081E0168 - ldrb r2, [r1, 0x6] - sub r3, r2, 0x28 - cmp r2, 0x36 - cmpne r3, 0x1 - bhi _081E00EC - add r3, r2, 0x80 - strb r3, [r1, 0x9] - ldr r2, [r5] - ldrb r3, [r2, 0x9] - ldr r1, [r2, 0x24] - orr r3, r3, 0x99000000 - orr r3, r3, 0x660000 -_081E00DC: - str r3, [r1] - ldr r2, [r5] - strb r6, [r2, 0x7] - b _081E0138 -_081E00EC: - ldr r2, [r1, 0x24] - ldr r3, _081E02F4 @ =0x996601ee - str r3, [r2] - ldr r2, [r5] - ldrb r3, [r2, 0x6] - sub r3, r3, 0x10 - cmp r3, 0x2D - ldrls r2, [r2, 0x24] - movls r3, 0x1 - bls _081E011C -_081E0114: - ldr r2, [r2, 0x24] - mov r3, 0x2 -_081E011C: - str r3, [r2, 0x4] -_081E0120: - ldr r2, [r5] - mov r3, 0x1 - strb r3, [r2, 0x7] - ldr r1, [r5] - add r3, r3, 0x2 - strh r3, [r1, 0x12] -_081E0138: - ldr r0, [r5] - ldr r2, [r0, 0x24] - mov r3, 0x120 - ldr r1, [r2] - add r3, r3, 0x4000000 - str r1, [r3] - mov r2, 0x1 - strb r2, [r0, 0x8] - ldr r1, [r5] - mov r3, 0x7 - str r3, [r1] - b _081E01D0 -_081E0168: - mov r3, 0x80000000 - str r3, [lr] - b _081E01D0 -_081E0174: - ldr r3, [r0] - cmp r3, 0x7 - bne _081E01D0 - cmp r12, 0x80000000 - bne _081E01C0 - ldrb r2, [r0, 0x7] - ldrb r3, [r0, 0x8] - cmp r2, r3 - movcc r3, 0x8 - strcc r3, [r0] - bcc _081E01D0 - ldrb r1, [r0, 0x8] - ldr r3, [r0, 0x24] - ldr r2, [r3, r1, lsl 2] - str r2, [lr] - ldrb r3, [r0, 0x8] - add r3, r3, 0x1 - strb r3, [r0, 0x8] - b _081E01D0 -_081E01C0: - bl STWI_stop_timer_in_RAM - mov r0, 0x64 - bl STWI_set_timer_in_RAM - b _081E0348 -_081E01D0: - mov r0, 0x1 - bl handshake_wait - mov r0, r0, lsl 16 - cmp r0, 0x10000 - beq _081E0348 - mov r6, r5 - ldr r3, [r6] - ldr r2, [r3] - cmp r2, 0x8 - bne _081E0298 - mov r4, 0x128 - add r4, r4, 0x4000000 - mov r3, 0x5000 - add r3, r3, 0x2 - strh r3, [r4] - bl STWI_stop_timer_in_RAM - ldr r0, [r6] - ldrh r3, [r0, 0x12] - cmp r3, 0x3 - bne _081E0244 - bl STWI_init_slave - ldr r3, [r6] - ldr r1, [r3, 0x1C] - cmp r1, 0 - beq _081E0348 - mov r0, 0x1EC - add r0, r0, 0x2 - bl Callback_Dummy_S - b _081E0348 -_081E0244: - mov r3, 0x120 - add r3, r3, 0x4000000 - mov r1, 0 - str r1, [r3] - mov r2, 0x5000 - strh r1, [r4] - add r2, r2, 0x3 - strh r2, [r4] - mov r3, 0x1 - strb r3, [r0, 0x14] - ldr r0, [r5] - ldr r2, [r0, 0x1C] - str r1, [r0] - cmp r2, r1 - beq _081E0348 - ldrb r3, [r0, 0x4] - ldrb r0, [r0, 0x6] - mov r1, r2 - orr r0, r0, r3, lsl 8 - bl Callback_Dummy_S - b _081E0348 -_081E0298: - mov r3, 0x208 - add r3, r3, 0x4000000 - mov r2, 0 - strh r2, [r3] - mov r1, 0x100 - add r2, r1, 0x4000002 - ldrh r3, [r2] - tst r3, 0x80 - beq _081E031C - ldrh r3, [r2] - tst r3, 0x3 - bne _081E02F8 - mov r2, 0xFF00 - add r1, r1, 0x4000000 - ldrh r3, [r1] - add r2, r2, 0x9B - cmp r3, r2 - bls _081E031C -_081E02E0: - ldrh r3, [r1] - cmp r3, r2 - bhi _081E02E0 - b _081E031C - .align 2, 0 -_081E02F0: .4byte gSTWIStatus -_081E02F4: .4byte 0x996601ee -_081E02F8: - mov r2, 0xFF00 - add r1, r1, 0x4000000 - ldrh r3, [r1] - add r2, r2, 0xFE - cmp r3, r2 - bls _081E031C -_081E0310: - ldrh r3, [r1] - cmp r3, r2 - bhi _081E0310 -_081E031C: - mov r1, 0x128 - add r1, r1, 0x4000000 - mov r0, 0x208 - add r0, r0, 0x4000000 - mov r3, 0x5000 - add r2, r3, 0x2 - strh r2, [r1] - add r3, r3, 0x82 - strh r3, [r1] - mov r2, 0x1 - strh r2, [r0] -_081E0348: - ldmdb r11, {r4-r6,r11,sp,lr} - bx lr - arm_func_end sio32intr_clock_slave - - arm_func_start handshake_wait -handshake_wait: @ 81E0350 - mov r12, sp - stmdb sp!, {r11,r12,lr,pc} - mov r1, 0x128 - add r1, r1, 0x4000000 - mov r0, r0, lsl 16 - ldr r2, _081E03B4 @ =gSTWIStatus - sub r11, r12, 0x4 - mov lr, r0, lsr 14 - ldr r12, [r2] -_081E0374: - ldrb r3, [r12, 0x10] - and r0, r3, 0xFF - cmp r0, 0x1 - beq _081E03A0 - ldrh r3, [r1] - and r3, r3, 0x4 - cmp r3, lr - bne _081E0374 - mov r0, 0 - ldmdb r11, {r11,sp,lr} - bx lr -_081E03A0: - ldr r2, [r2] - mov r3, 0 - strb r3, [r2, 0x10] - ldmdb r11, {r11,sp,lr} - bx lr - .align 2, 0 -_081E03B4: .4byte gSTWIStatus - arm_func_end handshake_wait - - arm_func_start STWI_set_timer_in_RAM -STWI_set_timer_in_RAM: @ 81E03B8 - mov r12, sp - stmdb sp!, {r4,r5,r11,r12,lr,pc} - mov r1, 0x208 - add r1, r1, 0x4000000 - mov r3, 0 - sub r11, r12, 0x4 - ldr r12, _081E0470 @ =gSTWIStatus - and lr, r0, 0xFF - ldr r2, [r12] - cmp lr, 0x50 - ldrb r0, [r2, 0xA] - mov r4, r12 - mov r2, lr - strh r3, [r1] - mov r0, r0, lsl 2 - add r3, r3, 0x100 - add r1, r3, 0x4000000 - add r3, r3, 0x4000002 - add r5, r0, r3 - beq _081E0440 - bgt _081E0418 - cmp lr, 0x32 - beq _081E042C - b _081E048C -_081E0418: - cmp r2, 0x64 - beq _081E0458 - cmp r2, 0x82 - beq _081E0474 - b _081E048C -_081E042C: - mvn r3, 0x334 - strh r3, [r0, r1] - ldr r2, [r4] - mov r3, 0x1 - b _081E0488 -_081E0440: - mov r3, 0xAE000000 - mov r3, r3, asr 20 - strh r3, [r0, r1] - ldr r2, [r4] - mov r3, 0x2 - b _081E0488 -_081E0458: - mvn r3, 0x660 - sub r3, r3, 0x9 - strh r3, [r0, r1] - ldr r2, [r4] - mov r3, 0x3 - b _081E0488 - .align 2, 0 -_081E0470: .4byte gSTWIStatus -_081E0474: - mvn r3, 0x850 - sub r3, r3, 0x2 - strh r3, [r0, r1] - ldr r2, [r4] - mov r3, 0x4 -_081E0488: - str r3, [r2, 0xC] -_081E048C: - mov r12, 0x200 - add r12, r12, 0x4000002 - mov r3, 0xC3 - strh r3, [r5] - mov r1, 0x208 - ldr r2, [r4] - add r1, r1, 0x4000000 - ldrb r0, [r2, 0xA] - sub r3, r3, 0xBB - mov r3, r3, lsl r0 - strh r3, [r12] - mov r2, 0x1 - strh r2, [r1] - ldmdb r11, {r4,r5,r11,sp,lr} - bx lr - arm_func_end STWI_set_timer_in_RAM - - arm_func_start STWI_stop_timer_in_RAM -STWI_stop_timer_in_RAM: @ 81E04C8 - mov r12, sp - stmdb sp!, {r11,r12,lr,pc} - mov r1, 0x100 - ldr lr, _081E0514 @ =gSTWIStatus - add r0, r1, 0x4000000 - ldr r2, [lr] - sub r11, r12, 0x4 - ldrb r3, [r2, 0xA] - mov r12, 0 - str r12, [r2, 0xC] - mov r3, r3, lsl 2 - strh r12, [r3, r0] - ldr r2, [lr] - ldrb r3, [r2, 0xA] - add r1, r1, 0x4000002 - mov r3, r3, lsl 2 - strh r12, [r3, r1] - ldmdb r11, {r11,sp,lr} - bx lr - .align 2, 0 -_081E0514: .4byte gSTWIStatus - arm_func_end STWI_stop_timer_in_RAM - - arm_func_start STWI_init_slave -STWI_init_slave: @ 81E0518 - mov r12, sp - stmdb sp!, {r11,r12,lr,pc} - ldr r0, _081E05A0 @ =gSTWIStatus - ldr r2, [r0] - mov r3, 0x5 - str r3, [r2] - mov r1, 0 - strb r1, [r2, 0x14] - ldr r3, [r0] - strb r1, [r3, 0x4] - ldr r2, [r0] - strb r1, [r2, 0x5] - ldr r3, [r0] - strb r1, [r3, 0x6] - ldr r2, [r0] - strb r1, [r2, 0x7] - ldr r3, [r0] - strb r1, [r3, 0x8] - ldr r2, [r0] - strb r1, [r2, 0x9] - ldr r3, [r0] - str r1, [r3, 0xC] - sub r11, r12, 0x4 - strb r1, [r3, 0x10] - mov r2, 0x128 - ldr r12, [r0] - add r2, r2, 0x4000000 - strh r1, [r12, 0x12] - mov r3, 0x5000 - strb r1, [r12, 0x15] - add r3, r3, 0x82 - strh r3, [r2] - ldmdb r11, {r11,sp,lr} - bx lr - .align 2, 0 -_081E05A0: .4byte gSTWIStatus - arm_func_end STWI_init_slave - - arm_func_start Callback_Dummy_M -Callback_Dummy_M: @ 81E05A4 - bx r2 - arm_func_end Callback_Dummy_M - - arm_func_start Callback_Dummy_S -Callback_Dummy_S: @ 81E05A8 - bx r1 - arm_func_end Callback_Dummy_S - - arm_func_start Callback_Dummy_ID -Callback_Dummy_ID: @ 81E05AC - bx r0 - arm_func_end Callback_Dummy_ID diff --git a/asm/overworld.s b/asm/overworld.s index 5c904c607..4d3fd1e80 100644 --- a/asm/overworld.s +++ b/asm/overworld.s @@ -2597,7 +2597,7 @@ GetMapMusicFadeoutSpeed: @ 8055F68 push {lr} bl warp1_get_mapheader ldrb r0, [r0, 0x17] - bl is_light_level_8_or_9 + bl IsMapTypeIndoors lsls r0, 24 lsrs r0, 24 cmp r0, 0x1 @@ -2981,8 +2981,8 @@ _08056218: bx r1 thumb_func_end Overworld_MapTypeAllowsTeleportAndFly - thumb_func_start is_light_level_8_or_9 -is_light_level_8_or_9: @ 805621C + thumb_func_start IsMapTypeIndoors +IsMapTypeIndoors: @ 805621C push {lr} lsls r0, 24 movs r1, 0xF8 @@ -2998,10 +2998,10 @@ _08056230: _08056232: pop {r1} bx r1 - thumb_func_end is_light_level_8_or_9 + thumb_func_end IsMapTypeIndoors - thumb_func_start sav1_saved_warp2_map_get_name -sav1_saved_warp2_map_get_name: @ 8056238 + thumb_func_start GetSavedWarpRegionMapSectionId +GetSavedWarpRegionMapSectionId: @ 8056238 push {lr} ldr r0, _0805625C @ =gSaveBlock1Ptr ldr r1, [r0] @@ -3020,7 +3020,7 @@ sav1_saved_warp2_map_get_name: @ 8056238 bx r1 .align 2, 0 _0805625C: .4byte gSaveBlock1Ptr - thumb_func_end sav1_saved_warp2_map_get_name + thumb_func_end GetSavedWarpRegionMapSectionId thumb_func_start GetCurrentRegionMapSectionId GetCurrentRegionMapSectionId: @ 8056260 @@ -3044,8 +3044,8 @@ GetCurrentRegionMapSectionId: @ 8056260 _08056284: .4byte gSaveBlock1Ptr thumb_func_end GetCurrentRegionMapSectionId - thumb_func_start sav1_map_get_battletype -sav1_map_get_battletype: @ 8056288 + thumb_func_start GetCurrentMapBattleScene +GetCurrentMapBattleScene: @ 8056288 push {lr} ldr r0, _080562AC @ =gSaveBlock1Ptr ldr r1, [r0] @@ -3064,10 +3064,10 @@ sav1_map_get_battletype: @ 8056288 bx r1 .align 2, 0 _080562AC: .4byte gSaveBlock1Ptr - thumb_func_end sav1_map_get_battletype + thumb_func_end GetCurrentMapBattleScene - thumb_func_start sub_80562B0 -sub_80562B0: @ 80562B0 + thumb_func_start InitOverworldBgs +InitOverworldBgs: @ 80562B0 push {r4-r6,lr} mov r6, r8 push {r6} @@ -3130,7 +3130,7 @@ _08056344: .4byte gUnknown_826D320 _08056348: .4byte gUnknown_3005018 _0805634C: .4byte gUnknown_3005014 _08056350: .4byte gUnknown_300501C - thumb_func_end sub_80562B0 + thumb_func_end InitOverworldBgs thumb_func_start sub_8056354 sub_8056354: @ 8056354 @@ -3641,7 +3641,7 @@ _080567A8: .4byte c2_80567AC c2_80567AC: @ 80567AC push {lr} ldr r0, _080567D0 @ =gMain + 0x438 - bl sub_8056A5C + bl map_loading_iteration_3 cmp r0, 0 beq _080567CC bl SetFieldVBlankCallback @@ -3962,8 +3962,8 @@ _08056A52: _08056A58: .4byte gFlashEffectParams thumb_func_end InitCurrentFlashLevelScanlineEffect - thumb_func_start sub_8056A5C -sub_8056A5C: @ 8056A5C + thumb_func_start map_loading_iteration_3 +map_loading_iteration_3: @ 8056A5C push {r4,lr} adds r4, r0, 0 ldrb r0, [r4] @@ -3995,7 +3995,7 @@ _08056A78: .4byte _08056B58 .4byte _08056B6A _08056AB0: - bl sub_80562B0 + bl InitOverworldBgs bl ScriptContext1_Init bl ScriptContext2_Disable b _08056B62 @@ -4084,7 +4084,7 @@ _08056B70: pop {r4} pop {r1} bx r1 - thumb_func_end sub_8056A5C + thumb_func_end map_loading_iteration_3 thumb_func_start sub_8056B78 sub_8056B78: @ 8056B78 @@ -4121,7 +4121,7 @@ _08056B94: .4byte _08056CC0 .4byte _08056BFA _08056BD0: - bl sub_80562B0 + bl InitOverworldBgs bl sub_80569BC adds r0, r5, 0 bl sub_8055920 @@ -4266,7 +4266,7 @@ _08056CF0: .4byte _08056D26 .4byte _08056D38 _08056D04: - bl sub_80562B0 + bl InitOverworldBgs bl sub_8111F14 movs r0, 0 bl sub_8057024 @@ -4331,7 +4331,7 @@ _08056D60: .4byte _08056E34 .4byte _08056E46 _08056D98: - bl sub_80562B0 + bl InitOverworldBgs bl sub_80569BC b _08056E3E _08056DA2: @@ -5019,7 +5019,7 @@ _08057330: .4byte _08057404 .4byte _0805740A _0805735C: - bl sub_80562B0 + bl InitOverworldBgs bl sub_80569BC bl sub_8111F14 bl sub_81113E4 diff --git a/asmdiff.sh b/asmdiff.sh index 9e2bef55b..6ca9ddb1a 100755 --- a/asmdiff.sh +++ b/asmdiff.sh @@ -20,7 +20,7 @@ else exit 1 fi -OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb" +OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t" OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))" $OBJDUMP $OPTIONS ${baserom}.gba > ${baserom}.dump || exit 1 $OBJDUMP $OPTIONS poke${buildname}.gba > poke${buildname}.dump diff --git a/common_syms/help_system_812B1E0.txt b/common_syms/help_system_812B1E0.txt index 5e56cc230..cd404504e 100644 --- a/common_syms/help_system_812B1E0.txt +++ b/common_syms/help_system_812B1E0.txt @@ -1,2 +1,2 @@ -gUnknown_3005E9C +sHelpSystemState gSomeVariableBackup diff --git a/common_syms/link_rfu.txt b/common_syms/link_rfu.txt index add61fde8..7ff8cd53d 100644 --- a/common_syms/link_rfu.txt +++ b/common_syms/link_rfu.txt @@ -1 +1 @@ -gUnknown_3005E10 +lman diff --git a/include/global.h b/include/global.h index 2f87a0c29..2ed7476e7 100644 --- a/include/global.h +++ b/include/global.h @@ -74,8 +74,8 @@ // GameFreak never ceases to amaze. // TODO: Propagate use of this macro #define TEST_BUTTON(field, button) ({(field) & (button);}) -#define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button) -#define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button) +#define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button) +#define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button) #define JOY_REPT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button) extern u8 gStringVar1[]; diff --git a/include/help_system.h b/include/help_system.h index 59adec912..c5ae5e5fa 100644 --- a/include/help_system.h +++ b/include/help_system.h @@ -17,16 +17,16 @@ struct HelpSystemListMenu_sub struct HelpSystemListMenu { struct HelpSystemListMenu_sub sub; - u8 field_0C; - u8 field_0D; - u8 field_0E; + u8 itemsAbove; + u8 cursorPos; + u8 state; u8 filler_10[0xC]; }; extern struct HelpSystemListMenu gHelpSystemListMenu; extern struct ListMenuItem gHelpSystemListMenuItems[]; extern bool8 gHelpSystemEnabled; -extern u8 gUnknown_203F175; +extern bool8 gHelpSystemToggleWithRButtonDisabled; // help_system_812B1E0 void HelpSystem_SetSomeVariable(u8); @@ -35,19 +35,19 @@ bool8 sub_812B40C(void); bool8 sub_812B45C(void); void HelpSystem_Disable(void); void HelpSystem_Enable(void); -void sub_812B4B8(void); -bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +void HelpSystem_EnableToggleWithRButton(void); +bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); void sub_812BDEC(void); -bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); +bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer); bool8 sub_812BF88(void); // help_system @@ -92,6 +92,6 @@ bool8 MoveCursor(u8 by, u8 dirn); void HelpSystem_BackupSomeVariable(void); void HelpSystem_RestoreSomeVariable(void); void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height); -void sub_812B4AC(void); +void HelpSystem_DisableToggleWithRButton(void); #endif //GUARD_HELP_SYSTEM_H diff --git a/include/librfu.h b/include/librfu.h index 97fd8044e..33f370bf0 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -4,11 +4,8 @@ #include "global.h" #include "main.h" -/* TODOs: - * - split files +/* TODOs: * - documentation - * - decompile librfu_intr.s once arm support is back again - (for internal structs not documented in SDK) * - check if any field needs to be volatile * - check if field names make sense */ @@ -71,6 +68,7 @@ #define ID_CPR_POLL_REQ 0x0033 #define ID_CPR_END_REQ 0x0034 #define ID_UNK35_REQ 0x0035 // not defined in SDK header +#define ID_UNK36_REQ 0x0036 // not defined in SDK header #define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ 0x0037 #define ID_STOP_MODE_REQ 0x003d #define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ 0x00ff // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails. @@ -90,8 +88,9 @@ #define RFU_MBOOT_DOWNLOADER_SERIAL_NO 0x0000 // The game serial number of the multi-boot downloader (programs that boot without a Game Pak) -#define RFU_API_BUFF_SIZE_RAM 0x0e8c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM) -#define RFU_API_BUFF_SIZE_ROM 0x052c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM) +// Sizes are 0x28 larger in v1028 +#define RFU_API_BUFF_SIZE_RAM 0x0e64 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM) +#define RFU_API_BUFF_SIZE_ROM 0x0504 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM) #define RFU_CHILD_MAX 4 // Maximum number of slaves that can be connected to one parent device @@ -314,10 +313,10 @@ struct STWIStatus u8 unk_17; void (*callbackM)(); void (*callbackS)(u16); - void (*unk_20)(void); + void (*callbackID)(void); union RfuPacket *txPacket; union RfuPacket *rxPacket; - vu8 unk_2c; + vu8 sending; }; // This struct is used as u8 array in SDK. @@ -473,16 +472,6 @@ struct RfuSIO32Id u16 unkA; }; -struct RfuAPIBuffer -{ - struct RfuLinkStatus linkStatus; - struct RfuStatic static_; - struct RfuFixed fixed; - struct RfuSlotStatusNI NI[RFU_CHILD_MAX]; - struct RfuSlotStatusUNI UNI[RFU_CHILD_MAX]; - struct RfuIntrStruct intr; -}; - extern struct STWIStatus *gSTWIStatus; extern struct RfuLinkStatus *gRfuLinkStatus; extern struct RfuStatic *gRfuStatic; @@ -499,7 +488,7 @@ s32 AgbRFU_checkID(u8); // librfu_rfu // API Initialization and Initial Settings // API Initialization -u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam); +u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam); // Set Timer Interrupt void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p); // Resident Function called from within a V-Blank Interrupt @@ -600,7 +589,7 @@ u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void); // For Debug // Obtain address of the SWTI-layer receive buffer -struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); +u8 *rfu_getSTWIRecvBuffer(void); // Obtain RFU state void rfu_REQ_RFUStatus(void); u16 rfu_getRFUStatus(u8 *rfuState); @@ -626,14 +615,14 @@ void STWI_send_DataRxREQ(void); void STWI_send_MS_ChangeREQ(void); void STWI_send_StopModeREQ(void); void STWI_send_SystemStatusREQ(void); -void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data); +void STWI_send_GameConfigREQ(const u8 *serial_uname, const u8 *gname); void STWI_send_ResetREQ(void); void STWI_send_LinkStatusREQ(void); void STWI_send_VersionStatusREQ(void); void STWI_send_SlotStatusREQ(void); void STWI_send_ConfigStatusREQ(void); void STWI_send_ResumeRetransmitAndChangeREQ(void); -void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3); +void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer); void STWI_send_SC_StartREQ(void); void STWI_send_SC_PollingREQ(void); void STWI_send_SC_EndREQ(void); diff --git a/include/link.h b/include/link.h index 770a60f44..e41b89634 100644 --- a/include/link.h +++ b/include/link.h @@ -277,7 +277,7 @@ void LinkVSync(void); bool8 HandleLinkConnection(void); void sub_800B0B4(void); void sub_800B110(u32 who); -void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); +void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); u8 sub_800A8D4(void); #endif // GUARD_LINK_H diff --git a/include/link_rfu.h b/include/link_rfu.h index 81dd7fdf0..52fd07f7c 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -4,6 +4,101 @@ #include "global.h" #include "librfu.h" +//----------------------------------------------------------------- +// Constant definition +//----------------------------------------------------------------- + +// Link Manager operation mode (specified by u8 parent_child argument of rfu_LMAN_establishConnection) +//#define MODE_CHILD 0 // Start Link Manager in CHILD mode +//#define MODE_PARENT 1 // Start Link Manager in PARENT mode +//Note: This value uses the item defined by AgbRFU_LL.h. +#define MODE_P_C_SWITCH 2 // Start Link Manager in parent-child switching mode. + + +// Error code returned by Link Manager API (rfu_LMAN_...return value of function) +#define LMAN_ERROR_MANAGER_BUSY 1 // Link Manager is already running. +#define LMAN_ERROR_AGB_CLK_SLAVE 2 // AGB is clock slave so link manager cannot run. +#define LMAN_ERROR_PID_NOT_FOUND 3 // Parent device information of the specified PID does not exist in rfuLinkStatus->partner[0-3]. +#define LMAN_ERROR_ILLEGAL_PARAMETER 4 // Specified argument is unusual. +#define LMAN_ERROR_NOW_LINK_RECOVERY 5 // New settings were ignored because link recovery was under way when current link recovery was ON and new settings turned link recovery OFF. +#define LMAN_ERROR_NOW_COMMUNICATION 6 // New settings were ignored because currently communicating with NI. +#define LMAN_ERROR_NOW_SEARCH_PARENT 7 // Parent search currently under way, so ignore new setting. + +// Details of messages and the related parameters returned by the u8 msg, u8 param_count, and lman.param[0-1] arguments of the LMAN callback generated by the operation of the Link Manager. +// msg name msg No. param qty param[0] param[1] Description +#define LMAN_MSG_INITIALIZE_COMPLETED 0x00 // 0 - - Generated when RFU reset and initial settings are completed +#define LMAN_MSG_NEW_CHILD_CONNECT_DETECTED 0x10 // 1 Bit indicating slot - Generated when new child device connection was detected at RFU level. +// with detected connection +#define LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED 0x11 // 1 Bit indicating slot - Generated when game identification information from child device connected at RFU level is received and accepted (game serial numbers match). +// where connection was accepted +#define LMAN_MSG_NEW_CHILD_CONNECT_REJECTED 0x12 // 1 Bit indicating slot - Generated when the connection from the child device connected at RFU level is rejected (game identification information reception failed or game serial numbers do not match). +// where connection was rejected +#define LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED 0x13 // 0 - - Generated when SearchChild operation time expires. +#define LMAN_MSG_END_WAIT_CHILD_NAME 0x14 // 0 - - Generated when reception of game identification information from all child devices completes after the SearchChild operation time expires. +#define LMAN_MSG_PARENT_FOUND 0x20 // 1 Bit indicating - Generated when valid (game serial numbers match) parent devices are found during SearchParent. +// rfuLinkStatus->partner[x] index number storing the valid parent devices (game serial number matches) from among the discovered parent devices. +#define LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED 0x21 // 0 - - Generated when SearchParent time expires. +#define LMAN_MSG_CONNECT_PARENT_SUCCESSED 0x22 // 1 Connected slot number - Generated when connection with parent device at RFU level succeeds. +#define LMAN_MSG_CONNECT_PARENT_FAILED 0x23 // 1 Connection failure reason - Generated when connection with parent device at RFU level fails. +#define LMAN_MSG_CHILD_NAME_SEND_COMPLETED 0x24 // 0 - - Generated when transmission of the child's game identification information to the parent device succeeds after connection with parent device at RFU level succeeds. +#define LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED 0x25 // 0 - - Generated when transmission of the child's game identification information to the parent device fails after connection with parent device at RFU level succeeds. +#define LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED 0x30 // 1 Bit indicating slot - Generated when a link cut is detected and that slot disconnects. (Generated only when link recovery is OFF.) +// that was disconnected and where link cut was detected but link recover not attempted +#define LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY 0x31 // 1 Bit indicating slot - Generated when a link cut is detected and the link recovery process starts. (Generated only when link recovery is ON.) +// where link cut was detected and link recovery was started +#define LMAN_MSG_LINK_RECOVERY_SUCCESSED 0x32 // 1 Bit indicating slot - Generated when link recovery succeeds. (Generated only when link recovery is ON.) +// where link recovery succeeded +#define LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED 0x33 // 1 Bit indicating slot - Generated when link recovery fails and that slot disconnects. (Generated only when link recovery is ON.) +// where link recovery failed and that disconnected +#define LMAN_MSG_LINK_DISCONNECTED_BY_USER 0x40 // 1 Generated on disconnection by execution of rfu_REQ_disconnect by disconnected user. +// Slot indicated in bits *Note: If rfu_REQ_disconnect is used for disconnection during link recovery in the child device, the link recovery is also suspended, but the only message returned is DISCONNECTED_BY_USER. +#define LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE 0x41 // 0 - - Generated when the AGB-RFU clock switches to AGB clock slave after a successful connection or link recovery in the child device. (This message is not generated when the AGB switches to a clock slave when an MSC callback completes.) +#define LMAN_MSG_CHANGE_AGB_CLOCK_MASTER 0x45 // 0 - - Generated when the AGB-RFU intercommunication clock is switched to the AGB clock master in the child device. +#define LMAN_MSG_RFU_POWER_DOWN 0x42 // 0 - - Generated when the RFU enters power conservation mode with rfu_LMAN_powerDownRFU. +#define LMAN_MSG_MANAGER_STOPPED 0x43 // 0 - - Generated when the Link Manager is halted by rfu_LMAN_stopLMAN(0). (This message is not generated during SearchChild, SearchParent, ConnectParent, and LinkRecovery. A message (-PERIOD_EXPIRED, -SUCCESSED, -FAILED) corresponding to the operation completion is returned.) +#define LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET 0x44 // 0 - - Generates when the Link Manager is forcibly halted by rfu_LMAN_stopLMAN(1) and RFU is reset. + +#define LMAN_MSG_RECV_DATA_REQ_COMPLETED 0x50 // 0 - - Generated when the execution of rfu_REQ_recvData completes. (This message is not notification of data reception from a RFU.) + +#define LMAN_MSG_REQ_API_ERROR 0xf0 // 2 REQ_commandID REQ_result REQ-API resulted in error. This message is also generated by an REQ-API executed by either the link manager or the user. +#define LMAN_MSG_WATCH_DOG_TIMER_ERROR 0xf1 // 0 - - Generated when a MSC callback does not occur even after 6 seconds pass when the AGB is the clock slave. +#define LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA 0xf2 // 0 - - Generated when an automatic starting DMA, such as HDMA, is issued at the same time the RFU attempts to send notification and to return the AGB to the clock master while the AGB is the clock slave and the exchange of that information (REQ command) fails. +#define LMAN_MSG_LMAN_API_ERROR_RETURN 0xf3 // 1 Return error code - Generated when LMAN-API execution returns an error. +#define LMAN_MSG_RFU_FATAL_ERROR 0xff // 0 - - Generated when the Link Manager cannot recongize a RFU because of the execution of rfu_REQBN_softReset_and_checkID. + + +// Value of lman.childClockSlave_flag +#define RFU_CHILD_CLOCK_SLAVE_OFF 0 // The child device is not operating in AGB clock slave mode. (The child device is in this mode in cases such as when the child has not established a connection or during link recovery.) +#define RFU_CHILD_CLOCK_SLAVE_ON 1 // The child device is operating in AGB clock slave mode. (Child automatically enters this mode when a connection is established.) +#define RFU_CHILD_CLOCK_SLAVE_OFF_REQ 2 // The child device has requested that AGB clock slave mode be halted. + +// State of Link Manager (values of lman.state, lman.next_state) +#define LMAN_STATE_READY 0x00 // Waiting +#define LMAN_STATE_SOFT_RESET_AND_CHECK_ID 0x01 // Requesting execution of rfu_REQBN_softResetAndCheckID (same as below) +#define LMAN_STATE_RESET 0x02 // rfu_REQ_reset +#define LMAN_STATE_CONFIG_SYSTEM 0x03 // rfu_REQ_configSystem +#define LMAN_STATE_CONFIG_GAME_DATA 0x04 // rfu_REQ_configGameData +#define LMAN_STATE_START_SEARCH_CHILD 0x05 // rfu_REQ_startSearchChild +#define LMAN_STATE_POLL_SEARCH_CHILD 0x06 // rfu_REQ_pollSearchChild +#define LMAN_STATE_END_SEARCH_CHILD 0x07 // rfu_REQ_endSearchChild +#define LMAN_STATE_WAIT_RECV_CHILD_NAME 0x08 // Awaiting reception of game name from connected child device. +#define LMAN_STATE_START_SEARCH_PARENT 0x09 // rfu_REQ_startSearchParent +#define LMAN_STATE_POLL_SEARCH_PARENT 0x0a // rfu_REQ_pollSearchParent +#define LMAN_STATE_END_SEARCH_PARENT 0x0b // rfu_REQ_endSearchParent +#define LMAN_STATE_START_CONNECT_PARENT 0x0c // rfu_REQ_startConnectParent +#define LMAN_STATE_POLL_CONNECT_PARENT 0x0d // rfu_REQ_pollConnectParent +#define LMAN_STATE_END_CONNECT_PARENT 0x0e // rfu_REQ_endConnectParent +#define LMAN_STATE_SEND_CHILD_NAME 0x0f // Sending child game name. +#define LMAN_STATE_START_LINK_RECOVERY 0x10 // rfu_REQ_CHILD_startConnectRecovery +#define LMAN_STATE_POLL_LINK_RECOVERY 0x11 // rfu_REQ_CHILD_pollConnectRecovery +#define LMAN_STATE_END_LINK_RECOVERY 0x12 // rfu_REQ_CHILD_endConnectRecovery +#define LMAN_STATE_MS_CHANGE 0x13 // rfu_REQ_changeMasterSlave +#define LMAN_STATE_WAIT_CLOCK_MASTER 0x14 // Waiting for AGB-RFU intercommunication clock to become AGB clock master. +#define LMAN_STATE_STOP_MODE 0x15 // rfu_REQ_stopMode +#define LMAN_STATE_BACK_STATE 0x16 // Following the completion of link-recovery processing, return the Link Manager state to the state present before link-recovery processing was initiated. +#define LMAN_FORCED_STOP_AND_RFU_RESET 0x17 // Attempt to forcibly stop Link Manager using rfu_LMAN_stopLMAN(1). +#define LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER 0x18 // Attempt to return to AGB clock master after child fails in sending game name. + // RfuTgtData.gname is read as these structs. struct GFtgtGnameSub { @@ -25,7 +120,7 @@ struct __attribute__((packed, aligned(2))) GFtgtGname u8 unk_04[4]; u16 species:10; u16 type:6; - u8 unk_0a_0:7; + u8 activity:7; u8 unk_0a_7:1; u8 playerGender:1; u8 level:7; @@ -37,20 +132,37 @@ struct Padded_U8 u8 value; }; -struct UnkLinkRfuStruct_02022B2C -{ - u8 maxMFrame; - u8 mcTimer; - u16 availSlotFlag; - u8 mbootFlag; - u16 serialNo; - struct GFtgtGname *gname; - u8 *uname; - u8 unk_10; - u8 unk_11; - u16 unk_12; - u16 unk_14; -}; +// Parameter group used in initial setting run of the link manager (rfu_LMAN_initializeRFU) +typedef struct InitializeParametersTag { + // rfu_REQ_configSystem argument + u8 maxMFrame; // Maximum number of times to re-transmit of RFU level + u8 MC_TimerCount; // MC_Timer count (x16.7ms) + u16 availSlot_flag; // Use RFU-API constant "AVAIL_SLOT1-4" to specify the maximum number of child devices (1 - 4) that can be connected to a parent device. + + // rfu_REQB_configGameData argument + u8 mboot_flag; // Multiplayer boot flag + u16 serialNo; // Game serial number + u8 *gameName; // Game name + u8 *userName; // User name + + // ON/OFF flag for parent fast search operation by child. + u8 fastSearchParent_flag; // Flag indicating whether parent fast search operation to be performed by child. + + // Link recovery settings + u8 linkRecovery_enable; // Determines whether or not to execute the link recovery process when a link cut occurs + u16 linkRecovery_period; // Time to spend on the link recovery process (x 16.7 ms) Note: Runs for unlimited time when specifying 0. + + // Setting for NI-type data transmit/receive period + u16 NI_failCounter_limit; // Limit for failCounter during NI type data transmit/receive (x 16.7 ms) Note: Runs for unlimited time when specifying 0. +}INIT_PARAM; + + +// Timer that counts with the V-Blank cycle +typedef struct VblankTimerTag { + u8 active; // Timer ON/OFF (bits 0 - 3 indicate ON/OFF for each connected slot) + u16 count_max; // Maximum count value (x16.7ms) + u16 count[RFU_CHILD_MAX]; // Current count value (x 16.7 ms) for each connected slot +}VBL_TIMER; struct UnkLinkRfuStruct_02022B44 { @@ -66,106 +178,97 @@ struct UnkLinkRfuStruct_02022B44 u8 fill_84[0x58]; }; -struct UnkRfuStruct_1 +typedef struct linkManagerTag { - /* 0x000 */ u8 unk_00; - /* 0x001 */ u8 unk_01; - /* 0x002 */ vu8 unk_02; - /* 0x003 */ vu8 unk_03; - /* 0x004 */ u8 unk_04; - /* 0x005 */ u8 unk_05; - /* 0x006 */ u8 unk_06; - /* 0x007 */ u8 unk_07; - /* 0x008 */ u8 unk_08; - /* 0x009 */ u8 unk_09; - /* 0x00a */ u8 unk_0a; - /* 0x00b */ u8 unk_0b; - /* 0x00c */ u8 unk_0c; - /* 0x00d */ u8 unk_0d; - /* 0x00e */ u8 unk_0e; - /* 0x00f */ u8 unk_0f; - /* 0x010 */ u8 unk_10; - /* 0x011 */ u8 unk_11; - /* 0x012 */ u8 unk_12; - // aligned - /* 0x014 */ u16 unk_14; - /* 0x016 */ u16 unk_16; - /* 0x018 */ u16 unk_18; - /* 0x01a */ u16 unk_1a; - /* 0x01c */ u16 unk_1c; - /* 0x01e */ u16 unk_1e; - /* 0x020 */ const u16 *unk_20; - /* 0x024 */ u8 unk_24; - /* 0x026 */ u16 unk_26; - /* 0x028 */ u16 unk_28[RFU_CHILD_MAX]; - /* 0x030 */ u8 unk_30; - // aligned - /* 0x032 */ u16 unk_32; - /* 0x034 */ u16 unk_34[RFU_CHILD_MAX]; - /* 0x03c */ const struct UnkLinkRfuStruct_02022B2C *unk_3c; - /* 0x040 */ void (*unk_40)(u8, u8); - /* 0x044 */ void (*unk_44)(u16); -}; + /* 0x000 */ u8 acceptSlot_flag; + /* 0x001 */ u8 acceptCount; + /* 0x002 */ vu8 childClockSlave_flag; + /* 0x003 */ vu8 parentAck_flag; + /* 0x004 */ u8 state; + /* 0x005 */ u8 next_state; + /* 0x006 */ u8 parent_child; + /* 0x007 */ u8 pcswitch_flag; + /* 0x008 */ u8 RFU_powerOn_flag; + /* 0x009 */ u8 linkRecovery_enable; + /* 0x00a */ u8 linkRecovery_start_flag; + /* 0x00b */ u8 fastSearchParent_flag; + /* 0x00c */ u8 connectSlot_flag_old; + /* 0x00d */ u8 reserveDisconnectSlot_flag; + /* 0x00e */ u8 active; + /* 0x00f */ u8 msc_exe_flag; + /* 0x010 */ u8 child_slot; + /* 0x011 */ u8 state_bak[2]; + /* 0x014 */ u16 param[2]; + /* 0x018 */ u16 NI_failCounter_limit; + /* 0x01a */ u16 connect_period; + /* 0x01c */ u16 pcswitch_period_bak; + /* 0x01e */ u16 work; + /* 0x020 */ u16 *acceptable_serialNo_list; + /* 0x024 */ VBL_TIMER nameAcceptTimer; + /* 0x030 */ VBL_TIMER linkRecoveryTimer; + /* 0x03c */ INIT_PARAM *init_param; + /* 0x040 */ void (*LMAN_callback)(u8, u8); + /* 0x044 */ void (*MSC_callback)(u16); +} LINK_MANAGER; struct UnkRfuStruct_2_Sub_6c { /* 0x00 */ u16 unk_00; - /* 0x02 */ u16 unk_02; - /* 0x04 */ const u8 *unk_04; + /* 0x02 */ u16 count; + /* 0x04 */ const u8 *payload; /* 0x08 */ u32 unk_08; /* 0x0c */ u32 unk_0c; /* 0x10 */ u8 unk_10; - /* 0x11 */ u8 unk_11; + /* 0x11 */ u8 owner; /* 0x12 */ u8 unk_12; }; struct UnkRfuStruct_2_Sub_124 { - /* 0x000 */ u8 unk_00[20][70]; - /* 0x578 */ vu8 unk_8c0; - /* 0x579 */ vu8 unk_8c1; - /* 0x57a */ vu8 unk_8c2; - /* 0x57b */ vu8 unk_8c3; + /* 0x000 */ u8 slots[20][70]; + /* 0x578 */ vu8 recv_slot; + /* 0x579 */ vu8 send_slot; + /* 0x57a */ vu8 count; + /* 0x57b */ vu8 full; }; struct UnkRfuStruct_2_Sub_9e8 { - /* 0x000 */ u8 unk_00[40][14]; - /* 0x230 */ vu8 unk_230; - /* 0x231 */ vu8 unk_231; - /* 0x232 */ vu8 unk_232; - /* 0x233 */ vu8 unk_233; + /* 0x000 */ u8 slots[40][14]; + /* 0x230 */ vu8 recv_slot; + /* 0x231 */ vu8 send_slot; + /* 0x232 */ vu8 count; + /* 0x233 */ vu8 full; }; struct UnkRfuStruct_2_Sub_c1c { - /* 0x00 */ u8 unk_00[2][14]; - /* 0x1c */ vu8 unk_1c; - /* 0x1d */ vu8 unk_1d; - /* 0x1e */ vu8 unk_1e; + /* 0x00 */ u8 slots[2][14]; + /* 0x1c */ vu8 recv_slot; + /* 0x1d */ vu8 send_slot; + /* 0x1e */ vu8 count; }; struct UnkRfuStruct_Sub_Unused { - /* 0x000 */ u8 unk_00[2][256]; - /* 0x200 */ vu8 unk_200; - /* 0x201 */ vu8 unk_201; - /* 0x202 */ vu8 unk_202; - /* 0x203 */ vu8 unk_203; + /* 0x000 */ u8 slots[2][256]; + /* 0x200 */ vu8 recv_slot; + /* 0x201 */ vu8 send_slot; + /* 0x202 */ vu8 count; + /* 0x203 */ vu8 full; }; -struct UnkRfuStruct_2 +typedef struct UnkRfuStruct_2 { /* 0x000 */ void (*RfuFunc)(void); /* 0x004 */ u16 unk_04; /* 0x006 */ u8 filler_06[4]; - /* 0x00a */ u16 unk_0a; + /* 0x00a */ u16 linkman_msg; /* 0x00c */ u8 unk_0c; // parentChildMode? /* 0x00d */ u8 playerCount; /* 0x00e */ u8 unk_0e; /* 0x00f */ u8 unk_0f; - /* 0x010 */ u16 unk_10; - /* 0x012 */ u16 unk_12; + /* 0x010 */ u16 linkman_param[2]; /* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14]; /* 0x04c */ u8 unk_4c[14]; /* 0x05a */ u8 unk_5a; @@ -179,9 +282,9 @@ struct UnkRfuStruct_2 /* 0x080 */ struct UnkRfuStruct_2_Sub_6c unk_80[5]; /* 0x0e4 */ u8 unk_e4[5]; /* 0x0e9 */ u8 unk_e9[5]; - /* 0x0ee */ vu8 unk_ee; + /* 0x0ee */ vu8 errorState; /* 0x0ef */ u8 unk_ef; - /* 0x0f0 */ u8 unk_f0; + /* 0x0f0 */ u8 linkLossRecoveryState; /* 0x0f1 */ u8 unk_f1; /* 0x0f2 */ u16 unk_f2[6]; /* 0x0fe */ u16 unk_fe; @@ -193,11 +296,11 @@ struct UnkRfuStruct_2 /* 0x8d4 */ struct UnkRfuStruct_2_Sub_c1c unk_c1c; /* 0x8f4 */ vu8 unk_c3c; /* 0x8f5 */ u8 unk_c3d; - /* 0x8f6 */ vu8 unk_c3e; + /* 0x8f6 */ vu8 child_slot; /* 0x8f7 */ u8 unk_c3f[70]; /* 0x93d */ u8 unk_c85; /* 0x93e */ u8 unk_c86; - /* 0x93f */ u8 unk_c87[5][7][2]; + /* 0x93f */ u8 recvCmds[5][7][2]; /* 0x985 */ u8 unk_ccd; /* 0x986 */ u8 unk_cce; // childId /* 0x987 */ u8 unk_ccf; @@ -210,8 +313,8 @@ struct UnkRfuStruct_2 /* 0x994 */ vu8 unk_cdc; /* 0x995 */ u8 unk_cdd; /* 0x996 */ u8 unk_cde[RFU_CHILD_MAX]; - /* 0x99a */ u8 unk_ce2; - /* 0x99b */ u8 unk_ce3; + /* 0x99a */ u8 bm_PartnerFlags; + /* 0x99b */ u8 bm_DisconnectSlot; /* 0x99c */ u8 unk_ce4; /* 0x99d */ u8 unk_ce5; /* 0x99e */ u8 unk_ce6; @@ -220,12 +323,29 @@ struct UnkRfuStruct_2 /* 0x9a1 */ u8 unk_ce9; /* 0x9a2 */ u8 unk_cea[RFU_CHILD_MAX]; /* 0x9a6 */ u8 unk_cee[RFU_CHILD_MAX]; -}; // size: 0x9AC +} GF_RFU_MANAGER; // size: 0x9AC -extern struct UnkRfuStruct_1 gUnknown_3005E10; +extern struct linkManagerTag lman; extern struct GFtgtGname gHostRFUtgtGnameBuffer; extern u8 gHostRFUtgtUnameBuffer[]; +// Official signatures +u32 rfu_LMAN_REQBN_softReset_and_checkID(void); +void rfu_LMAN_requestChangeAgbClockMaster(void); +void rfu_LMAN_initializeRFU(INIT_PARAM *init_params); +u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list); +void rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag); +void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)); +void rfu_LMAN_REQ_sendData(bool8 clockChangeFlag); +void rfu_LMAN_powerDownRFU(void); +u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period); +u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period); +void rfu_LMAN_manager_entity(u32 rand); +void rfu_LMAN_syncVBlank(void); +u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16)); +void rfu_LMAN_forceChangeSP(void); + +// GameFreak signatures void AddTextPrinterToWindow1(const u8 *str); bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src); void LinkRfu_FatalError(void); @@ -241,11 +361,10 @@ u8 sub_8116DE0(void); void sub_80FBB4C(void); void sub_80F86F4(void); void sub_80FB128(bool32 a0); -u32 sub_80FD3A4(void); bool32 IsSendingKeysToRfu(void); void Rfu_set_zero(void); u8 GetRfuPlayerCount(void); -void sub_80F9828(void); +void StartSendingKeysToRfu(void); u8 LinkRfu_GetMultiplayerId(void); bool32 Rfu_InitBlockSend(const u8 * src, size_t size); bool8 sub_80FA0F8(u8 a0); @@ -254,58 +373,45 @@ void Rfu_SetBlockReceivedFlag(u8 who); void Rfu_ResetBlockReceivedFlag(u8 who); bool8 Rfu_IsMaster(void); void sub_80F85F8(void); -bool32 sub_80FAE94(void); -bool32 sub_80FAEF0(void); +bool32 LinkRfuMain1(void); +bool32 LinkRfuMain2(void); bool32 IsRfuRecvQueueEmpty(void); u32 GetRfuRecvQueueLength(void); void sub_80F8DC0(void); void sub_80FBB20(void); bool8 sub_80FA484(bool32 a0); void var_800D_set_xB(void); -struct GFtgtGname *sub_80F9800(void); +struct GFtgtGname *GetHostRFUtgtGname(void); void UpdateWirelessStatusIndicatorSprite(void); void InitRFU(void); -void sub_80FEB14(void); bool32 sub_80FBA00(void); -void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr); -void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr); +void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *ptr); +void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr); -void sub_80FD4B0(const struct UnkLinkRfuStruct_02022B2C *unk0); -u8 sub_80FD538(u8 r5, u16 r7, u16 r8, const u16 *r6); -void sub_80FD760(bool8 a0); -void sub_80FEA10(void (*func)(u16)); -void sub_80FB9E4(u8 a0, u16 a1); +void sub_80FB9E4(u8 a0, u16 msg); u8 sub_80FB9F4(void); -void LinkRfu_REQ_SendData_HandleParentRelationship(bool8 clockChangeFlag); -void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2); -void sub_80FD52C(void); -u8 sub_80FD610(u16 parentId, u16 unk_1a); -bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2); -bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); -void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2); -bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1); -void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1); -u8 sub_80FEA34(u8 a0, u16 a1); -void sub_80FDA30(u32 a0); +void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2); +bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2); +bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); +void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2); +bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1); +void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1); void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3); -void LinkRfu_syncVBlank_(void); -s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16)); -void sub_80FEB3C(void); void sub_80FAFE0(u8 a0); -bool32 sub_80FA44C(u32 a0); +bool32 RfuSerialNumberIsValid(u32 a0); bool8 sub_80FC1B0(void); bool8 sub_80F8F40(void); void sub_80F8F5C(void); bool32 sub_80FA5D4(void); bool32 sub_80FC1CC(void); bool32 sub_80F8F7C(bool32 a0); -bool32 sub_80FA634(u16 a0, const u8 *a1); +bool32 sub_80FA634(u16 trainerId, const u8 *trainerName); void sub_80FA670(u8 a0, u16 a1, const u8 *a2); u32 sub_80FA6FC(u16 a0, const u8 *a1); void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2); void sub_80FBB8C(u32 a0); -void sub_80FBD4C(const u8 *ptr, u16 a1); +void sub_80FBD4C(const u8 *trainerName, u16 trainerId); void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *gname, u8 *uname); void sub_80FBBD8(void); void sub_80FA6BC(void); diff --git a/include/overworld.h b/include/overworld.h index a7031e56d..b783248ce 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -147,7 +147,7 @@ void Overworld_ResetStateAfterTeleport(void); void Overworld_FadeOutMapMusic(void); void CB2_LoadMap(void); bool8 BGMusicStopped(void); -bool8 is_light_level_8_or_9(u8 mapType); +bool8 IsMapTypeIndoors(u8 mapType); bool32 sub_8055C9C(void); void Overworld_ResetStateAfterDigEscRope(void); bool32 sub_8058244(void); diff --git a/include/union_room.h b/include/union_room.h index 7e48b3e6e..0600d9cc0 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -4,6 +4,11 @@ #include "global.h" #include "link_rfu.h" +// Return value of IsRequestedTypeAndSpeciesInPlayerParty +#define UR_TRADE_MATCH 0 +#define UR_TRADE_NOTYPE 1 +#define UR_TRADE_NOEGG 2 + struct UnkStruct_Shared { struct GFtgtGname gname; @@ -20,7 +25,7 @@ struct UnkStruct_x20 { struct UnkStruct_Shared unk; u16 field_18; - u8 field_1A_0:2; + u8 tradeStatus:2; u8 field_1A_1:1; u8 field_1B; u8 field_1D; @@ -56,7 +61,7 @@ struct UnkStruct_Leader u8 field_10; u8 field_11; u8 listTaskId; - u8 field_13; + u8 playerCount; u8 field_14; u8 field_15; u8 field_16; diff --git a/ld_script.txt b/ld_script.txt index 021686fcb..f88df98b5 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -322,7 +322,7 @@ SECTIONS { src/agb_flash_mx.o(.text); src/agb_flash_le.o(.text); src/librfu_stwi.o(.text); - asm/librfu_intr.o(.text); + src/librfu_intr.o(.text); src/librfu_rfu.o(.text); src/librfu_sio32id.o(.text); src/isagbprn.o(.text); diff --git a/src/help_system.c b/src/help_system.c index 4a4d927c5..bb3135260 100644 --- a/src/help_system.c +++ b/src/help_system.c @@ -33,7 +33,7 @@ struct HelpSystemVideoState static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0}; EWRAM_DATA u8 gUnknown_203F174 = 0; -EWRAM_DATA u8 gUnknown_203F175 = 0; +EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE; static EWRAM_DATA u8 sDelayTimer = 0; static EWRAM_DATA u8 sInHelpSystem = 0; static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0}; @@ -53,7 +53,7 @@ u8 RunHelpSystemCallback(void) sInHelpSystem = 0; if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP) return 0; - if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1) + if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE) return 0; if (JOY_NEW(L_BUTTON | R_BUTTON)) { @@ -93,9 +93,9 @@ u8 RunHelpSystemCallback(void) HelpSystem_PrintText_Row61(gString_Help); sub_813BD14(1); if (sub_812B40C() == TRUE) - sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems); + HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems); else - sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems); + HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems); sub_813BE78(1); sub_813BF50(1); CommitTilemap(); @@ -110,7 +110,7 @@ u8 RunHelpSystemCallback(void) sVideoState.state = 5; break; case 5: - if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems)) + if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems)) { PlaySE(SE_HELP_CL); sVideoState.state = 6; @@ -981,9 +981,9 @@ void HelpSystem_FillPanel1(void) void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2) { gHelpSystemListMenu.sub = a0->sub; - gHelpSystemListMenu.field_0C = a1; - gHelpSystemListMenu.field_0D = a2; - gHelpSystemListMenu.field_0E = 0; + gHelpSystemListMenu.itemsAbove = a1; + gHelpSystemListMenu.cursorPos = a2; + gHelpSystemListMenu.state = 0; if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed) gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems; sub_813BDA4(0); @@ -1007,7 +1007,7 @@ s32 HelpSystem_GetMenuInput(void) else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index; + return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index; } else if (JOY_NEW(B_BUTTON)) { @@ -1051,15 +1051,15 @@ void sub_813C75C(void) u8 r6 = gHelpSystemListMenu.sub.totalItems - 7; if (gHelpSystemListMenu.sub.totalItems > 7) { - s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D; + s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos; sub_813C004(0, 0); if (r4 == 0) sub_813C004(1, 1); - else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0) + else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0) sub_813C004(1, 1); - else if (gHelpSystemListMenu.field_0C == r6) + else if (gHelpSystemListMenu.itemsAbove == r6) sub_813C004(0, 1); - else if (gHelpSystemListMenu.field_0C != 0) + else if (gHelpSystemListMenu.itemsAbove != 0) { sub_813C004(0, 1); sub_813C004(1, 1); @@ -1071,7 +1071,7 @@ void PrintListMenuItems(void) { u8 glyphHeight = GetFontAttribute(2, 1) + 1; s32 i; - s32 r5 = gHelpSystemListMenu.field_0C; + s32 r5 = gHelpSystemListMenu.itemsAbove; for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++) { @@ -1086,7 +1086,7 @@ void PlaceListMenuCursor(void) { u8 glyphHeight = GetFontAttribute(2, 1) + 1; u8 x = gHelpSystemListMenu.sub.left; - u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.field_0D; + u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos; HelpSystem_PrintTextAt(gFameCheckerText_ListMenuCursor, x, y); } @@ -1107,24 +1107,24 @@ u8 TryMoveCursor1(u8 dirn) r4 = 0; else r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1; - if (gHelpSystemListMenu.field_0C == 0) + if (gHelpSystemListMenu.itemsAbove == 0) { - if (gHelpSystemListMenu.field_0D != 0) + if (gHelpSystemListMenu.cursorPos != 0) { - gHelpSystemListMenu.field_0D--; + gHelpSystemListMenu.cursorPos--; return 1; } else return 0; } - if (gHelpSystemListMenu.field_0D > r4) + if (gHelpSystemListMenu.cursorPos > r4) { - gHelpSystemListMenu.field_0D--; + gHelpSystemListMenu.cursorPos--; return 1; } else { - gHelpSystemListMenu.field_0C--; + gHelpSystemListMenu.itemsAbove--; return 2; } } @@ -1134,24 +1134,24 @@ u8 TryMoveCursor1(u8 dirn) r4 = 0; else r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1); - if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) + if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) { - if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1) + if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1) { - gHelpSystemListMenu.field_0D++; + gHelpSystemListMenu.cursorPos++; return 1; } else return 0; } - else if (gHelpSystemListMenu.field_0D < r4) + else if (gHelpSystemListMenu.cursorPos < r4) { - gHelpSystemListMenu.field_0D++; + gHelpSystemListMenu.cursorPos++; return 1; } else { - gHelpSystemListMenu.field_0C++; + gHelpSystemListMenu.itemsAbove++; return 2; } } @@ -1159,7 +1159,7 @@ u8 TryMoveCursor1(u8 dirn) bool8 MoveCursor(u8 by, u8 dirn) { - u8 r7 = gHelpSystemListMenu.field_0D; + u8 r7 = gHelpSystemListMenu.cursorPos; u8 flags = 0; s32 i; for (i = 0; i < by; i++) @@ -1172,14 +1172,14 @@ bool8 MoveCursor(u8 by, u8 dirn) // neither changed return TRUE; case 1: - // changed field_0D only + // changed cursorPos only sub_813C860(r7); PlaceListMenuCursor(); CommitTilemap(); break; case 2: case 3: - // changed field_0C + // changed itemsAbove if (sub_812BF88() == TRUE) { HelpSystem_SetInputDelay(2); diff --git a/src/help_system_812B1E0.c b/src/help_system_812B1E0.c index df892152a..5b634a273 100644 --- a/src/help_system_812B1E0.c +++ b/src/help_system_812B1E0.c @@ -19,22 +19,22 @@ static EWRAM_DATA u16 sSomeVariable = 0; static EWRAM_DATA u8 gUnknown_203B0EE = 0; -u8 gUnknown_3005E9C[4]; +u8 sHelpSystemState[4]; u16 gSomeVariableBackup; static bool32 IsCurrentMapInArray(const u16 * mapIdxs); -static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static bool8 sub_812B754(void); -static bool8 sub_812B780(u8); -static bool8 sub_812BB10(void); - -static void sub_812BF5C(void); -static void sub_812BF74(const u8 *); -static void sub_812BF94(struct HelpSystemListMenu * a0); -static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); - -static const u8 *const gUnknown_845B080[] = { +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static bool8 HelpSystem_HasDefeatedBrock(void); +static bool8 HelpSystemSubmenuIndexIsActive(u8); +static bool8 HasGottenAtLeastOneHM(void); + +static void PrintWelcomeMessageOnPanel1(void); +static void PrintTextOnPanel2Row52RightAlign(const u8 *); +static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); + +static const u8 *const sHelpSystemTopicPtrs[] = { gUnknown_81B2DF8, gUnknown_81B2E1C, gUnknown_81B2E2E, @@ -43,7 +43,7 @@ static const u8 *const gUnknown_845B080[] = { gUnknown_81B2E6A }; -static const u8 *const gUnknown_845B098[] = { +static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[] = { gUnknown_81B2E88, gUnknown_81B2EC8, gUnknown_81B2F00, @@ -52,7 +52,7 @@ static const u8 *const gUnknown_845B098[] = { gUnknown_81B2FA9 }; -static const u8 *const gUnknown_845B0B0[] = { +static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { NULL, gUnknown_81B3083, gUnknown_81B30A9, @@ -100,7 +100,7 @@ static const u8 *const gUnknown_845B0B0[] = { gUnknown_81B3516 }; -static const u8 *const gUnknown_845B164[] = { +static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { NULL, gUnknown_81B3525, gUnknown_81B35E6, @@ -148,7 +148,7 @@ static const u8 *const gUnknown_845B164[] = { gUnknown_81B55F4 }; -static const u8 *const gUnknown_845B218[] = { +static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { NULL, gUnknown_81B56E3, gUnknown_81B56F4, @@ -200,7 +200,7 @@ static const u8 *const gUnknown_845B218[] = { gUnknown_81B5A37 }; -static const u8 *const gUnknown_845B2DC[] = { +static const u8 *const sHelpSystemSpecializedControlsTextPtrs[] = { NULL, gUnknown_81B5A4D, gUnknown_81B5B0C, @@ -252,7 +252,7 @@ static const u8 *const gUnknown_845B2DC[] = { gUnknown_81B7C57 }; -static const u8 *const gUnknown_845B3A0[] = { +static const u8 *const sHelpSystemSpecializedStringsTextPtrs[] = { NULL, gUnknown_81B7CC1, gUnknown_81B7CC4, @@ -299,7 +299,7 @@ static const u8 *const gUnknown_845B3A0[] = { gUnknown_81B7E0F }; -static const u8 *const gUnknown_845B450[] = { +static const u8 *const sHelpSystemSpecializedStringDefinitionsTextPtrs[] = { NULL, gUnknown_81B7E16, gUnknown_81B7F0A, @@ -346,7 +346,7 @@ static const u8 *const gUnknown_845B450[] = { gUnknown_81B9B2F }; -static const u8 *const gUnknown_845B500[] = { +static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { NULL, gUnknown_81B9BB7, gUnknown_81B9BC7, @@ -357,7 +357,7 @@ static const u8 *const gUnknown_845B500[] = { gUnknown_81B9C1D }; -static const u8 *const gUnknown_845B520[] = { +static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { NULL, gUnknown_81B9C2F, gUnknown_81B9D04, @@ -368,7 +368,7 @@ static const u8 *const gUnknown_845B520[] = { gUnknown_81BA027 }; -static const u8 *const gUnknown_845B540[] = { +static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { NULL, gUnknown_81BA0F1, gUnknown_81BA10D, @@ -407,7 +407,7 @@ static const u8 *const gUnknown_845B540[] = { gUnknown_81BA400 }; -static const u8 *const gUnknown_845B5D0[] = { +static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { NULL, gUnknown_81BA416, gUnknown_81BA4E6, @@ -446,7 +446,6 @@ static const u8 *const gUnknown_845B5D0[] = { gUnknown_81BB156 }; - static const u8 gUnknown_845B660[] = { 0x01, 0x02, 0x03, 0xff }; @@ -739,7 +738,7 @@ static const u8 gUnknown_845B9BE[] = { 0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff }; -static const u8 *const gUnknown_845B9E0[] = { +static const u8 *const sHelpSystemSubmenuIndexPointers[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gUnknown_845B660, NULL, NULL, NULL, NULL, gUnknown_845B664, NULL, @@ -780,48 +779,48 @@ static const u8 *const gUnknown_845B9E0[] = { static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin"); -static const u8 gUnknown_845C4B0[] = { +static const u8 sHelpSystemContextTopicOrder[] = { 3, 0, 1, 2, 4, 5 }; -static const u8 gUnknown_845C4B6[][6] = { - {0, 0, 0, 0, 0, 1}, - {0, 0, 0, 1, 0, 1}, - {0, 0, 0, 1, 0, 1}, - {0, 1, 0, 1, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 0, 1, 0, 0, 1}, - {0, 0, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {1, 0, 0, 1, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 1, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0} +static const bool8 sHelpSystemContextTopicFlags[][6] = { + {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}, + {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE} }; static const u16 sMartMaps[] = { @@ -961,12 +960,12 @@ static bool8 IsInDungeonMap(void) void sub_812B35C(void) { - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) HelpSystem_SetSomeVariable2(0x16); else if (IsInDungeonMap()) HelpSystem_SetSomeVariable2(0x15); - else if (is_light_level_8_or_9(gMapHeader.mapType)) + else if (IsMapTypeIndoors(gMapHeader.mapType)) { if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) HelpSystem_SetSomeVariable2(0x0E); @@ -1015,126 +1014,126 @@ void HelpSystem_Enable(void) if (gQuestLogState != 2 && gQuestLogState != 3) { gHelpSystemEnabled = TRUE; - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); } } -void sub_812B4AC(void) +void HelpSystem_DisableToggleWithRButton(void) { - gUnknown_203F175 = 1; + gHelpSystemToggleWithRButtonDisabled = TRUE; } -void sub_812B4B8(void) +void HelpSystem_EnableToggleWithRButton(void) { - gUnknown_203F175 = 0; + gHelpSystemToggleWithRButtonDisabled = FALSE; } -static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - a0->sub.items = a1; - a0->sub.totalItems = 1; - a0->sub.maxShowed = 1; - a0->sub.left = 1; - a0->sub.top = 4; + helpListMenu->sub.items = listMenuItemsBuffer; + helpListMenu->sub.totalItems = 1; + helpListMenu->sub.maxShowed = 1; + helpListMenu->sub.left = 1; + helpListMenu->sub.top = 4; } -static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - sub_812B4C4(a0, a1); - sub_812B520(a0, a1); - sub_812BF74(gUnknown_841DFAC); - HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]); - sub_812BF9C(a0, a1); + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC); + HelpSystem_InitListMenuController(helpListMenu, 0, sHelpSystemState[2]); + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); sub_813BDA4(1); sub_813BD5C(1); } -static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 i; - u8 r4 = 0; + u8 totalItems = 0; for (i = 0; i < 6; i++) { - if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1) + if (sHelpSystemContextTopicFlags[sSomeVariable][sHelpSystemContextTopicOrder[i]] == TRUE) { - a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]]; - a1[r4].index = gUnknown_845C4B0[i]; - r4++; + listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; + listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; + totalItems++; } } - a1[r4 - 1].index = -2; - a0->sub.totalItems = r4; - a0->sub.maxShowed = r4; - a0->sub.left = 0; + listMenuItemsBuffer[totalItems - 1].index = -2; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = totalItems; + helpListMenu->sub.left = 0; } -static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813BDE8(0); sub_813BFC0(0); sub_813BE78(1); - sub_812B4C4(a0, a1); - sub_812B614(a0, a1); - sub_812BF74(gUnknown_841DFC9); - HelpSystem_InitListMenuController(a0, a0->field_0C, a0->field_0D); - HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0); + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9); + HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); sub_813BDA4(1); sub_813BD5C(1); } -static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - u8 r6 = 0; - const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]]; + u8 totalItems = 0; + const u8 * indexPtr = sHelpSystemSubmenuIndexPointers[sSomeVariable * 5 + sHelpSystemState[1]]; u8 i; - for (i = 0; r3[i] != 0xFF; i++) + for (i = 0; indexPtr[i] != 0xFF; i++) { - if (sub_812B780(r3[i]) == TRUE) + if (HelpSystemSubmenuIndexIsActive(indexPtr[i]) == TRUE) { - if (gUnknown_3005E9C[1] == 0) - a1[r6].label = gUnknown_845B0B0[r3[i]]; - else if (gUnknown_3005E9C[1] == 1) - a1[r6].label = gUnknown_845B218[r3[i]]; - else if (gUnknown_3005E9C[1] == 2) - a1[r6].label = gUnknown_845B3A0[r3[i]]; - else if (gUnknown_3005E9C[1] == 3) - a1[r6].label = gUnknown_845B500[r3[i]]; + if (sHelpSystemState[1] == 0) + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 1) + listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 2) + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 3) + listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[indexPtr[i]]; else - a1[r6].label = gUnknown_845B540[r3[i]]; - a1[r6].index = r3[i]; - r6++; + listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[indexPtr[i]]; + listMenuItemsBuffer[totalItems].index = indexPtr[i]; + totalItems++; } } - if (sub_812B754() == TRUE) + if (HelpSystem_HasDefeatedBrock() == TRUE) { - for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++) + for (i = 0, indexPtr = gUnknown_845B9BE; indexPtr[i] != 0xFF; i++) { - a1[r6].label = gUnknown_845B3A0[r3[i]]; - a1[r6].index = r3[i]; - r6++; + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; + listMenuItemsBuffer[totalItems].index = indexPtr[i]; + totalItems++; } } - a1[r6].label = gUnknown_81B2E6F; - a1[r6].index = -2; - r6++; - a0->sub.totalItems = r6; - a0->sub.maxShowed = 7; - a0->sub.left = 0; - a0->sub.top = 21; + listMenuItemsBuffer[totalItems].label = gUnknown_81B2E6F; + listMenuItemsBuffer[totalItems].index = -2; + totalItems++; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = 7; + helpListMenu->sub.left = 0; + helpListMenu->sub.top = 21; } -static bool8 sub_812B754(void) +static bool8 HelpSystem_HasDefeatedBrock(void) { - if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gUnknown_3005E9C[1] == 2) + if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && sHelpSystemState[1] == 2) return TRUE; return FALSE; } -static bool8 sub_812B780(u8 id) +static bool8 HelpSystemSubmenuIndexIsActive(u8 id) { u8 i = 0; - if (gUnknown_3005E9C[1] == 0) + if (sHelpSystemState[1] == 0) { switch (id) { @@ -1188,7 +1187,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_BADGE01_GET); case 28: case 40: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 39: return FlagGet(FLAG_GOT_FAME_CHECKER); case 44: @@ -1196,7 +1195,7 @@ static bool8 sub_812B780(u8 id) } return FALSE; } - if (gUnknown_3005E9C[1] == 1) + if (sHelpSystemState[1] == 1) { switch (id) { @@ -1254,7 +1253,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_BADGE01_GET); case 16: case 17: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 18: return FlagGet(FLAG_GOT_BICYCLE); case 48: @@ -1262,9 +1261,9 @@ static bool8 sub_812B780(u8 id) } return FALSE; } - if (gUnknown_3005E9C[1] == 2) + if (sHelpSystemState[1] == 2) { - if (sub_812B754() == TRUE) + if (HelpSystem_HasDefeatedBrock() == TRUE) { for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++) { @@ -1311,7 +1310,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_SYS_POKEMON_GET); case 36: case 37: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 3: case 15: case 18: @@ -1320,7 +1319,7 @@ static bool8 sub_812B780(u8 id) } return TRUE; } - if (gUnknown_3005E9C[1] == 3) + if (sHelpSystemState[1] == 3) { switch (id) { @@ -1331,7 +1330,7 @@ static bool8 sub_812B780(u8 id) } return TRUE; } - if (gUnknown_3005E9C[1] == 4) + if (sHelpSystemState[1] == 4) { return TRUE; } @@ -1339,7 +1338,7 @@ static bool8 sub_812B780(u8 id) return FALSE; } -static bool8 sub_812BB10(void) +static bool8 HasGottenAtLeastOneHM(void) { if (FlagGet(FLAG_GOT_HM01) == TRUE) return TRUE; @@ -1358,64 +1357,64 @@ static bool8 sub_812BB10(void) return FALSE; } -bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - switch (a0->field_0E) + switch (helpListMenu->state) { case 8: - return sub_812BC54(a0, a1); + return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); case 9: - return sub_812BC80(a0, a1); + return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); case 10: - return sub_812BCA8(a0, a1); + return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); case 0: - return sub_812BCD0(a0, a1); + return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); case 1: - return sub_812BD2C(a0, a1); + return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); case 2: - return sub_812BD64(a0, a1); + return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); case 3: - return sub_812BD98(a0, a1); + return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); case 4: - return sub_812BE10(a0, a1); + return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); case 5: - return sub_812BEEC(a0, a1); + return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); case 6: - return sub_812BF18(a0, a1); + return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); } return FALSE; } -bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - sub_812BF74(gUnknown_841DFA5); - sub_812BF5C(); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5); + PrintWelcomeMessageOnPanel1(); sub_813BDA4(1); sub_813BD5C(1); - a0->field_0E = 9; + helpListMenu->state = 9; return TRUE; } -bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - a0->field_0E = 10; + helpListMenu->state = 10; } return TRUE; } -bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[2] = 0; - sub_812BF94(a0); - sub_812B4D8(a0, a1); - a0->field_0E = 0; + sHelpSystemState[2] = 0; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; return TRUE; } -bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) @@ -1425,42 +1424,42 @@ bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) return FALSE; case -5: case -4: - sub_812BF9C(a0, a1); + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); break; case -3: case -1: break; default: - gUnknown_3005E9C[1] = v0; - a0->field_0E = 1; + sHelpSystemState[1] = v0; + helpListMenu->state = 1; break; } return TRUE; } -bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 1; - gUnknown_3005E9C[2] = a0->field_0D; - sub_812BF94(a0); - sub_812B5A8(a0, a1); + sHelpSystemState[0] = 1; + sHelpSystemState[2] = helpListMenu->cursorPos; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); - a0->field_0E = 3; + helpListMenu->state = 3; return TRUE; } -bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813C004(0, 0); sub_813C004(1, 0); - gUnknown_3005E9C[0] = 0; - sub_812B4D8(a0, a1); - a0->field_0E = 0; + sHelpSystemState[0] = 0; + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; return TRUE; } -bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) @@ -1468,7 +1467,7 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) case -6: return FALSE; case -2: - a0->field_0E = 2; + helpListMenu->state = 2; break; case -5: case -4: @@ -1476,8 +1475,8 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) case -1: break; default: - gUnknown_3005E9C[3] = v0; - a0->field_0E = 4; + sHelpSystemState[3] = v0; + helpListMenu->state = 4; break; } return TRUE; @@ -1485,60 +1484,60 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) void sub_812BDEC(void) { - HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0); + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); } -bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 2; + sHelpSystemState[0] = 2; sub_813BDA4(0); HelpSystem_FillPanel1(); - sub_812BF74(gUnknown_841DFBE); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE); sub_813BDE8(1); sub_813BEE4(1); - if (gUnknown_3005E9C[1] == 0) + if (sHelpSystemState[1] == 0) { - HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 1) + else if (sHelpSystemState[1] == 1) { - HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedControlsTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 2) + else if (sHelpSystemState[1] == 2) { - HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemSpecializedStringsTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedStringDefinitionsTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 3) + else if (sHelpSystemState[1] == 3) { - HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[sHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[sHelpSystemState[3]]); } else { - HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[sHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[sHelpSystemState[3]]); } sub_813BDA4(1); sub_813BD5C(1); - a0->field_0E = 6; + helpListMenu->state = 6; return TRUE; } -bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 1; - sub_812B5A8(a0, a1); + sHelpSystemState[0] = 1; + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); - a0->field_0E = 3; + helpListMenu->state = 3; return TRUE; } -bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - a0->field_0E = 5; + helpListMenu->state = 5; return TRUE; } if (JOY_NEW(L_BUTTON | R_BUTTON)) @@ -1546,13 +1545,13 @@ bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) return TRUE; } -static void sub_812BF5C(void) +static void PrintWelcomeMessageOnPanel1(void) { HelpSystem_FillPanel1(); HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0); } -static void sub_812BF74(const u8 * str) +static void PrintTextOnPanel2Row52RightAlign(const u8 * str) { HelpSystem_FillPanel2(); HelpSystem_PrintTextRightAlign_Row52(str); @@ -1560,21 +1559,21 @@ static void sub_812BF74(const u8 * str) u8 sub_812BF88(void) { - return gUnknown_3005E9C[0]; + return sHelpSystemState[0]; } -static void sub_812BF94(struct HelpSystemListMenu * a0) +static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) { - a0->field_0C = 0; - a0->field_0D = 0; + helpListMenu->itemsAbove = 0; + helpListMenu->cursorPos = 0; } -static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - s32 index = a1[a0->field_0C + a0->field_0D].index; + s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; if (index == -2) - HelpSystem_PrintText_813C584(gUnknown_845B098[5]); + HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]); else - HelpSystem_PrintText_813C584(gUnknown_845B098[index]); + HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]); sub_813BE30(1); } diff --git a/src/librfu_intr.c b/src/librfu_intr.c new file mode 100644 index 000000000..23962a937 --- /dev/null +++ b/src/librfu_intr.c @@ -0,0 +1,402 @@ +#include "global.h" +#include "librfu.h" + +static void sio32intr_clock_master(void); +static void sio32intr_clock_slave(void); +static u16 handshake_wait(u16 slot); +static void STWI_set_timer_in_RAM(u8 count); +static void STWI_stop_timer_in_RAM(void); +static void STWI_init_slave(void); +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()); +static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)); +static void Callback_Dummy_ID(void (*callbackId)(void)); + +void IntrSIO32(void) +{ + if (gSTWIStatus->state == 10) + { + if (gSTWIStatus->callbackID != NULL) + Callback_Dummy_ID(gSTWIStatus->callbackID); + } + else + { + if (gSTWIStatus->msMode == AGB_CLK_MASTER) + sio32intr_clock_master(); + else + sio32intr_clock_slave(); + } +} + +static void sio32intr_clock_master(void) +{ + u32 regSIODATA32; + u32 ackLen; + + STWI_set_timer_in_RAM(80); + regSIODATA32 = REG_SIODATA32; + + if (gSTWIStatus->state == 0) // master send req + { + if (regSIODATA32 == 0x80000000) + { + if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength) + { + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext]; + gSTWIStatus->reqNext++; + } + else + { + gSTWIStatus->state = 1; // master wait ack + REG_SIODATA32 = 0x80000000; + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(130); + return; + } + } + else if (gSTWIStatus->state == 1) // master wait ack + { + if ((regSIODATA32 & 0xFFFF0000) == 0x99660000) + { + gSTWIStatus->ackNext = 0; + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; + gSTWIStatus->ackNext++; + gSTWIStatus->ackActiveCommand = regSIODATA32; + gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8; + if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext) + { + gSTWIStatus->state = 2; // master receive ack + REG_SIODATA32 = 0x80000000; + } + else + { + gSTWIStatus->state = 3; // master done ack + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(130); + return; + } + } + else if (gSTWIStatus->state == 2) // master receive ack + { + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; + gSTWIStatus->ackNext++; + if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) + gSTWIStatus->state = 3; // master done ack + else + REG_SIODATA32 = 0x80000000; + } + + if (handshake_wait(1) == 1) + return; + + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD; + + if (handshake_wait(0) == 1) + return; + + STWI_stop_timer_in_RAM(); + + if (gSTWIStatus->state == 3) // master done ack + { + if ( + gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) + ) + { + + gSTWIStatus->msMode = AGB_CLK_SLAVE; + REG_SIODATA32 = 0x80000000; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; + gSTWIStatus->state = 5; // slave receive req init + } + else + { + if (gSTWIStatus->ackActiveCommand == 0xEE) + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->state = 4; // error + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + else + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->state = 4; // error + } + } + gSTWIStatus->sending = 0; + if (gSTWIStatus->callbackM != NULL) + Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM); + } + else + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE; + } +} + +static void sio32intr_clock_slave(void) +{ + u32 regSIODATA32; + u32 r0; + register u32 reqLen asm("r2"); + + gSTWIStatus->timerActive = 0; + STWI_set_timer_in_RAM(100); + if (handshake_wait(0) == 1) + return; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD; + regSIODATA32 = REG_SIODATA32; + if (gSTWIStatus->state == 5) // slave receive req init + { + ((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32; + gSTWIStatus->reqNext = 1; + r0 = 0x99660000; + if ((regSIODATA32 >> 16) == (r0 >> 16)) + { + gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8; + gSTWIStatus->reqActiveCommand = regSIODATA32; + if (gSTWIStatus->reqLength == 0) + { + if ( + gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ + ) + { + gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; + ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand; + gSTWIStatus->ackLength = 0; + } + else + { + ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE; + if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) + { + ((u32*)gSTWIStatus->txPacket)[1] = 1; + } + else + { + ((u32*)gSTWIStatus->txPacket)[1] = 2; + } + gSTWIStatus->ackLength = 1; + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0]; + gSTWIStatus->ackNext = 1; + gSTWIStatus->state = 7; // slave send ack + } + else + { + REG_SIODATA32 = 0x80000000; + gSTWIStatus->reqNext = 1; + gSTWIStatus->state = 6; // slave receive req + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(100); + return; + } + } + else if (gSTWIStatus->state == 6) // slave receive req + { + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32; + gSTWIStatus->reqNext++; + if (gSTWIStatus->reqLength < gSTWIStatus->reqNext) + { + if ( + gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ + ) + { + gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; + ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand; + gSTWIStatus->ackLength = 0; + } + else + { + ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE; + if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) + { + ((u32*)gSTWIStatus->txPacket)[1] = 1; + } + else + { + ((u32*)gSTWIStatus->txPacket)[1] = 2; + } + gSTWIStatus->ackLength = 1; + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0]; + gSTWIStatus->ackNext = 1; + gSTWIStatus->state = 7; // slave send ack + } + else + { + REG_SIODATA32 = 0x80000000; + } + } + else if (gSTWIStatus->state == 7) // slave send ack + { + if (regSIODATA32 == 0x80000000) + { + if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) + { + gSTWIStatus->state = 8; // slave done ack + } + else + { + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[gSTWIStatus->ackNext]; + gSTWIStatus->ackNext++; + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(100); + return; + } + } + if (handshake_wait(1) == 1) + return; + if (gSTWIStatus->state == 8) // slave done ack + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + STWI_stop_timer_in_RAM(); + if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION) + { + STWI_init_slave(); + if (gSTWIStatus->callbackS != NULL) + { + Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS); + } + } + else + { + REG_SIODATA32 = 0; + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->msMode = AGB_CLK_MASTER; + gSTWIStatus->state = 0; // master send req + if (gSTWIStatus->callbackS != NULL) + { + Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS); + } + } + } + else + { + REG_IME = 0; + if (REG_TM0CNT_H & TIMER_ENABLE) + { + if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK) + { + while (REG_TM0CNT_L > 0xFF9B); + } + else + { + while (REG_TM0CNT_L > 0xFFFE); + } + } + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; + REG_IME = 1; + } +} + +static u16 handshake_wait(u16 slot) +{ + do + { + if ((gSTWIStatus->timerActive & 0xFF) == 1) + { + gSTWIStatus->timerActive = 0; + return 1; + } + } while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT)); + return 0; +} + +static void STWI_set_timer_in_RAM(u8 count) +{ + vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4); + vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4); + REG_IME = 0; + switch (count) + { + case 50: + *regTMCNTL = 0xFCCB; + gSTWIStatus->timerState = 1; + break; + case 80: + *regTMCNTL = 0xFAE0; + gSTWIStatus->timerState = 2; + break; + case 100: + *regTMCNTL = 0xF996; + gSTWIStatus->timerState = 3; + break; + case 130: + *regTMCNTL = 0xF7AD; + gSTWIStatus->timerState = 4; + break; + } + *regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE; + REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; + REG_IME = 1; +} + +static void STWI_stop_timer_in_RAM(void) +{ + gSTWIStatus->timerState = 0; + REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; + REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; +} + +static void STWI_init_slave(void) +{ + gSTWIStatus->state = 5; // slave receive req init + gSTWIStatus->msMode = AGB_CLK_SLAVE; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->reqActiveCommand = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; +} + +NAKED +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()) +{ + asm("bx r2"); +} + +NAKED +static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)) +{ + asm("bx r1"); +} + +NAKED +static void Callback_Dummy_ID(void (*callbackId)(void)) +{ + asm("bx r0"); +} diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index dccd342f2..4016ee7e3 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -29,27 +29,27 @@ struct RfuLocalStruct u16 unk06; }; -static void rfu_CB_defaultCallback(u8, u16); -static void rfu_CB_reset(u8, u16); -static void rfu_CB_configGameData(u8, u16); -static void rfu_CB_stopMode(u8, u16); -static void rfu_CB_startSearchChild(u8, u16); -static void rfu_CB_pollAndEndSearchChild(u8, u16); -static void rfu_CB_startSearchParent(u8, u16); -static void rfu_CB_pollSearchParent(u8, u16); -static void rfu_CB_pollConnectParent(u8, u16); -static void rfu_CB_pollConnectParent(u8, u16); -static void rfu_CB_disconnect(u8, u16); -static void rfu_CB_CHILD_pollConnectRecovery(u8, u16); -static void rfu_CB_sendData(UNUSED u8, u16); -static void rfu_CB_sendData2(UNUSED u8, u16); -static void rfu_CB_sendData3(u8, u16); -static void rfu_CB_recvData(u8, u16); -static void rfu_enableREQCallback(bool8); +static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult); +static void rfu_CB_reset(u8 reqCommand, u16 reqResult); +static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult); +static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult); +static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult); +static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult); +static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult); +static void rfu_CB_recvData(u8 reqCommand, u16 reqResult); +static void rfu_enableREQCallback(bool8 enable); static void rfu_STC_clearAPIVariables(void); static void rfu_STC_readChildList(void); static void rfu_STC_readParentCandidateList(void); -static void rfu_STC_REQ_callback(u8, u16); +static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult); static void rfu_STC_removeLinkData(u8, u8); static void rfu_STC_fastCopy(const u8 **, u8 **, s32); static void rfu_STC_clearLinkStatus(u8); @@ -91,7 +91,7 @@ static const char lib_ver[] = "RFU_V1024"; static const char str_checkMbootLL[] = "RFU-MBOOT"; -u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) +u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; u16 *dst; @@ -109,21 +109,21 @@ u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc // An assert/debug print may have existed before, ie // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num) // to push this into r3? - r3 = sizeof(struct RfuAPIBuffer); + r3 = RFU_API_BUFF_SIZE_RAM; if (buffByteSize < r3) return ERR_RFU_API_BUFF_SIZE; } if (!copyInterruptToRam) { - r3 = 0x504; // same issue as above + r3 = RFU_API_BUFF_SIZE_ROM; // same issue as above if (buffByteSize < r3) return ERR_RFU_API_BUFF_SIZE; } - gRfuLinkStatus = &APIBuffer->linkStatus; - gRfuStatic = &APIBuffer->static_; - gRfuFixed = &APIBuffer->fixed; - gRfuSlotStatusNI[0] = &APIBuffer->NI[0]; - gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0]; + gRfuLinkStatus = (void *)APIBuffer + 0; + gRfuStatic = (void *)APIBuffer + 0xb4; + gRfuFixed = (void *)APIBuffer + 0xdc; + gRfuSlotStatusNI[0] = (void *)APIBuffer + 0x1bc; + gRfuSlotStatusUNI[0] = (void *)APIBuffer + 0x37c; for (i = 1; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; @@ -180,20 +180,20 @@ void rfu_REQ_PARENT_resumeRetransmitAndChange(void) u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) { - struct RfuIntrStruct *buf; + u8 *buf; *ackFlag = 0; if (gRfuLinkStatus->parentChild != MODE_PARENT) return ERR_MODE_NOT_PARENT; buf = rfu_getSTWIRecvBuffer(); - switch (buf->rxPacketAlloc.rfuPacket8.data[0]) + switch (*buf) { case 40: case 54: - if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0) + if (buf[1] == 0) *ackFlag = gRfuLinkStatus->connSlotFlag; else - *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; + *ackFlag = buf[4]; return 0; default: return ERR_REQ_CMD_ID; @@ -205,9 +205,9 @@ void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p) STWI_init_timer(timerIntrTable_p, timerNo); } -struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) +u8 *rfu_getSTWIRecvBuffer(void) { - return gRfuFixed->STWIBuffer; + return (u8 *)gRfuFixed->STWIBuffer; } void rfu_setMSCCallback(void (*callback)(u16 reqCommandId)) @@ -229,23 +229,23 @@ static void rfu_enableREQCallback(bool8 enable) gRfuStatic->flags &= 0xF7; } -static void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult) { STWI_set_Callback_M(rfu_CB_defaultCallback); gRfuStatic->reqResult = reqResult; if (gRfuStatic->flags & 8) - gRfuFixed->reqCallback(r5, reqResult); + gRfuFixed->reqCallback(reqCommand, reqResult); } -static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult) { s32 r5; u8 i; - if (r0 == 0xFF) + if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { if (gRfuStatic->flags & 8) - gRfuFixed->reqCallback(r0, reqResult); + gRfuFixed->reqCallback(reqCommand, reqResult); r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; for (i = 0; i < RFU_CHILD_MAX; ++i) if ((r5 >> i) & 1) @@ -305,14 +305,14 @@ void rfu_REQ_stopMode(void) if (REG_IME == 0) { - rfu_STC_REQ_callback(61, 6); + rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 6); gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; } else { AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); - if (AgbRFU_checkID(8) == 0x8001) + if (AgbRFU_checkID(8) == RFU_ID) { timerReg = ®_TMCNT(gSTWIStatus->timerSelect); *timerReg = 0; @@ -326,16 +326,16 @@ void rfu_REQ_stopMode(void) else { REG_SIOCNT = SIO_MULTI_MODE; - rfu_STC_REQ_callback(61, 0); + rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 0); } } } -static void rfu_CB_stopMode(u8 a1, u16 reqResult) +static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult) { if (reqResult == 0) REG_SIOCNT = SIO_MULTI_MODE; - rfu_STC_REQ_callback(a1, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } u32 rfu_REQBN_softReset_and_checkID(void) @@ -357,11 +357,11 @@ void rfu_REQ_reset(void) STWI_send_ResetREQ(); } -static void rfu_CB_reset(u8 a1, u16 reqResult) +static void rfu_CB_reset(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_clearAPIVariables(); - rfu_STC_REQ_callback(a1, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) @@ -384,18 +384,18 @@ void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname) { - u8 sp[16]; + u8 packet[16]; u8 i; u8 r3; const u8 *gnameBackup = gname; const u8 *unameBackup; - sp[0] = serialNo; - sp[1] = serialNo >> 8; + packet[0] = serialNo; + packet[1] = serialNo >> 8; if (mbootFlag != 0) - sp[1] = (serialNo >> 8) | 0x80; + packet[1] = (serialNo >> 8) | 0x80; for (i = 2; i < 15; ++i) - sp[i] = *gname++; + packet[i] = *gname++; r3 = 0; unameBackup = uname; for (i = 0; i < 8; ++i) @@ -403,11 +403,11 @@ void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u r3 += *unameBackup++; r3 += *gnameBackup++; } - sp[15] = ~r3; + packet[15] = ~r3; if (mbootFlag != 0) - sp[14] = 0; + packet[14] = 0; STWI_set_Callback_M(rfu_CB_configGameData); - STWI_send_GameConfigREQ(sp, uname); + STWI_send_GameConfigREQ(packet, uname); } static void rfu_CB_configGameData(u8 ip, u16 r7) @@ -451,29 +451,29 @@ void rfu_REQ_startSearchChild(void) if (r1 == 0) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) - rfu_STC_clearLinkStatus(1); + rfu_STC_clearLinkStatus(MODE_PARENT); } else { - rfu_STC_REQ_callback(25, r1); + rfu_STC_REQ_callback(ID_SC_START_REQ, r1); } STWI_set_Callback_M(rfu_CB_startSearchChild); STWI_send_SC_StartREQ(); } -static void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) gRfuStatic->SCStartFlag = 1; - rfu_STC_REQ_callback(r3, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } -static void rfu_STC_clearLinkStatus(u8 r4) +static void rfu_STC_clearLinkStatus(u8 parentChild) { u8 i; rfu_clearAllSlot(); - if (r4 != 0) + if (parentChild != MODE_CHILD) { CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; @@ -498,11 +498,11 @@ void rfu_REQ_endSearchChild(void) STWI_send_SC_EndREQ(); } -static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readChildList(); - if (r4 == 26) + if (reqCommand == ID_SC_POLL_REQ) { if (gRfuLinkStatus->my.id == 0) { @@ -512,13 +512,13 @@ static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; } } - else if (r4 == 27) + else if (reqCommand == ID_SC_END_REQ) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) gRfuLinkStatus->my.id = 0; gRfuStatic->SCStartFlag = 0; } - rfu_STC_REQ_callback(r4, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_readChildList(void) @@ -555,7 +555,7 @@ static void rfu_STC_readChildList(void) if (gRfuStatic->lsFixedCount[r2] >= 4) { gRfuStatic->lsFixedCount[r2] = 0; - gRfuLinkStatus->strength[r2] = 0xFF; + gRfuLinkStatus->strength[r2] = 255; gRfuLinkStatus->connSlotFlag |= 1 << r2; ++gRfuLinkStatus->connCount; gRfuLinkStatus->partner[r2].id = *(u16 *)r4; @@ -575,11 +575,11 @@ void rfu_REQ_startSearchParent(void) STWI_send_SP_StartREQ(); } -static void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) - rfu_STC_clearLinkStatus(0); - rfu_STC_REQ_callback(r5, reqResult); + rfu_STC_clearLinkStatus(MODE_CHILD); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_pollSearchParent(void) @@ -588,11 +588,11 @@ void rfu_REQ_pollSearchParent(void) STWI_send_SP_PollingREQ(); } -static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readParentCandidateList(); - rfu_STC_REQ_callback(r5, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_endSearchParent(void) @@ -665,7 +665,7 @@ void rfu_REQ_startConnectParent(u16 pid) } else { - rfu_STC_REQ_callback(31, r3); + rfu_STC_REQ_callback(ID_CP_START_REQ, r3); } } @@ -797,13 +797,13 @@ u16 rfu_syncVBlank(void) u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot) { - u8 sp08 = 0; - u8 sp0C = 0; + u8 reasonMaybe = 0; + u8 reqResult = 0; u8 i; s32 sp10, sp14; u8 *r2; u8 r9, r6, r3, connSlotFlag, r0; - + *bmLinkLossSlot = 0; *linkLossReason = REASON_DISCONNECTED; *parentBmLinkRecoverySlot = 0; @@ -814,21 +814,21 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason if (gRfuStatic->nowWatchInterval == 0) { gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; - sp08 = 1; + reasonMaybe = 1; } - if ((u8)reqCommandId == 41) + if ((u8)reqCommandId == ID_DISCONNECTED_AND_CHANGE_REQ) { u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - + *bmLinkLossSlot = r1[4]; *linkLossReason = r1[5]; if (*linkLossReason == REASON_LINK_LOSS) *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; - sp08 = 2; + reasonMaybe = 2; } else { - if (reqCommandId == 310) + if (reqCommandId == 0x0136) { r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; r6 ^= gRfuLinkStatus->connSlotFlag; @@ -843,15 +843,15 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } } } - if (sp08 == 0) + if (reasonMaybe == 0) return 0; } sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_LinkStatusREQ(); - sp0C = STWI_poll_CommandEnd(); - if (sp0C == 0) + reqResult = STWI_poll_CommandEnd(); + if (reqResult == 0) { r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; for (i = 0; i < RFU_CHILD_MAX; ++i) @@ -861,15 +861,15 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } else { - rfu_STC_REQ_callback(17, sp0C); - return sp0C; + rfu_STC_REQ_callback(ID_LINK_STATUS_REQ, reqResult); + return reqResult; } for (; i < RFU_CHILD_MAX; ++i) { r6 = 1 << i; - if (sp0C == 0) + if (reqResult == 0) { - if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6)) + if (reasonMaybe == 1 && (gRfuLinkStatus->connSlotFlag & r6)) { if (gRfuLinkStatus->strength[i] == 0) { @@ -879,7 +879,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason if (gRfuStatic->linkEmergencyFlag[i] > 3) { *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *linkLossReason = reasonMaybe; // why not directly use REASON_LINK_LOSS? } } else @@ -890,7 +890,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *linkLossReason = reasonMaybe; // why not directly use REASON_LINK_LOSS? } else { @@ -900,7 +900,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); STWI_poll_CommandEnd(); *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *linkLossReason = reasonMaybe; // why not directly use REASON_LINK_LOSS? } } } @@ -908,7 +908,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } else { - gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? + gRfuStatic->linkEmergencyFlag[i] = reqResult; // why not directly use 0? } } if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0) @@ -968,23 +968,23 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason return 0; } -static void rfu_STC_removeLinkData(u8 r7, u8 r12) +static void rfu_STC_removeLinkData(u8 bmConnectedPartnerId, u8 bmDisconnect) { - u8 r5 = 1 << r7; - s32 r6; + u8 bmLinkLossFlag = 1 << bmConnectedPartnerId; + s32 bmLinkRetainedFlag; - if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0) + if ((gRfuLinkStatus->connSlotFlag & bmLinkLossFlag) && gRfuLinkStatus->connCount != 0) --gRfuLinkStatus->connCount; - gRfuLinkStatus->connSlotFlag &= r6 = ~r5; - gRfuLinkStatus->linkLossSlotFlag |= r5; - if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) + gRfuLinkStatus->connSlotFlag &= bmLinkRetainedFlag = ~bmLinkLossFlag; + gRfuLinkStatus->linkLossSlotFlag |= bmLinkLossFlag; + if (gRfuLinkStatus->parentChild == MODE_CHILD && gRfuLinkStatus->connSlotFlag == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; - if (r12 != 0) + if (bmDisconnect) { - CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); - gRfuLinkStatus->linkLossSlotFlag &= r6; - gRfuLinkStatus->getNameFlag &= r6; - gRfuLinkStatus->strength[r7] = 0; + CpuFill16(0, &gRfuLinkStatus->partner[bmConnectedPartnerId], sizeof(struct RfuTgtData)); + gRfuLinkStatus->linkLossSlotFlag &= bmLinkRetainedFlag; + gRfuLinkStatus->getNameFlag &= bmLinkRetainedFlag; + gRfuLinkStatus->strength[bmConnectedPartnerId] = 0; } } @@ -1005,7 +1005,7 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot) STWI_send_SC_EndREQ(), (r1 = STWI_poll_CommandEnd()) != 0)) { - rfu_STC_REQ_callback(27, r1); + rfu_STC_REQ_callback(ID_SC_END_REQ, r1); } else { @@ -1015,20 +1015,20 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot) } } -static void rfu_CB_disconnect(u8 r6, u16 r5) +static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult) { u8 r4, r0; - if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) + if (reqResult == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) - r5 = 0; + reqResult = 0; } gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; - if (r5 == 0) + if (reqResult == 0) { for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) { @@ -1039,14 +1039,14 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) } if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; - rfu_STC_REQ_callback(r6, r5); + rfu_STC_REQ_callback(reqCommand, reqResult); if (gRfuStatic->SCStartFlag) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SC_StartREQ(); - r5 = STWI_poll_CommandEnd(); - if (r5 != 0) - rfu_STC_REQ_callback(25, r5); + reqResult = STWI_poll_CommandEnd(); + if (reqResult != 0) + rfu_STC_REQ_callback(ID_SC_START_REQ, reqResult); } } @@ -1068,12 +1068,12 @@ void rfu_REQ_CHILD_pollConnectRecovery(void) STWI_send_CPR_PollingREQ(); } -static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult) { u8 r3, r4; struct RfuLinkStatus *r2; - if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) + if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) { gRfuLinkStatus->parentChild = MODE_CHILD; for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) @@ -1090,7 +1090,7 @@ static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) } gRfuStatic->recoveryBmSlot = 0; } - rfu_STC_REQ_callback(r8, r7); + rfu_STC_REQ_callback(reqCommand, reqResult); } u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) @@ -1127,14 +1127,14 @@ static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) void rfu_REQ_changeMasterSlave(void) { - if (STWI_read_status(1) == 1) + if (STWI_read_status(1) == AGB_CLK_MASTER) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_MS_ChangeREQ(); } else { - rfu_STC_REQ_callback(39, 0); + rfu_STC_REQ_callback(ID_MS_CHANGE_REQ, 0); } } @@ -1144,11 +1144,11 @@ bool8 rfu_getMasterSlave(void) if (masterSlave == AGB_CLK_MASTER) { - if (gSTWIStatus->unk_2c) + if (gSTWIStatus->sending) { - if (gSTWIStatus->reqActiveCommand == 39 - || gSTWIStatus->reqActiveCommand == 37 - || gSTWIStatus->reqActiveCommand == 55) + if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) masterSlave = AGB_CLK_SLAVE; } } @@ -1593,12 +1593,12 @@ void rfu_REQ_sendData(bool8 clockChangeFlag) } } -static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) +static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult) { u8 r6; struct NIComm *r4; - if (r7 == 0) + if (reqResult == 0) { for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { @@ -1616,20 +1616,20 @@ static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) } } gRfuLinkStatus->LLFReadyFlag = 0; - rfu_STC_REQ_callback(36, r7); + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } -static void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) +static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult) { - rfu_STC_REQ_callback(36, r1); + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } -static void rfu_CB_sendData3(u8 r0, u16 r1) +static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult) { - if (r1 != 0) - rfu_STC_REQ_callback(36, r1); - else if (r0 == 0xFF) - rfu_STC_REQ_callback(0xFF, 0); + if (reqResult != 0) + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); + else if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) + rfu_STC_REQ_callback(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); } static void rfu_constructSendLLFrame(void) @@ -1784,13 +1784,13 @@ void rfu_REQ_recvData(void) } } -static void rfu_CB_recvData(u8 r9, u16 r7) +static void rfu_CB_recvData(u8 reqCommand, u16 reqResult) { u8 r6; struct RfuSlotStatusNI *r4; struct NIComm *r5; - if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) + if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) { gRfuStatic->NIEndRecvFlag = 0; if (gRfuLinkStatus->parentChild == MODE_PARENT) @@ -1811,20 +1811,20 @@ static void rfu_CB_recvData(u8 r9, u16 r7) } } if (gRfuStatic->recvErrorFlag) - r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; + reqResult = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; } - rfu_STC_REQ_callback(r9, r7); + rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_PARENT_analyzeRecvPacket(void) { u32 r3; u8 r5; - u8 sp[4]; + u8 sp[RFU_CHILD_MAX]; u8 *r6; r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; - for (r5 = 0; r5 < NELEMS(sp); ++r5) + for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) { sp[r5] = r3 & 0x1F; r3 >>= 5; @@ -1832,7 +1832,7 @@ static void rfu_STC_PARENT_analyzeRecvPacket(void) gRfuStatic->NIEndRecvFlag |= 1 << r5; } r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; - for (r5 = 0; r5 < NELEMS(sp); ++r5) + for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) { if (sp[r5]) { @@ -2035,6 +2035,7 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct } } _081E30AE: + ; } else if (r12->state == SLOT_STATE_SEND_LAST) { diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index b88f21737..0287b358a 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -28,8 +28,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b } gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc; gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc; - gSTWIStatus->msMode = 1; - gSTWIStatus->state = 0; + gSTWIStatus->msMode = AGB_CLK_MASTER; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; @@ -39,7 +39,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->recoveryCount = 0; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; REG_RCNT = 0x100; // TODO: mystery bit? REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; STWI_init_Callback_M(); @@ -71,7 +71,7 @@ void AgbRFU_SoftReset(void) *timerH = 3; REG_RCNT = 0x80A0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->reqActiveCommand = 0; @@ -81,9 +81,9 @@ void AgbRFU_SoftReset(void) gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; - gSTWIStatus->msMode = 1; + gSTWIStatus->msMode = AGB_CLK_MASTER; gSTWIStatus->recoveryCount = 0; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; } void STWI_set_MS_mode(u8 mode) @@ -131,12 +131,12 @@ void STWI_set_Callback_S(void (*callbackS)(u16)) void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { - gSTWIStatus->unk_20 = func; + gSTWIStatus->callbackID = func; } u16 STWI_poll_CommandEnd(void) { - while (gSTWIStatus->unk_2c == TRUE) + while (gSTWIStatus->sending == 1) ; return gSTWIStatus->error; } @@ -195,7 +195,7 @@ void STWI_send_ConfigStatusREQ(void) } } -void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) +void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname) { u8 *packetBytes; s32 i; @@ -203,29 +203,28 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) if (!STWI_init(ID_GAME_CONFIG_REQ)) { gSTWIStatus->reqLength = 6; - // TODO: what is unk1 packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *(u16 *)packetBytes = *(u16 *)unk1; + *(u16 *)packetBytes = *(u16 *)serial_gname; packetBytes += sizeof(u16); - unk1 += sizeof(u16); + serial_gname += sizeof(u16); for (i = 0; i < 14; ++i) { - *packetBytes = *unk1; + *packetBytes = *serial_gname; ++packetBytes; - ++unk1; + ++serial_gname; } for (i = 0; i < 8; ++i) { - *packetBytes = *data; + *packetBytes = *uname; ++packetBytes; - ++data; + ++uname; } STWI_start_Command(); } } -void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { if (!STWI_init(ID_SYSTEM_CONFIG_REQ)) { @@ -234,9 +233,9 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) gSTWIStatus->reqLength = 1; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *packetBytes++ = unk3; - *packetBytes++ = unk2; - *(u16*)packetBytes = unk1; + *packetBytes++ = mcTimer; + *packetBytes++ = maxMFrame; + *(u16*)packetBytes = availSlotFlag; STWI_start_Command(); } } @@ -499,20 +498,17 @@ static void STWI_intr_timer(void) STWI_stop_timer(); STWI_reset_ClockCounter(); if (gSTWIStatus->callbackM != NULL) - gSTWIStatus->callbackM(255, 0); + gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); break; } } -static void STWI_set_timer(u8 unk) +static void STWI_set_timer(u8 count) { - vu16 *timerL; - vu16 *timerH; - - timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); - timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); + vu16 *timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + vu16 *timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); REG_IME = 0; - switch (unk) + switch (count) { case 50: *timerL = 0xFCCB; @@ -543,25 +539,31 @@ static void STWI_stop_timer(void) REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } +/* + * Set up STWI to send REQ. Returns 1 if error (see below). + */ static u16 STWI_init(u8 request) { if (!REG_IME) { + // Can't start sending if IME is disabled. gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if (gSTWIStatus->unk_2c == TRUE) + else if (gSTWIStatus->sending == 1) { + // Already sending something. Cancel and error. gSTWIStatus->error = ERR_REQ_CMD_SENDING; - gSTWIStatus->unk_2c = FALSE; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if(!gSTWIStatus->msMode) + else if (gSTWIStatus->msMode == AGB_CLK_SLAVE) { + // Can't send if clock slave gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus); @@ -569,9 +571,10 @@ static u16 STWI_init(u8 request) } else { - gSTWIStatus->unk_2c = TRUE; + // Good to go, start sending + gSTWIStatus->sending = 1; gSTWIStatus->reqActiveCommand = request; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; @@ -595,7 +598,7 @@ static s32 STWI_start_Command(void) // but the cast here is required to avoid register issue *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand; REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqNext = 1; imeTemp = REG_IME; REG_IME = 0; @@ -608,7 +611,7 @@ static s32 STWI_start_Command(void) static s32 STWI_restart_Command(void) { - if (gSTWIStatus->recoveryCount <= 1) + if (gSTWIStatus->recoveryCount < 2) { ++gSTWIStatus->recoveryCount; STWI_start_Command(); @@ -618,17 +621,17 @@ static s32 STWI_restart_Command(void) if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); } else { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); - gSTWIStatus->state = 4; // TODO: what's 4 + gSTWIStatus->state = 4; // error } } return 0; @@ -636,7 +639,7 @@ static s32 STWI_restart_Command(void) static s32 STWI_reset_ClockCounter(void) { - gSTWIStatus->state = 5; // TODO: what is 5 + gSTWIStatus->state = 5; // slave receive req init gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; REG_SIODATA32 = (1 << 31); diff --git a/src/link.c b/src/link.c index dfb21f126..f5c850d63 100644 --- a/src/link.c +++ b/src/link.c @@ -235,7 +235,7 @@ bool8 IsWirelessAdapterConnected(void) sub_800B1F4(); sub_80F86F4(); sub_80FB128(TRUE); - if (sub_80FD3A4() == RFU_ID) + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { rfu_REQ_stopMode(); rfu_waitREQComplete(); @@ -721,7 +721,7 @@ void sub_8009FE8(void) { if (gWirelessCommType) { - sub_80F9828(); + StartSendingKeysToRfu(); } gLinkCallback = sub_800A040; } @@ -1448,7 +1448,7 @@ static void CheckErrorStatus(void) } } -void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) +void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) { sLinkErrorBuffer.status = status; sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; @@ -1670,8 +1670,8 @@ bool8 HandleLinkConnection(void) } else { - r4 = sub_80FAE94(); - r5 = sub_80FAEF0(); + r4 = LinkRfuMain1(); + r5 = LinkRfuMain2(); if (sub_8058318() == TRUE) { if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5) diff --git a/src/link_rfu.c b/src/link_rfu.c index 8ab76ffd5..89245398d 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -2,190 +2,188 @@ #include "librfu.h" #include "link_rfu.h" -struct UnkRfuStruct_1 gUnknown_3005E10; +LINK_MANAGER lman; -static void sub_80FD4E4(void); -static void sub_80FDC28(u32 a0); -static void sub_80FDC98(u16 reqCommandId, u16 reqResult); -static void sub_80FE394(u16 reqCommandId); -static void sub_80FE418(void); -static void sub_80FE63C(void); -static void sub_80FE6F0(void); -static void sub_80FE74C(void); -static u8 sub_80FE778(void); -static void sub_80FE7F0(u8 a0, u8 a1); -static void sub_80FE818(u8 bmDisconnectSlot); -static void sub_80FE83C(u8 a0); -static void sub_80FE918(void); -static void sub_80FEAF4(void); +static void rfu_LMAN_clearVariables(void); +static void rfu_LMAN_settingPCSWITCH(u32 rand); +static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult); +static void rfu_LMAN_MSC_callback(u16 reqCommandId); +static void rfu_LMAN_PARENT_checkRecvChildName(void); +static void rfu_LMAN_CHILD_checkSendChildName(void); +static void rfu_LMAN_CHILD_checkSendChildName2(void); +static void rfu_LMAN_CHILD_linkRecoveryProcess(void); +static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void); +static void rfu_LMAN_occureCallback(u8 msg, u8 param_count); +static void rfu_LMAN_disconnect(u8 bmDisconnectSlot); +static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot); +static void rfu_LMAN_checkNICommunicateStatus(void); +static void rfu_LMAN_managerChangeAgbClockMaster(void); -u32 sub_80FD3A4(void) +u32 rfu_LMAN_REQBN_softReset_and_checkID(void) { u32 id = rfu_REQBN_softReset_and_checkID(); if (id == RFU_ID) - gUnknown_3005E10.unk_08 = 1; - if (gUnknown_3005E10.unk_04 != 0x17 && gUnknown_3005E10.unk_04 != 0x01) + lman.RFU_powerOn_flag = 1; + if (lman.state != LMAN_FORCED_STOP_AND_RFU_RESET && lman.state != LMAN_STATE_SOFT_RESET_AND_CHECK_ID) { - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } - gUnknown_3005E10.unk_07 = 0; - gUnknown_3005E10.unk_0d = 0; - gUnknown_3005E10.unk_01 = 0; - gUnknown_3005E10.unk_00 = 0; - gUnknown_3005E10.unk_06 = -1; - sub_80FEAF4(); + lman.pcswitch_flag = 0; + lman.reserveDisconnectSlot_flag = 0; + lman.acceptCount = 0; + lman.acceptSlot_flag = 0; + lman.parent_child = MODE_NEUTRAL; + rfu_LMAN_managerChangeAgbClockMaster(); return id; } -void LinkRfu_REQ_SendData_HandleParentRelationship(u8 clockChangeFlag) +void rfu_LMAN_REQ_sendData(u8 clockChangeFlag) { if (gRfuLinkStatus->parentChild == MODE_CHILD) { - if (gUnknown_3005E10.unk_02 == TRUE) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) clockChangeFlag = TRUE; else clockChangeFlag = FALSE; } else - gUnknown_3005E10.unk_03 = 0; + lman.parentAck_flag = 0; rfu_REQ_sendData(clockChangeFlag); } -s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16)) +u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16)) { - if (func1 == NULL) + if (LMAN_callback_p == NULL) { - return 4; + return LMAN_ERROR_ILLEGAL_PARAMETER; } - CpuFill16(0, &gUnknown_3005E10, sizeof(struct UnkRfuStruct_1)); - gUnknown_3005E10.unk_06 = -1; - gUnknown_3005E10.unk_40 = func1; - gUnknown_3005E10.unk_44 = func2; - rfu_setMSCCallback(sub_80FE394); - rfu_setREQCallback(sub_80FDC98); + CpuFill16(0, &lman, sizeof(struct linkManagerTag)); + lman.parent_child = MODE_NEUTRAL; + lman.LMAN_callback = LMAN_callback_p; + lman.MSC_callback = MSC_callback_p; + rfu_setMSCCallback(rfu_LMAN_MSC_callback); + rfu_setREQCallback(rfu_LMAN_REQ_callback); return 0; } -static void sub_80FD484(void) +static void rfu_LMAN_endManager(void) { - CpuFill16(0, &gUnknown_3005E10, offsetof(struct UnkRfuStruct_1, unk_40)); - gUnknown_3005E10.unk_06 = -1; + CpuFill16(0, &lman, sizeof(struct linkManagerTag) - 8); + lman.parent_child = MODE_NEUTRAL; } -void sub_80FD4B0(const struct UnkLinkRfuStruct_02022B2C *unk0) +void rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters) { - sub_80FD4E4(); - gUnknown_3005E10.unk_04 = 1; - gUnknown_3005E10.unk_05 = 2; - gUnknown_3005E10.unk_3c = unk0; - gUnknown_3005E10.unk_09 = unk0->unk_11; - gUnknown_3005E10.unk_32 = unk0->unk_12; - gUnknown_3005E10.unk_18 = unk0->unk_14; - if (unk0->unk_10) + rfu_LMAN_clearVariables(); + lman.state = LMAN_STATE_SOFT_RESET_AND_CHECK_ID; + lman.next_state = LMAN_STATE_RESET; + lman.init_param = init_parameters; + lman.linkRecovery_enable = init_parameters->linkRecovery_enable; + lman.linkRecoveryTimer.count_max = init_parameters->linkRecovery_period; + lman.NI_failCounter_limit = init_parameters->NI_failCounter_limit; + if (init_parameters->fastSearchParent_flag) { - gUnknown_3005E10.unk_0b = 1; + lman.fastSearchParent_flag = 1; } } -static void sub_80FD4E4(void) +static void rfu_LMAN_clearVariables(void) { u8 i; - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - gUnknown_3005E10.unk_06 = -1; - gUnknown_3005E10.unk_07 = 0; - gUnknown_3005E10.unk_10 = 0; - gUnknown_3005E10.unk_0c = 0; - gUnknown_3005E10.unk_24 = 0; - gUnknown_3005E10.unk_30 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; + lman.parent_child = MODE_NEUTRAL; + lman.pcswitch_flag = 0; + lman.child_slot = 0; + lman.connectSlot_flag_old = 0; + lman.nameAcceptTimer.active = 0; + lman.linkRecoveryTimer.active = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { - gUnknown_3005E10.unk_28[i] = 0; - gUnknown_3005E10.unk_34[i] = 0; + lman.nameAcceptTimer.count[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } -void sub_80FD52C(void) +void rfu_LMAN_powerDownRFU(void) { - gUnknown_3005E10.unk_04 = 0x15; + lman.state = LMAN_STATE_STOP_MODE; } -u8 sub_80FD538(u8 r5, u16 r7, u16 r8, const u16 *r6) +u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list) { u8 i; - const u16 *buffer; + u16 *serial_list; - if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 != 0x08 || r5 != 1)) + if (lman.state != LMAN_STATE_READY && (lman.state != LMAN_STATE_WAIT_RECV_CHILD_NAME || parent_child != 1)) { - gUnknown_3005E10.unk_14 = 1; - sub_80FE7F0(0xf3, 0x01); - return 1; + lman.param[0] = 1; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { - gUnknown_3005E10.unk_14 = 2; - sub_80FE7F0(0xf3, 0x01); - return 2; + lman.param[0] = 2; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_AGB_CLK_SLAVE; } - for (i = 0, buffer = r6; i < 16; i++) + for (i = 0, serial_list = acceptable_serialNo_list; i < 16; i++) { - if (*buffer++ == 0xFFFF) + if (*serial_list++ == 0xFFFF) { break; } } if (i == 16) { - gUnknown_3005E10.unk_14 = 4; - sub_80FE7F0(0xf3, 0x01); - return 4; + lman.param[0] = 4; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_ILLEGAL_PARAMETER; } - if (r5 > 1) + if (parent_child > 1) { - gUnknown_3005E10.unk_07 = 1; - r5 = 1; - r7 = 0; + lman.pcswitch_flag = 1; + parent_child = 1; + connect_period = 0; } else { - gUnknown_3005E10.unk_07 = 0; + lman.pcswitch_flag = 0; } - if (r5 != 0) + if (parent_child != 0) { - gUnknown_3005E10.unk_04 = 5; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } else { - gUnknown_3005E10.unk_04 = 9; - if (gUnknown_3005E10.unk_0b) + lman.state = LMAN_STATE_START_SEARCH_PARENT; + if (lman.fastSearchParent_flag) { - gUnknown_3005E10.unk_0b = 2; + lman.fastSearchParent_flag = 2; } } - gUnknown_3005E10.unk_06 = r5; - gUnknown_3005E10.unk_1a = r7; - gUnknown_3005E10.unk_26 = r8; - gUnknown_3005E10.unk_20 = r6; + lman.parent_child = parent_child; + lman.connect_period = connect_period; + lman.nameAcceptTimer.count_max = name_accept_period; + lman.acceptable_serialNo_list = acceptable_serialNo_list; return 0; } -u8 sub_80FD610(u16 parentId, u16 unk_1a) +u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period) { u8 i; - if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 < 9 || gUnknown_3005E10.unk_04 > 11)) + if (lman.state != LMAN_STATE_READY && (lman.state < 9 || lman.state > 11)) { - gUnknown_3005E10.unk_14 = 1; - sub_80FE7F0(0xF3, 0x01); - return 1; + lman.param[0] = 1; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { - gUnknown_3005E10.unk_14 = 2; - sub_80FE7F0(0xF3, 0x01); - return 2; + lman.param[0] = 2; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_AGB_CLK_SLAVE; } for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { @@ -196,546 +194,549 @@ u8 sub_80FD610(u16 parentId, u16 unk_1a) } if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount) { - gUnknown_3005E10.unk_14 = 3; - sub_80FE7F0(0xF3, 0x01); - return 3; + lman.param[0] = 3; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_PID_NOT_FOUND; } - if (gUnknown_3005E10.unk_04 == 0 || gUnknown_3005E10.unk_04 == 9) + if (lman.state == LMAN_STATE_READY || lman.state == LMAN_STATE_START_SEARCH_PARENT) { - gUnknown_3005E10.unk_04 = 12; - gUnknown_3005E10.unk_05 = 13; + lman.state = LMAN_STATE_START_CONNECT_PARENT; + lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } else { - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 12; + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_START_CONNECT_PARENT; } - gUnknown_3005E10.unk_1e = parentId; - gUnknown_3005E10.unk_1a = unk_1a; - if (gUnknown_3005E10.unk_07 != 0) + lman.work = parentId; + lman.connect_period = connect_period; + if (lman.pcswitch_flag != 0) { - gUnknown_3005E10.unk_07 = 7; + lman.pcswitch_flag = 7; } return 0; } -static void sub_80FD6F4(u8 lossSlot) +static void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot) { u8 i; - if (lossSlot & gUnknown_3005E10.unk_30) + if ((bm_targetSlot & lman.linkRecoveryTimer.active) == 0) + return; + lman.linkRecoveryTimer.active &= ~bm_targetSlot; + for (i = 0; i < RFU_CHILD_MAX; i++) { - gUnknown_3005E10.unk_30 &= ~lossSlot; - for (i = 0; i < RFU_CHILD_MAX; i++) - { - if ((lossSlot >> i) & 1) - { - gUnknown_3005E10.unk_34[i] = 0; - } - } - i = gRfuLinkStatus->linkLossSlotFlag & lossSlot; - if (i) + if ((bm_targetSlot >> i) & 1) { - sub_80FE818(i); + lman.linkRecoveryTimer.count[i] = 0; } - gUnknown_3005E10.unk_14 = i; - sub_80FE7F0(0x33, i); } + i = gRfuLinkStatus->linkLossSlotFlag & bm_targetSlot; + if (i) + { + rfu_LMAN_disconnect(i); + } + lman.param[0] = i; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, i); } -void sub_80FD760(bool8 a0) +void rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag) { - u8 r2; - - r2 = 0; - gUnknown_3005E10.unk_07 = 0; - if (a0) + u8 msg = 0; + lman.pcswitch_flag = 0; + if (forced_stop_and_RFU_reset_flag) { - sub_80FD4E4(); - gUnknown_3005E10.unk_04 = 23; + rfu_LMAN_clearVariables(); + lman.state = LMAN_FORCED_STOP_AND_RFU_RESET; + return; } - else + switch (lman.state) { - switch (gUnknown_3005E10.unk_04) - { - case 5: - gUnknown_3005E10.unk_04 = 8; - gUnknown_3005E10.unk_05 = 0; - r2 = 0x13; - break; - case 6: - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; - break; - case 7: - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; - break; - case 8: - break; - case 9: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x21; - break; - case 10: - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; - break; - case 11: - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; - break; - case 12: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x23; - break; - case 13: - gUnknown_3005E10.unk_04 = 14; - break; - case 14: - gUnknown_3005E10.unk_04 = 14; - break; - case 15: - break; - case 16: - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11; - gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12; - sub_80FE818(gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag; - sub_80FE7F0(0x33, 0x01); - return; - case 17: - gUnknown_3005E10.unk_04 = 18; - break; - case 18: - gUnknown_3005E10.unk_04 = 18; - break; - default: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x43; - break; - } - if (gUnknown_3005E10.unk_04 == 0) - { - sub_80FE7F0(r2, 0); - } + case LMAN_STATE_START_SEARCH_CHILD: + lman.state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED; + break; + case LMAN_STATE_POLL_SEARCH_CHILD: + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + break; + case LMAN_STATE_END_SEARCH_CHILD: + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + break; + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + break; + case LMAN_STATE_START_SEARCH_PARENT: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED; + break; + case LMAN_STATE_POLL_SEARCH_PARENT: + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; + break; + case LMAN_STATE_END_SEARCH_PARENT: + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; + break; + case LMAN_STATE_START_CONNECT_PARENT: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_CONNECT_PARENT_FAILED; + break; + case LMAN_STATE_POLL_CONNECT_PARENT: + lman.state = LMAN_STATE_END_CONNECT_PARENT; + break; + case LMAN_STATE_END_CONNECT_PARENT: + lman.state = LMAN_STATE_END_CONNECT_PARENT; + break; + case LMAN_STATE_SEND_CHILD_NAME: + break; + case LMAN_STATE_START_LINK_RECOVERY: + lman.state = lman.state_bak[0]; + lman.next_state = lman.state_bak[1]; + rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); + return; + case LMAN_STATE_POLL_LINK_RECOVERY: + lman.state = LMAN_STATE_END_LINK_RECOVERY; + break; + case LMAN_STATE_END_LINK_RECOVERY: + lman.state = LMAN_STATE_END_LINK_RECOVERY; + break; + default: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_MANAGER_STOPPED; + break; + } + if (lman.state == LMAN_STATE_READY) + { + rfu_LMAN_occureCallback(msg, 0); } } -static bool8 sub_80FD850(u16 reqCommandId) +static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID) { - bool8 retVal; u8 i; - u8 bmLinkLossSlot; - u8 linkLossReason; - u8 parentBmLinkRecoverySlot; - u8 flags; + u8 bm_linkLossSlot; + u8 reason; + u8 bm_linkRecoverySlot; + u8 bm_disconnectSlot; - retVal = FALSE; - rfu_REQBN_watchLink(reqCommandId, &bmLinkLossSlot, &linkLossReason, &parentBmLinkRecoverySlot); - if (bmLinkLossSlot) + bool8 disconnect_occure_flag = FALSE; + rfu_REQBN_watchLink(REQ_commandID, &bm_linkLossSlot, &reason, &bm_linkRecoverySlot); + if (bm_linkLossSlot) { - gUnknown_3005E10.unk_14 = bmLinkLossSlot; - gUnknown_3005E10.unk_16 = linkLossReason; - if (gUnknown_3005E10.unk_09) + lman.param[0] = bm_linkLossSlot; + lman.param[1] = reason; + if (lman.linkRecovery_enable) { - gUnknown_3005E10.unk_0a = 1; - if (gUnknown_3005E10.unk_06 == 0 && linkLossReason == REASON_DISCONNECTED) + lman.linkRecovery_start_flag = 1; + if (lman.parent_child == 0 && reason == REASON_DISCONNECTED) { - gUnknown_3005E10.unk_0a = 4; + lman.linkRecovery_start_flag = 4; } - if (gUnknown_3005E10.unk_0a == 1) + if (lman.linkRecovery_start_flag == 1) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((bmLinkLossSlot >> i) & 1) + if ((bm_linkLossSlot >> i) & 1) { - gUnknown_3005E10.unk_30 |= (1 << i); - gUnknown_3005E10.unk_34[i] = gUnknown_3005E10.unk_32; + lman.linkRecoveryTimer.active |= (1 << i); + lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max; } } - sub_80FE7F0(0x31, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY, 1); } else { - gUnknown_3005E10.unk_0a = 0; - sub_80FE818(bmLinkLossSlot); - retVal = TRUE; - sub_80FE7F0(0x33, 0x01); + lman.linkRecovery_start_flag = 0; + rfu_LMAN_disconnect(bm_linkLossSlot); + disconnect_occure_flag = TRUE; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } else { - sub_80FE818(bmLinkLossSlot); - retVal = TRUE; - sub_80FE7F0(0x30, 0x02); + rfu_LMAN_disconnect(bm_linkLossSlot); + disconnect_occure_flag = TRUE; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED, 2); } - sub_80FEAF4(); + rfu_LMAN_managerChangeAgbClockMaster(); } if (gRfuLinkStatus->parentChild == MODE_PARENT) { - if (parentBmLinkRecoverySlot) + if (bm_linkRecoverySlot) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_30 >> i) & 1 && (parentBmLinkRecoverySlot >> i) & 1) + if ((lman.linkRecoveryTimer.active >> i) & 1 && (bm_linkRecoverySlot >> i) & 1) { - gUnknown_3005E10.unk_34[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } - gUnknown_3005E10.unk_30 &= ~parentBmLinkRecoverySlot; - gUnknown_3005E10.unk_14 = parentBmLinkRecoverySlot; - sub_80FE7F0(0x32, 0x01); + lman.linkRecoveryTimer.active &= ~bm_linkRecoverySlot; + lman.param[0] = bm_linkRecoverySlot; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_SUCCESSED, 1); } - if (gUnknown_3005E10.unk_30) + if (lman.linkRecoveryTimer.active) { - flags = 0; + bm_disconnectSlot = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_30 >> i) & 1 && gUnknown_3005E10.unk_34[i] && --gUnknown_3005E10.unk_34[i] == 0) + if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0) { - gUnknown_3005E10.unk_30 &= ~(1 << i); - flags |= (1 << i); + lman.linkRecoveryTimer.active &= ~(1 << i); + bm_disconnectSlot |= (1 << i); } } - if (flags) + if (bm_disconnectSlot) { - sub_80FE818(flags); - retVal = TRUE; - gUnknown_3005E10.unk_14 = flags; - sub_80FE7F0(0x33, 0x01); + rfu_LMAN_disconnect(bm_disconnectSlot); + disconnect_occure_flag = TRUE; + lman.param[0] = bm_disconnectSlot; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } - if (!gUnknown_3005E10.unk_30) + if (!lman.linkRecoveryTimer.active) { - gUnknown_3005E10.unk_0a = 0; + lman.linkRecovery_start_flag = 0; } } - return retVal; + return disconnect_occure_flag; } -void LinkRfu_syncVBlank_(void) +void rfu_LMAN_syncVBlank(void) { if (rfu_syncVBlank()) { - sub_80FE7F0(0xF1, 0x00); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_WATCH_DOG_TIMER_ERROR, 0); + rfu_LMAN_managerChangeAgbClockMaster(); } } -void sub_80FDA30(u32 a0) +void rfu_LMAN_manager_entity(u32 rand) { - u8 r2; + u8 msg; - if (gUnknown_3005E10.unk_40 == NULL && gUnknown_3005E10.unk_04 != 0) + if (lman.LMAN_callback == NULL && lman.state != LMAN_STATE_READY) { - gUnknown_3005E10.unk_04 = 0; + lman.state = LMAN_STATE_READY; + return; } - else + if (lman.pcswitch_flag) { - if (gUnknown_3005E10.unk_07 != 0) - { - sub_80FDC28(a0); - } - do + rfu_LMAN_settingPCSWITCH(rand); + } + while (1) + { + if (lman.state != LMAN_STATE_READY) { - if (gUnknown_3005E10.unk_04 != 0) + rfu_waitREQComplete(); + lman.active = 1; + switch (lman.state) { - rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = 1; - switch (gUnknown_3005E10.unk_04) + case LMAN_FORCED_STOP_AND_RFU_RESET: + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { - case 23: - r2 = sub_80FD3A4() == RFU_ID ? 0x44 : 0xFF; - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(r2, 0); - break; - case 1: - if (sub_80FD3A4() == RFU_ID) - { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 3; - } - else - { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0xFF, 0); - } - break; - case 2: - rfu_REQ_reset(); - break; - case 3: - rfu_REQ_configSystem(gUnknown_3005E10.unk_3c->availSlotFlag, gUnknown_3005E10.unk_3c->maxMFrame, gUnknown_3005E10.unk_3c->mcTimer); - break; - case 4: - rfu_REQ_configGameData(gUnknown_3005E10.unk_3c->mbootFlag, gUnknown_3005E10.unk_3c->serialNo, (const u8 *)gUnknown_3005E10.unk_3c->gname, gUnknown_3005E10.unk_3c->uname); - break; - case 5: - rfu_REQ_startSearchChild(); - break; - case 6: - rfu_REQ_pollSearchChild(); - break; - case 7: - rfu_REQ_endSearchChild(); - break; - case 8: - break; - case 9: - rfu_REQ_startSearchParent(); - break; - case 10: - rfu_REQ_pollSearchParent(); - break; - case 11: - rfu_REQ_endSearchParent(); - break; - case 12: - rfu_REQ_startConnectParent(gUnknown_3005E10.unk_1e); - break; - case 13: - rfu_REQ_pollConnectParent(); - break; - case 14: - rfu_REQ_endConnectParent(); - break; - case 15: - break; - case 16: - rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); - break; - case 17: - rfu_REQ_CHILD_pollConnectRecovery(); - break; - case 18: - rfu_REQ_CHILD_endConnectRecovery(); - break; - case 19: - rfu_REQ_changeMasterSlave(); - break; - case 20: - break; - case 21: - rfu_REQ_stopMode(); - break; - case 22: - break; + msg=LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET; } - rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = 0; + else + { + msg=LMAN_MSG_RFU_FATAL_ERROR; + } + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(msg, 0); + break; + case LMAN_STATE_SOFT_RESET_AND_CHECK_ID: + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) + { + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_CONFIG_SYSTEM; + } + else + { + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_RFU_FATAL_ERROR, 0); + } + break; + case LMAN_STATE_RESET: + rfu_REQ_reset(); + break; + case LMAN_STATE_CONFIG_SYSTEM: + rfu_REQ_configSystem(lman.init_param->availSlot_flag, lman.init_param->maxMFrame, lman.init_param->MC_TimerCount); + break; + case LMAN_STATE_CONFIG_GAME_DATA: + rfu_REQ_configGameData(lman.init_param->mboot_flag, lman.init_param->serialNo, (const u8 *)lman.init_param->gameName, lman.init_param->userName); + break; + case LMAN_STATE_START_SEARCH_CHILD: + rfu_REQ_startSearchChild(); + break; + case LMAN_STATE_POLL_SEARCH_CHILD: + rfu_REQ_pollSearchChild(); + break; + case LMAN_STATE_END_SEARCH_CHILD: + rfu_REQ_endSearchChild(); + break; + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + break; + case LMAN_STATE_START_SEARCH_PARENT: + rfu_REQ_startSearchParent(); + break; + case LMAN_STATE_POLL_SEARCH_PARENT: + rfu_REQ_pollSearchParent(); + break; + case LMAN_STATE_END_SEARCH_PARENT: + rfu_REQ_endSearchParent(); + break; + case LMAN_STATE_START_CONNECT_PARENT: + rfu_REQ_startConnectParent(lman.work); + break; + case LMAN_STATE_POLL_CONNECT_PARENT: + rfu_REQ_pollConnectParent(); + break; + case LMAN_STATE_END_CONNECT_PARENT: + rfu_REQ_endConnectParent(); + break; + case LMAN_STATE_SEND_CHILD_NAME: + break; + case LMAN_STATE_START_LINK_RECOVERY: + rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); + break; + case LMAN_STATE_POLL_LINK_RECOVERY: + rfu_REQ_CHILD_pollConnectRecovery(); + break; + case LMAN_STATE_END_LINK_RECOVERY: + rfu_REQ_CHILD_endConnectRecovery(); + break; + case LMAN_STATE_MS_CHANGE: + rfu_REQ_changeMasterSlave(); + break; + case LMAN_STATE_WAIT_CLOCK_MASTER: + break; + case LMAN_STATE_STOP_MODE: + rfu_REQ_stopMode(); + break; + case LMAN_STATE_BACK_STATE: + break; + default: + break; } - } while (gUnknown_3005E10.unk_04 == 18 || gUnknown_3005E10.unk_04 == 19); - if (gRfuLinkStatus->parentChild != MODE_PARENT || !sub_80FD850(0)) - { - sub_80FE418(); - sub_80FE63C(); - sub_80FE74C(); - sub_80FE918(); + rfu_waitREQComplete(); + lman.active = 0; } + if (lman.state == LMAN_STATE_END_LINK_RECOVERY || lman.state == LMAN_STATE_MS_CHANGE) + ; + else + break; + } + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + if (rfu_LMAN_linkWatcher(0)) + return; } + rfu_LMAN_PARENT_checkRecvChildName(); + rfu_LMAN_CHILD_checkSendChildName(); + rfu_LMAN_CHILD_linkRecoveryProcess(); + rfu_LMAN_checkNICommunicateStatus(); } -static void sub_80FDC28(u32 a0) +static void rfu_LMAN_settingPCSWITCH(u32 rand) { - if (gUnknown_3005E10.unk_07 == 5) + if (lman.pcswitch_flag == 5) { - gUnknown_3005E10.unk_06 = 1; - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c; - if (gUnknown_3005E10.unk_1a) + lman.parent_child = MODE_PARENT; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.connect_period = lman.pcswitch_period_bak; + if (lman.connect_period) { - gUnknown_3005E10.unk_07 = 6; + lman.pcswitch_flag = 6; } else { - gUnknown_3005E10.unk_07 = 1; + lman.pcswitch_flag = 1; } } - if (gUnknown_3005E10.unk_07 == 1) + if (lman.pcswitch_flag == 1) { - gUnknown_3005E10.unk_06 = 1; - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_1a = a0 % 140; - gUnknown_3005E10.unk_1c = 140 - gUnknown_3005E10.unk_1a; - if (gUnknown_3005E10.unk_1a) + lman.parent_child = MODE_PARENT; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.connect_period = rand % 140; + lman.pcswitch_period_bak = 140 - lman.connect_period; + if (lman.connect_period) { - gUnknown_3005E10.unk_07 = 2; + lman.pcswitch_flag = 2; } else { - gUnknown_3005E10.unk_07 = 3; + lman.pcswitch_flag = 3; } } - if (gUnknown_3005E10.unk_07 == 3) + if (lman.pcswitch_flag == 3) { - gUnknown_3005E10.unk_06 = 0; - gUnknown_3005E10.unk_1a = 40; - gUnknown_3005E10.unk_07 = 4; - gUnknown_3005E10.unk_04 = 9; + lman.parent_child = MODE_CHILD; + lman.connect_period = 40; + lman.pcswitch_flag = 4; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } } -static void sub_80FDC98(u16 reqCommandId, u16 reqResult) +static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult) { - u8 sp0; - register u8 *stwiRecvBuffer asm("r0"); - u8 *tmp; + u8 status; + u8 *stwiRecvBuffer; u8 i; - if (gUnknown_3005E10.unk_0e != 0) + if (lman.active != 0) { - gUnknown_3005E10.unk_0e = 0; + lman.active = 0; switch (reqCommandId) { case ID_RESET_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 4; + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_CONFIG_GAME_DATA; } break; case ID_SYSTEM_CONFIG_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_READY; } break; case ID_GAME_CONFIG_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x00, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_INITIALIZE_COMPLETED, 0); } break; case ID_SC_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 6; + lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_CHILD; } break; case ID_SC_POLL_REQ: - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; } break; case ID_SC_END_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 0; - if (gUnknown_3005E10.unk_07 == 0) + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_READY; + if (lman.pcswitch_flag == 0) { - sub_80FE7F0(0x13, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED, 0); } } break; case ID_SP_START_REQ: if (reqResult == 0) { - if (gUnknown_3005E10.unk_0b == 1 && gUnknown_3005E10.unk_1a > 1) + if (lman.fastSearchParent_flag == 1 && lman.connect_period > 1) { - gUnknown_3005E10.unk_1a--; + lman.connect_period--; } - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 10; + lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_PARENT; } break; case ID_SP_POLL_REQ: if (reqResult == 0) { - sp0 = sub_80FE778(); - gUnknown_3005E10.unk_14 = sp0; - if (sp0) + status = rfu_LMAN_CHILD_checkEnableParentCandidate(); + lman.param[0] = status; + if (status) { - sub_80FE7F0(0x20, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_PARENT_FOUND, 1); } - if (gUnknown_3005E10.unk_0b && gUnknown_3005E10.unk_1a != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX) + if (lman.fastSearchParent_flag && lman.connect_period != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX) { rfu_REQ_endSearchParent(); rfu_waitREQComplete(); - gUnknown_3005E10.unk_04 = 9; - gUnknown_3005E10.unk_0b = 1; + lman.state = LMAN_STATE_START_SEARCH_PARENT; + lman.fastSearchParent_flag = 1; } } - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; } break; case ID_SP_END_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - if (gUnknown_3005E10.unk_07 == 0) + lman.state = lman.next_state; + if (lman.pcswitch_flag == 0) { - if (gUnknown_3005E10.unk_04 == 0) + if (lman.state == LMAN_STATE_READY) { - sub_80FE7F0(0x21, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED, 0); } } - else if (gUnknown_3005E10.unk_07 != 7) + else if (lman.pcswitch_flag != 7) { - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_07 = 5; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.pcswitch_flag = 5; } } break; case ID_CP_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 13; + lman.state = lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } break; case ID_CP_POLL_REQ: - if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10) && !sp0) + if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot) && !status) { - gUnknown_3005E10.unk_04 = 14; + lman.state = LMAN_STATE_END_CONNECT_PARENT; } - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 14; + lman.state = LMAN_STATE_END_CONNECT_PARENT; } break; case ID_CP_END_REQ: - if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10)) + if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot)) { - if (!sp0) + if (!status) { - gUnknown_3005E10.unk_04 = 19; - gUnknown_3005E10.unk_05 = 15; - gUnknown_3005E10.unk_1e = 0x22; - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_10; + lman.state = LMAN_STATE_MS_CHANGE; + lman.next_state = LMAN_STATE_SEND_CHILD_NAME; + lman.work = 0x22; + lman.param[0] = lman.child_slot; } else { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_1e = 0x23; - gUnknown_3005E10.unk_14 = sp0; - if (gUnknown_3005E10.unk_07) + lman.state = lman.next_state = LMAN_STATE_READY; + lman.work = 0x23; + lman.param[0] = status; + if (lman.pcswitch_flag) { - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } } - sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01); - gUnknown_3005E10.unk_1e = 0; + rfu_LMAN_occureCallback(lman.work, 0x01); + lman.work = 0; } break; case ID_CPR_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag; - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 17; - for (gUnknown_3005E10.unk_10 = 0; gUnknown_3005E10.unk_10 < RFU_CHILD_MAX; gUnknown_3005E10.unk_10++) + lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; + lman.state = lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; + for (lman.child_slot = 0; lman.child_slot < RFU_CHILD_MAX; lman.child_slot++) { - if ((gRfuLinkStatus->linkLossSlotFlag >> gUnknown_3005E10.unk_10) & 1) + if ((gRfuLinkStatus->linkLossSlotFlag >> lman.child_slot) & 1) { break; } @@ -743,64 +744,63 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) } break; case ID_CPR_POLL_REQ: - if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0) && sp0 < 2) + if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status) && status < 2) { - gUnknown_3005E10.unk_04 = 18; + lman.state = LMAN_STATE_END_LINK_RECOVERY; } - if (gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] && --gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] == 0) + if (lman.linkRecoveryTimer.count[lman.child_slot] && --lman.linkRecoveryTimer.count[lman.child_slot] == 0) { - gUnknown_3005E10.unk_04 = 18; + lman.state = LMAN_STATE_END_LINK_RECOVERY; } break; case ID_CPR_END_REQ: - if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0)) + if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status)) { - if (!sp0) + if (!status) { - gUnknown_3005E10.unk_04 = 19; - gUnknown_3005E10.unk_05 = 22; - gUnknown_3005E10.unk_1e = 0x32; + lman.state = LMAN_STATE_MS_CHANGE; + lman.next_state = LMAN_STATE_BACK_STATE; + lman.work = 0x32; } else { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE818(gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_1e = 0x33; + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); + lman.work = 0x33; } - gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] = 0; - gUnknown_3005E10.unk_30 = 0; - gUnknown_3005E10.unk_0a = 0; - sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01); - gUnknown_3005E10.unk_1e = 0; + lman.linkRecoveryTimer.count[lman.child_slot] = 0; + lman.linkRecoveryTimer.active = 0; + lman.linkRecovery_start_flag = 0; + rfu_LMAN_occureCallback(lman.work, 0x01); + lman.work = 0; } break; case ID_MS_CHANGE_REQ: if (reqResult == 0) { - if (gUnknown_3005E10.unk_05 == 22) + if (lman.next_state == LMAN_STATE_BACK_STATE) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11; - gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12; - gUnknown_3005E10.unk_02 = 1; - sub_80FE7F0(0x41, 0x00); + lman.state = lman.state_bak[0]; + lman.next_state = lman.state_bak[1]; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); } - else if (gUnknown_3005E10.unk_05 == 15) + else if (lman.next_state == LMAN_STATE_SEND_CHILD_NAME) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_02 = 1; - sub_80FE7F0(0x41, 0x00); - gUnknown_3005E10.unk_24 |= 1 << gUnknown_3005E10.unk_10; - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = gUnknown_3005E10.unk_26; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - tmp = &sp0; - *tmp = rfu_NI_CHILD_setSendGameName(gUnknown_3005E10.unk_10, 0x0e); - if (*tmp) + lman.state = lman.next_state; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); + lman.nameAcceptTimer.active |= 1 << lman.child_slot; + lman.nameAcceptTimer.count[lman.child_slot] = lman.nameAcceptTimer.count_max; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + status = rfu_NI_CHILD_setSendGameName(lman.child_slot, 0x0e); + if (status) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FEAF4(); - sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = sp0; - sub_80FE7F0(0x25, 0x01); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_managerChangeAgbClockMaster(); + rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = status; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } @@ -808,24 +808,24 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) case ID_STOP_MODE_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x42, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_RFU_POWER_DOWN, 0); } break; } - gUnknown_3005E10.unk_0e = 1; + lman.active = 1; } - else if (reqResult == 3 && gUnknown_3005E10.unk_0f && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ)) + else if (reqResult == 3 && lman.msc_exe_flag && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ)) { rfu_REQ_RFUStatus(); rfu_waitREQComplete(); - rfu_getRFUStatus(&sp0); - if (sp0 == 0 && gRfuLinkStatus->parentChild == MODE_CHILD) + rfu_getRFUStatus(&status); + if (status == 0 && gRfuLinkStatus->parentChild == MODE_CHILD) { - stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data; - stwiRecvBuffer[4] = gRfuLinkStatus->connSlotFlag; - stwiRecvBuffer[5] = 1; - sub_80FD850(0x29); + stwiRecvBuffer = rfu_getSTWIRecvBuffer() + 4; + *stwiRecvBuffer++ = gRfuLinkStatus->connSlotFlag; + *stwiRecvBuffer = REASON_LINK_LOSS; + rfu_LMAN_linkWatcher(ID_DISCONNECTED_AND_CHANGE_REQ); reqResult = 0; } } @@ -834,339 +834,338 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) case ID_DISCONNECT_REQ: if (reqResult == 0) { - stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data; - gUnknown_3005E10.unk_14 = stwiRecvBuffer[8]; - sub_80FE83C(gUnknown_3005E10.unk_14); - if (gUnknown_3005E10.unk_30) + lman.param[0] = *(rfu_getSTWIRecvBuffer() + 8); + rfu_LMAN_reflectCommunicationStatus(lman.param[0]); + if (lman.linkRecoveryTimer.active) { - gUnknown_3005E10.unk_30 &= ~gUnknown_3005E10.unk_14; + lman.linkRecoveryTimer.active &= ~lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_14 >> i) & 1) + if ((lman.param[0] >> i) & 1) { - gUnknown_3005E10.unk_34[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } - if (gUnknown_3005E10.unk_06 == 0) + if (lman.parent_child == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } } - sp0 = gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14; + status = lman.acceptSlot_flag & lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((sp0 >> i) & 1 && gUnknown_3005E10.unk_01) + if ((status >> i) & 1 && lman.acceptCount) { - gUnknown_3005E10.unk_01--; + lman.acceptCount--; } } - gUnknown_3005E10.unk_00 &= ~gUnknown_3005E10.unk_14; - if (gUnknown_3005E10.unk_07) + lman.acceptSlot_flag &= ~lman.param[0]; + if (lman.pcswitch_flag) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { - if (gUnknown_3005E10.unk_07 == 8) + if (lman.pcswitch_flag == 8) { - gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c; - gUnknown_3005E10.unk_07 = 6; - gUnknown_3005E10.unk_04 = 6; + lman.connect_period = lman.pcswitch_period_bak; + lman.pcswitch_flag = 6; + lman.state = LMAN_STATE_POLL_SEARCH_CHILD; } - else if (gUnknown_3005E10.unk_04 != 6 && gUnknown_3005E10.unk_04 != 7) + else if (lman.state != LMAN_STATE_POLL_SEARCH_CHILD && lman.state != LMAN_STATE_END_SEARCH_CHILD) { - gUnknown_3005E10.unk_07 = 1; - gUnknown_3005E10.unk_04 = 5; + lman.pcswitch_flag = 1; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { - if (gUnknown_3005E10.unk_04 == 0) + if (lman.state == LMAN_STATE_READY) { - gUnknown_3005E10.unk_06 = -1; + lman.parent_child = MODE_NEUTRAL; } } - if (gUnknown_3005E10.unk_0e == 0) + if (lman.active == 0) { - sub_80FE7F0(0x40, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_LINK_DISCONNECTED_BY_USER, 1); } } break; case ID_DATA_RX_REQ: - sub_80FE6F0(); + rfu_LMAN_CHILD_checkSendChildName2(); if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { - sub_80FE7F0(0x50, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_RECV_DATA_REQ_COMPLETED, 0); } break; case ID_RESET_REQ: case ID_STOP_MODE_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_0d = 0; - gUnknown_3005E10.unk_01 = 0; - gUnknown_3005E10.unk_00 = 0;; - gUnknown_3005E10.unk_06 = -1; - sub_80FEAF4(); - if (reqCommandId == 61) + lman.reserveDisconnectSlot_flag = 0; + lman.acceptCount = 0; + lman.acceptSlot_flag = 0;; + lman.parent_child = MODE_NEUTRAL; + rfu_LMAN_managerChangeAgbClockMaster(); + if (reqCommandId == ID_STOP_MODE_REQ) { - sub_80FD484(); + rfu_LMAN_endManager(); } } break; } if (reqResult != 0) { - if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && gUnknown_3005E10.unk_07 == 4) + if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && lman.pcswitch_flag == 4) { gRfuLinkStatus->parentChild = MODE_PARENT; gRfuLinkStatus->connSlotFlag = 0xF; - sub_80FE818(15); + rfu_LMAN_disconnect(15); rfu_waitREQComplete(); return; } else { - gUnknown_3005E10.unk_14 = reqCommandId; - gUnknown_3005E10.unk_16 = reqResult; - if (gUnknown_3005E10.unk_0e) + lman.param[0] = reqCommandId; + lman.param[1] = reqResult; + if (lman.active) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } - sub_80FE7F0(0xf0, 0x02); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_REQ_API_ERROR, 2); + rfu_LMAN_managerChangeAgbClockMaster(); } } if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { - sub_80FE7F0(0xf2, 0x00); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA, 0); + rfu_LMAN_managerChangeAgbClockMaster(); } } -static void sub_80FE394(u16 reqCommandId) +static void rfu_LMAN_MSC_callback(u16 reqCommandId) { - u8 r7; - u8 ackFlag; + u8 active_bak; + u8 thisAck_flag; - r7 = gUnknown_3005E10.unk_0e; - gUnknown_3005E10.unk_0e = 0; - gUnknown_3005E10.unk_0f = 1; + active_bak = lman.active; + lman.active = 0; + lman.msc_exe_flag = 1; if (gRfuLinkStatus->parentChild == MODE_CHILD) { - sub_80FD850(reqCommandId); - if (gUnknown_3005E10.unk_02 != 1) + rfu_LMAN_linkWatcher(reqCommandId); + if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_ON) { - sub_80FEAF4(); - gUnknown_3005E10.unk_0f = 0; - gUnknown_3005E10.unk_0e = r7; + rfu_LMAN_managerChangeAgbClockMaster(); + lman.msc_exe_flag = 0; + lman.active = active_bak; return; } } else { - if (!rfu_UNI_PARENT_getDRAC_ACK(&ackFlag)) + if (!rfu_UNI_PARENT_getDRAC_ACK(&thisAck_flag)) { - gUnknown_3005E10.unk_03 |= ackFlag; + lman.parentAck_flag |= thisAck_flag; } } - if (gUnknown_3005E10.unk_44 != NULL) + if (lman.MSC_callback != NULL) { - gUnknown_3005E10.unk_44(reqCommandId); + lman.MSC_callback(reqCommandId); rfu_waitREQComplete(); - if (gUnknown_3005E10.unk_02 == 2) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF_REQ) { - sub_80FEAF4(); + rfu_LMAN_managerChangeAgbClockMaster(); } } - gUnknown_3005E10.unk_0f = 0; - gUnknown_3005E10.unk_0e = r7; + lman.msc_exe_flag = 0; + lman.active = active_bak; } -static void sub_80FE418(void) +static void rfu_LMAN_PARENT_checkRecvChildName(void) { - u8 flags; - u8 sp0; + u8 newSlot; + u8 newAcceptSlot; u8 i; - u8 r5; - u8 r4; + u8 flags; + u8 tgtSlot; const u16 *ptr; - if (gUnknown_3005E10.unk_04 == 5 || gUnknown_3005E10.unk_04 == 6 || gUnknown_3005E10.unk_04 == 7 || gUnknown_3005E10.unk_04 == 8) + if (lman.state == LMAN_STATE_START_SEARCH_CHILD || lman.state == LMAN_STATE_POLL_SEARCH_CHILD || lman.state == LMAN_STATE_END_SEARCH_CHILD || lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { - flags = ((gRfuLinkStatus->connSlotFlag ^ gUnknown_3005E10.unk_0c) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; - gUnknown_3005E10.unk_0c = gRfuLinkStatus->connSlotFlag; - if (flags) + newSlot = ((gRfuLinkStatus->connSlotFlag ^ lman.connectSlot_flag_old) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; + lman.connectSlot_flag_old = gRfuLinkStatus->connSlotFlag; + if (newSlot) { - gUnknown_3005E10.unk_14 = flags; - sub_80FE7F0(0x10, 0x01); + lman.param[0] = newSlot; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_DETECTED, 1); } - sp0 = 0x00; + newAcceptSlot = 0x00; for (i = 0; i < RFU_CHILD_MAX; i++) { - r4 = 1 << i; - r5 = 0x00; - if (flags & r4) + tgtSlot = 1 << i; + flags = 0x00; + if (newSlot & tgtSlot) { - gUnknown_3005E10.unk_28[i] = gUnknown_3005E10.unk_26; - gUnknown_3005E10.unk_24 |= r4; + lman.nameAcceptTimer.count[i] = lman.nameAcceptTimer.count_max; + lman.nameAcceptTimer.active |= tgtSlot; } - else if (gUnknown_3005E10.unk_24 & r4) + else if (lman.nameAcceptTimer.active & tgtSlot) { if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS) { if (gRfuSlotStatusNI[i]->recv.dataType == 1) // Game identification information { - r5 = 0x02; - for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++) + flags = 0x02; + for (ptr = lman.acceptable_serialNo_list; *ptr != 0xFFFF; ptr++) { if (gRfuLinkStatus->partner[i].serialNo == *ptr) { - gUnknown_3005E10.unk_00 |= r4; - gUnknown_3005E10.unk_01++; - sp0 |= r4; - r5 |= 0x01; + lman.acceptSlot_flag |= tgtSlot; + lman.acceptCount++; + newAcceptSlot |= tgtSlot; + flags |= 0x01; break; } } - if (!(r5 & 0x01)) + if (!(flags & 0x01)) { - r5 |= 0x04; + flags |= 0x04; } } } - else if (--gUnknown_3005E10.unk_28[i] == 0) + else if (--lman.nameAcceptTimer.count[i] == 0) { - r5 = 0x06; + flags = 0x06; } - if (r5 & 0x02) + if (flags & 0x02) { - gUnknown_3005E10.unk_24 &= ~r4; - gUnknown_3005E10.unk_28[i] = 0; + lman.nameAcceptTimer.active &= ~tgtSlot; + lman.nameAcceptTimer.count[i] = 0; rfu_clearSlot(TYPE_NI_RECV, i); } - if (r5 & 0x04) + if (flags & 0x04) { - gUnknown_3005E10.unk_0d |= r4; + lman.reserveDisconnectSlot_flag |= tgtSlot; } } } - if (sp0) + if (newAcceptSlot) { - gUnknown_3005E10.unk_14 = sp0; - sub_80FE7F0(0x11, 0x01); + lman.param[0] = newAcceptSlot; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED, 1); } - if (gUnknown_3005E10.unk_0d) + if (lman.reserveDisconnectSlot_flag) { - r5 = 0x01; - if (gRfuLinkStatus->sendSlotUNIFlag && ((gUnknown_3005E10.unk_03 & gUnknown_3005E10.unk_00) != gUnknown_3005E10.unk_00)) + flags = 0x01; + if (gRfuLinkStatus->sendSlotUNIFlag && ((lman.parentAck_flag & lman.acceptSlot_flag) != lman.acceptSlot_flag)) { - r5 = 0x00; + flags = 0x00; } - if (r5) + if (flags) { - sub_80FE818(gUnknown_3005E10.unk_0d); - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_0d; - gUnknown_3005E10.unk_0d = 0; - sub_80FE7F0(0x12, 0x01); + rfu_LMAN_disconnect(lman.reserveDisconnectSlot_flag); + lman.param[0] = lman.reserveDisconnectSlot_flag; + lman.reserveDisconnectSlot_flag = 0; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_REJECTED, 1); } } - if (gUnknown_3005E10.unk_24 == 0 && gUnknown_3005E10.unk_04 == 8) + if (lman.nameAcceptTimer.active == 0 && lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { - if (gUnknown_3005E10.unk_07 == 0) + if (lman.pcswitch_flag == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x14, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_END_WAIT_CHILD_NAME, 0); } else { - if (gUnknown_3005E10.unk_07 == 2) + if (lman.pcswitch_flag == 2) { - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } else { - gUnknown_3005E10.unk_07 = 1; - gUnknown_3005E10.unk_04 = 5; + lman.pcswitch_flag = 1; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } - if (gUnknown_3005E10.unk_00) + if (lman.acceptSlot_flag) { - gUnknown_3005E10.unk_1a = 0; - gUnknown_3005E10.unk_07 = 8; - gUnknown_3005E10.unk_04 = 5; + lman.connect_period = 0; + lman.pcswitch_flag = 8; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } } } -static void sub_80FE63C(void) +static void rfu_LMAN_CHILD_checkSendChildName(void) { u16 imeBak = REG_IME; REG_IME = 0; - if (gUnknown_3005E10.unk_04 == 15) + if (lman.state == LMAN_STATE_SEND_CHILD_NAME) { - if (--gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] == 0 || gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_FAILED) + if (--lman.nameAcceptTimer.count[lman.child_slot] == 0 || gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_FAILED) { - sub_80FEB14(); - gUnknown_3005E10.unk_04 = 24; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0; + rfu_LMAN_requestChangeAgbClockMaster(); + lman.state = LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); + lman.nameAcceptTimer.count[lman.child_slot] = 0; } } REG_IME = imeBak; - if (gUnknown_3005E10.unk_04 == 24) + if (lman.state == LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER) { - if (gUnknown_3005E10.unk_02 == 1) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); } - if (gUnknown_3005E10.unk_02 == 0) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = 0; - sub_80FE7F0(0x25, 0x01); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = 0; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } -static void sub_80FE6F0(void) +static void rfu_LMAN_CHILD_checkSendChildName2(void) { - if (gUnknown_3005E10.unk_04 == 15 && gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_SUCCESS) + if (lman.state == LMAN_STATE_SEND_CHILD_NAME && gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0; - sub_80FE7F0(0x24, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); + lman.nameAcceptTimer.count[lman.child_slot] = 0; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_COMPLETED, 0); } } -static void sub_80FE74C(void) +static void rfu_LMAN_CHILD_linkRecoveryProcess(void) { - if (gUnknown_3005E10.unk_06 == 0 && gUnknown_3005E10.unk_0a == 1) + if (lman.parent_child == 0 && lman.linkRecovery_start_flag == 1) { - gUnknown_3005E10.unk_11 = gUnknown_3005E10.unk_04; - gUnknown_3005E10.unk_12 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_04 = 16; - gUnknown_3005E10.unk_05 = 17; - gUnknown_3005E10.unk_0a = 2; + lman.state_bak[0] = lman.state; + lman.state_bak[1] = lman.next_state; + lman.state = LMAN_STATE_START_LINK_RECOVERY; + lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; + lman.linkRecovery_start_flag = 2; } } -static u8 sub_80FE778(void) +static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void) { u8 i; - const u16 *ptr; + u16 *serialNo; u8 flags = 0x00; for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { - for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++) + for (serialNo = lman.acceptable_serialNo_list; *serialNo != 0xFFFF; serialNo++) { - if (gRfuLinkStatus->partner[i].serialNo == *ptr) + if (gRfuLinkStatus->partner[i].serialNo == *serialNo) { flags |= (1 << i); } @@ -1175,25 +1174,25 @@ static u8 sub_80FE778(void) return flags; } -static void sub_80FE7F0(u8 a0, u8 a1) +static void rfu_LMAN_occureCallback(u8 msg, u8 param_count) { - if (gUnknown_3005E10.unk_40 != NULL) + if (lman.LMAN_callback != NULL) { - gUnknown_3005E10.unk_40(a0, a1); + lman.LMAN_callback(msg, param_count); } - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_16 = 0; + lman.param[0] = lman.param[1] = 0; } -static void sub_80FE818(u8 a0) +static void rfu_LMAN_disconnect(u8 bm_disconnectedSlot) { - u8 unk_0e_bak = gUnknown_3005E10.unk_0e; - gUnknown_3005E10.unk_0e = 1; - rfu_REQ_disconnect(a0); + u8 active_bak = lman.active; + lman.active = 1; + rfu_REQ_disconnect(bm_disconnectedSlot); rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = unk_0e_bak; + lman.active = active_bak; } -static void sub_80FE83C(u8 a0) +static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot) { u8 i; @@ -1201,9 +1200,9 @@ static void sub_80FE83C(u8 a0) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & a0) + if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & bm_disconnectedSlot) { - rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~a0); + rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~bm_disconnectedSlot); } } } @@ -1211,7 +1210,7 @@ static void sub_80FE83C(u8 a0) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & a0) + if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & bm_disconnectedSlot) { rfu_NI_stopReceivingData(i); } @@ -1219,24 +1218,24 @@ static void sub_80FE83C(u8 a0) } if (gRfuLinkStatus->sendSlotUNIFlag) { - gRfuLinkStatus->sendSlotUNIFlag &= ~a0; + gRfuLinkStatus->sendSlotUNIFlag &= ~bm_disconnectedSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && a0 & gRfuSlotStatusUNI[i]->send.bmSlot) + if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && bm_disconnectedSlot & gRfuSlotStatusUNI[i]->send.bmSlot) { - gRfuSlotStatusUNI[i]->send.bmSlot &= ~a0; + gRfuSlotStatusUNI[i]->send.bmSlot &= ~bm_disconnectedSlot; } } } } -static void sub_80FE918(void) +static void rfu_LMAN_checkNICommunicateStatus(void) { u8 i; u8 j; u8 flags; - if (gUnknown_3005E10.unk_18) + if (lman.NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag) { @@ -1247,7 +1246,7 @@ static void sub_80FE918(void) flags = 0; for (j = 0; j < RFU_CHILD_MAX; j++) { - if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > gUnknown_3005E10.unk_18) + if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > lman.NI_failCounter_limit) { flags |= (1 << j); } @@ -1263,7 +1262,7 @@ static void sub_80FE918(void) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > gUnknown_3005E10.unk_18) + if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > lman.NI_failCounter_limit) { rfu_NI_stopReceivingData(i); } @@ -1272,109 +1271,109 @@ static void sub_80FE918(void) } } -void sub_80FEA10(void (*func)(u16)) +void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)) { - gUnknown_3005E10.unk_44 = func; - rfu_setMSCCallback(sub_80FE394); + lman.MSC_callback = MSC_callback_p; + rfu_setMSCCallback(rfu_LMAN_MSC_callback); } -static void sub_80FEA28(void (*func)(u8, u8)) +static void rfu_LMAN_setLMANCallback(void (*func)(u8, u8)) { - gUnknown_3005E10.unk_40 = func; + lman.LMAN_callback = func; } -u8 sub_80FEA34(u8 a0, u16 a1) +u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period) { u16 imeBak; - if (gUnknown_3005E10.unk_09 && a0 == 0 && gUnknown_3005E10.unk_30) + if (lman.linkRecovery_enable && enable_flag == 0 && lman.linkRecoveryTimer.active) { - return 5; + return LMAN_ERROR_NOW_LINK_RECOVERY; } imeBak = REG_IME; REG_IME = 0; - gUnknown_3005E10.unk_09 = a0; - gUnknown_3005E10.unk_32 = a1; + lman.linkRecovery_enable = enable_flag; + lman.linkRecoveryTimer.count_max = recovery_period; REG_IME = imeBak; return 0; } -static u8 sub_80FEA78(u16 a0) +static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { - gUnknown_3005E10.unk_14 = 6; - sub_80FE7F0(0xf3, 0x01); - return 6; + lman.param[0] = 6; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_NOW_COMMUNICATION; } - gUnknown_3005E10.unk_18 = a0; + lman.NI_failCounter_limit = NI_failCounter_limit; return 0; } -static u8 sub_80FEAB4(u8 a0) +static u8 rfu_LMAN_setFastSearchParent(u8 enable_flag) { - if (gUnknown_3005E10.unk_04 == 9 || gUnknown_3005E10.unk_04 == 10 || gUnknown_3005E10.unk_04 == 11) + if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT) { - gUnknown_3005E10.unk_14 = 7; - sub_80FE7F0(0xf3, 0x01); - return 7; + lman.param[0] = 7; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_NOW_SEARCH_PARENT; } - if (a0) + if (enable_flag) { - gUnknown_3005E10.unk_0b = 1; + lman.fastSearchParent_flag = 1; } else { - gUnknown_3005E10.unk_0b = 0; + lman.fastSearchParent_flag = 0; } return 0; } -static void sub_80FEAF4(void) +static void rfu_LMAN_managerChangeAgbClockMaster(void) { - if (gUnknown_3005E10.unk_02) + if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_OFF) { - gUnknown_3005E10.unk_02 = 0; - sub_80FE7F0(0x45, 0x00); + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } } -void sub_80FEB14(void) +void rfu_LMAN_requestChangeAgbClockMaster(void) { - if (gUnknown_3005E10.unk_02 == 0) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { - sub_80FE7F0(0x45, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } - else if (gUnknown_3005E10.unk_02 == 1) + else if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { - gUnknown_3005E10.unk_02 = 2; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF_REQ; } } -void sub_80FEB3C(void) +void rfu_LMAN_forceChangeSP(void) { - if (gUnknown_3005E10.unk_07) + if (lman.pcswitch_flag) { - switch (gUnknown_3005E10.unk_04) + switch (lman.state) { - case 5: - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + case LMAN_STATE_START_SEARCH_CHILD: + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; break; - case 6: - gUnknown_3005E10.unk_07 = 2; - gUnknown_3005E10.unk_1a = 1; + case LMAN_STATE_POLL_SEARCH_CHILD: + lman.pcswitch_flag = 2; + lman.connect_period = 1; break; - case 7: - case 8: - gUnknown_3005E10.unk_07 = 2; + case LMAN_STATE_END_SEARCH_CHILD: + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + lman.pcswitch_flag = 2; break; - case 9: - case 10: - gUnknown_3005E10.unk_1a = 40; + case LMAN_STATE_START_SEARCH_PARENT: + case LMAN_STATE_POLL_SEARCH_PARENT: + lman.connect_period = 40; break; - case 11: - gUnknown_3005E10.unk_1a = 40; - gUnknown_3005E10.unk_04 = 10; + case LMAN_STATE_END_SEARCH_PARENT: + lman.connect_period = 40; + lman.state = LMAN_STATE_POLL_SEARCH_PARENT; break; } } diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index a27948650..70dbab5e4 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -21,15 +21,15 @@ struct UnkRfuStruct_8010A14{ u8 fill_a0[0x5c]; }; -static EWRAM_DATA struct UnkLinkRfuStruct_02022B2C sRfuReqConfig = {}; +static EWRAM_DATA struct InitializeParametersTag sRfuReqConfig = {}; static EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_203AC08 = {}; -static struct RfuAPIBuffer gRfuAPIBuffer; +static u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4]; static u8 gUnknown_3001FF8[14]; static u16 gUnknown_3002008[7]; struct GFtgtGname gHostRFUtgtGnameBuffer; -struct UnkRfuStruct_2 Rfu; +GF_RFU_MANAGER Rfu; u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1]; static void sub_80F8AA4(void); @@ -38,7 +38,7 @@ static void sub_80F8D20(u16 a0); static void sub_80F8DA8(u16 a0); static void sub_80F906C(void); static void sub_80F9868(u8 unused); -static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data); +static void ResetSendDataManager(struct UnkRfuStruct_2_Sub_6c *data); static void sub_80F9D04(u16 command); static void rfufunc_80F9F44(void); static void sub_80F9FA8(void); @@ -51,28 +51,28 @@ static void sub_80FA9D0(u16 a0); static void sub_80FAA58(void * a0); static void sub_80FAA94(u8 taskId); static void sub_80FACF0(u8 taskId); -static void sub_80FB0E8(u32 a0); +static void GetLinkmanErrorParams(u32 msg); static void sub_80FB564(s32 a0); static void sub_80FBB74(void); -static u8 sub_80FBC70(const u8 *a0, u16 a1); -static void sub_80FBCF8(u32 a0); +static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId); +static void sub_80FBCF8(u32 bmDisconnectSlot); static void sub_80FBE20(u32 a0, u32 a1); static void sub_80FC028(u8 taskId); static void sub_80FC208(void); static void nullsub_89(u8 taskId); -static const struct UnkLinkRfuStruct_02022B2C sRfuReqConfigTemplate = { +static const struct InitializeParametersTag sRfuReqConfigTemplate = { .maxMFrame = 4, - .mcTimer = 32, - .availSlotFlag = 0, - .mbootFlag = 0, + .MC_TimerCount = 32, + .availSlot_flag = 0, + .mboot_flag = 0, .serialNo = 0x0002, - .gname = &gHostRFUtgtGnameBuffer, - .uname = gHostRFUtgtUnameBuffer, - .unk_10 = 0x01, - .unk_11 = 0x00, - .unk_12 = 0x0258, - .unk_14 = 0x012c + .gameName = (void *)&gHostRFUtgtGnameBuffer, + .userName = gHostRFUtgtUnameBuffer, + .fastSearchParent_flag = TRUE, + .linkRecovery_enable = FALSE, + .linkRecovery_period = 600, + .NI_failCounter_limit = 300 }; static const u8 sAvailSlots[] = { @@ -138,8 +138,10 @@ static const struct { { gBlockSendBuffer, 40 } }; -static const u16 gUnknown_843EC8C[] = { - 0x0002, 0x7f7d, 0xFFFF +static const u16 sAcceptedSerialNos[] = { + 0x0002, // Pokemon FR/LG/EM + 0x7f7d, + 0xFFFF }; static const char sUnref_843EC92[][15] = { @@ -183,21 +185,21 @@ static void nullsub_88(u16 unused_0, u8 unused_1, u8 unused_2, u8 unused_3) void sub_80F85F8(void) { s32 i; - u8 unk_ee_bak = Rfu.unk_ee; + u8 errorState_bak = Rfu.errorState; CpuFill16(0, &Rfu, sizeof Rfu); Rfu.unk_0c = 0xFF; - Rfu.unk_ee = unk_ee_bak; - if (Rfu.unk_ee != 4) + Rfu.errorState = errorState_bak; + if (Rfu.errorState != 4) { - Rfu.unk_ee = 0; + Rfu.errorState = 0; } for (i = 0; i < 5; i++) { - sub_80F9CB4(Rfu.unk_80 + i); + ResetSendDataManager(Rfu.unk_80 + i); } - sub_80F9CB4(&Rfu.unk_6c); - sub_80FC478(&Rfu.unk_124); - sub_80FC4D4(&Rfu.unk_9e8); + ResetSendDataManager(&Rfu.unk_6c); + RFU_queue_20_70_reset(&Rfu.unk_124); + RFU_queue_40_14_reset(&Rfu.unk_9e8); CpuFill16(0, gSendCmd, sizeof gSendCmd); CpuFill16(0, gRecvCmds, sizeof gRecvCmds); CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers); @@ -218,7 +220,7 @@ void InitRFU(void) void sub_80F86F4(void) { - if (!rfu_initializeAPI(&gRfuAPIBuffer, sizeof gRfuAPIBuffer, gIntrTable + 1, TRUE)) + if (!rfu_initializeAPI(gf_rfu_REQ_api, RFU_API_BUFF_SIZE_RAM, gIntrTable + 1, TRUE)) { gLinkType = 0; sub_80FB128(FALSE); @@ -233,28 +235,28 @@ static void sub_80F8738(u8 taskId) switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfig); + rfu_LMAN_initializeRFU(&sRfuReqConfig); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 2: - sub_80FD538(Rfu.unk_0c, 0, 240, gUnknown_843EC8C); + rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 240, (u16*)sAcceptedSerialNos); Rfu.unk_04 = 3; gTasks[taskId].data[1] = 6; break; case 3: break; case 4: - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); Rfu.unk_04 = 5; break; case 5: break; case 18: Rfu.unk_cdb = 0; - sub_80FEA10(sub_80F8DA8); + rfu_LMAN_setMSCCallback(sub_80F8DA8); sub_80F8AA4(); sub_80F8AEC(); Rfu.unk_04 = 20; @@ -319,14 +321,14 @@ static void sub_80F893C(u8 taskId) switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfigTemplate); + rfu_LMAN_initializeRFU((INIT_PARAM*)&sRfuReqConfigTemplate); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 6: - sub_80FD538(Rfu.unk_0c, 0, 0xf0, gUnknown_843EC8C); + rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 240, (u16*)sAcceptedSerialNos); Rfu.unk_04 = 7; gTasks[taskId].data[1] = 7; break; @@ -343,7 +345,7 @@ static void sub_80F893C(u8 taskId) break; case 6: case 9: - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 2; DestroyTask(taskId); break; @@ -351,9 +353,9 @@ static void sub_80F893C(u8 taskId) break; case 12: { - u8 r5 = 1 << Rfu.unk_c3e; - rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.unk_c3e); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); + u8 r5 = 1 << Rfu.child_slot; + rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.child_slot); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); rfu_UNI_setSendData(r5, Rfu.unk_4c, sizeof(Rfu.unk_4c)); gTasks[taskId].data[1] = 8; DestroyTask(taskId); @@ -371,54 +373,54 @@ static void sub_80F893C(u8 taskId) static void sub_80F8AA4(void) { u8 i; - u8 r5 = gUnknown_3005E10.unk_00; + u8 acceptSlot = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { - if (r5 & 1) + if (acceptSlot & 1) { rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i])); rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i); } - r5 >>= 1; + acceptSlot >>= 1; } } static void sub_80F8AEC(void) { - u8 r5 = gUnknown_3005E10.unk_00; - rfu_UNI_setSendData(r5, Rfu.unk_c87, sizeof(Rfu.unk_c87)); - Rfu.unk_cda = sub_80F886C(r5); - Rfu.unk_ce2 = r5; - sub_80F887C(r5, -1); + u8 acceptSlot = lman.acceptSlot_flag; + rfu_UNI_setSendData(acceptSlot, Rfu.recvCmds, sizeof(Rfu.recvCmds)); + Rfu.unk_cda = sub_80F886C(acceptSlot); + Rfu.bm_PartnerFlags = acceptSlot; + sub_80F887C(acceptSlot, -1); Rfu.unk_0c = 1; } static void sub_80F8B34(u8 taskId) { - if (sub_80F9800()->unk_0a_0 == 0x54 && sub_80FB9F4() == 4) + if (GetHostRFUtgtGname()->activity == 0x54 && sub_80FB9F4() == 4) { - rfu_REQ_disconnect(gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); sub_80FB9E4(0, 0); } switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfig); + rfu_LMAN_initializeRFU(&sRfuReqConfig); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 17: - sub_80FD538(2, 0, 240, gUnknown_843EC8C); - sub_80FEA10(sub_80F8D20); + rfu_LMAN_establishConnection(2, 0, 240, (u16*)sAcceptedSerialNos); + rfu_LMAN_setMSCCallback(sub_80F8D20); Rfu.unk_04 = 18; break; case 18: break; case 13: - if (rfu_UNI_setSendData(1 << Rfu.unk_c3e, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0) + if (rfu_UNI_setSendData(1 << Rfu.child_slot, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0) { Rfu.unk_0c = 0; DestroyTask(taskId); @@ -433,14 +435,14 @@ static void sub_80F8B34(u8 taskId) } break; case 14: - sub_80FD760(0); + rfu_LMAN_stopManager(0); Rfu.unk_04 = 15; break; case 15: break; case 16: Rfu.unk_cdb = 0; - sub_80FEA10(sub_80F8DA8); + rfu_LMAN_setMSCCallback(sub_80F8DA8); sub_80FAFE0(1); sub_80F8AA4(); sub_80F8AEC(); @@ -456,12 +458,12 @@ static void sub_80F8B34(u8 taskId) void sub_80F8CFC(void) { - sub_80FD538(1, 0, 240, gUnknown_843EC8C); + rfu_LMAN_establishConnection(1, 0, 240, (u16*)sAcceptedSerialNos); } void sub_80F8D14(void) { - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); } static void sub_80F8D20(u16 unused) @@ -474,16 +476,16 @@ static void sub_80F8D20(u16 unused) } rfu_REQ_recvData(); rfu_waitREQComplete(); - if (gRfuSlotStatusUNI[Rfu.unk_c3e]->recv.newDataFlag) + if (gRfuSlotStatusUNI[Rfu.child_slot]->recv.newDataFlag) { Rfu.unk_cd0++; - sub_80FC588(&Rfu.unk_124, Rfu.unk_c3f); + RFU_queue_20_70_recv(&Rfu.unk_124, Rfu.unk_c3f); gUnknown_203AC08.unk_06++; sub_80F906C(); - rfu_UNI_readySendData(Rfu.unk_c3e); - rfu_UNI_clearRecvNewDataFlag(Rfu.unk_c3e); + rfu_UNI_readySendData(Rfu.child_slot); + rfu_UNI_clearRecvNewDataFlag(Rfu.child_slot); } - LinkRfu_REQ_SendData_HandleParentRelationship(TRUE); + rfu_LMAN_REQ_sendData(TRUE); } static void sub_80F8DA8(u16 unused) @@ -498,7 +500,7 @@ void sub_80F8DC0(void) if (gQuestLogState == 2 || gQuestLogState == 3) return; - sub_80FD52C(); + rfu_LMAN_powerDownRFU(); if (Rfu.unk_0c == 1) { if (FuncIsActiveTask(sub_80F8738) == TRUE) @@ -550,7 +552,7 @@ static bool8 sub_80F8EA4(void) static bool32 sub_80F8ECC(void) { - if (Rfu.unk_04 == 7 && !sub_80FD610(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240)) + if (Rfu.unk_04 == 7 && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240)) { Rfu.unk_04 = 9; return TRUE; @@ -567,7 +569,7 @@ static void sub_80F8F10(void) bool8 sub_80F8F40(void) { - if (gUnknown_3005E10.unk_00) + if (lman.acceptSlot_flag) { return TRUE; } @@ -577,7 +579,7 @@ bool8 sub_80F8F40(void) void sub_80F8F5C(void) { Rfu.unk_04 = 4; - Rfu.unk_ce7 = gUnknown_3005E10.unk_00; + Rfu.unk_ce7 = lman.acceptSlot_flag; } bool32 sub_80F8F7C(bool32 a0) @@ -616,11 +618,11 @@ static void sub_80F8FD4(void) for (i = 0; i < 5; i++) { - struct UnkRfuStruct_2 *ptr = &Rfu; + GF_RFU_MANAGER *ptr = &Rfu; for (j = 0; j < 7; j++) { - ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8; - ptr->unk_c87[i][j][0] = gRecvCmds[i][j]; + ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8; + ptr->recvCmds[i][j][0] = gRecvCmds[i][j]; } } CpuFill16(0, gRecvCmds, sizeof gRecvCmds); @@ -643,8 +645,8 @@ static void sub_80F906C(void) { if (Rfu.unk_c3c) { - u8 r2 = sub_80FC888(&Rfu.unk_c1c, Rfu.unk_4c); - if (Rfu.unk_c1c.unk_1e == 0) + u8 r2 = RFU_queue_2_14_send(&Rfu.unk_c1c, Rfu.unk_4c); + if (Rfu.unk_c1c.count == 0) { Rfu.unk_c3c = 0; } @@ -655,8 +657,8 @@ static void sub_80F906C(void) } if (Rfu.unk_c3c == 0) { - sub_80FC79C(&Rfu.unk_9e8, Rfu.unk_4c); - sub_80FC828(&Rfu.unk_c1c, Rfu.unk_4c); + RFU_queue_40_14_send(&Rfu.unk_9e8, Rfu.unk_4c); + RFU_queue_2_14_recv(&Rfu.unk_c1c, Rfu.unk_4c); } } @@ -688,26 +690,26 @@ static bool32 sub_80F911C(void) { rfu_REQ_recvData(); rfu_waitREQComplete(); - LinkRfu_REQ_SendData_HandleParentRelationship(FALSE); + rfu_LMAN_REQ_sendData(FALSE); } else { Rfu.unk_cdb = 0; - if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag)) + if ((Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag) == Rfu.bm_PartnerFlags && (Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag)) { if (!Rfu.unk_cdc) { - if (Rfu.unk_ce3) + if (Rfu.bm_DisconnectSlot) { - sub_80FBCF8(Rfu.unk_ce3); - Rfu.unk_ce3 = 0; + sub_80FBCF8(Rfu.bm_DisconnectSlot); + Rfu.bm_DisconnectSlot = 0; if (Rfu.unk_ce4 == 1) { sub_80FB9E4(2, 0x8000); - sub_80FB0E8(0x8000); + GetLinkmanErrorParams(0x8000); return FALSE; } - if (!gUnknown_3005E10.unk_00) + if (!lman.acceptSlot_flag) { sub_80F8DC0(); gReceivedRemoteLinkPlayers = 0; @@ -716,7 +718,7 @@ static bool32 sub_80F911C(void) } sub_80F8FD4(); rfu_UNI_readySendData(Rfu.unk_cda); - LinkRfu_REQ_SendData_HandleParentRelationship(TRUE); + rfu_LMAN_REQ_sendData(TRUE); } else { @@ -741,18 +743,18 @@ static bool32 sub_80F9204(void) rfu_waitREQComplete(); while (Rfu.unk_cdb == 0) { - if (Rfu.unk_ee != 0) + if (Rfu.errorState != 0) { return FALSE; } } rfu_REQ_recvData(); rfu_waitREQComplete(); - if ((gUnknown_3005E10.unk_03 & Rfu.unk_ce2) == Rfu.unk_ce2) + if ((lman.parentAck_flag & Rfu.bm_PartnerFlags) == Rfu.bm_PartnerFlags) { Rfu.unk_cdc = 0; gUnknown_203AC08.unk_06++; - flags = gUnknown_3005E10.unk_00; + flags = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { if (flags & 1) @@ -762,7 +764,7 @@ static bool32 sub_80F9204(void) if (Rfu.unk_cee[i] != 0xFF && (Rfu.unk_14[i][0] >> 5) != ((Rfu.unk_cee[i] + 1) & 7)) { if (++Rfu.unk_cea[i] > 4) - sub_80FB0E8(0x8100); + GetLinkmanErrorParams(0x8100); } else { @@ -796,12 +798,12 @@ static bool32 sub_80F9204(void) rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i])); } } - sub_80F887C(Rfu.unk_ce2, Rfu.unk_ce2 | Rfu.unk_ce5); + sub_80F887C(Rfu.bm_PartnerFlags, Rfu.bm_PartnerFlags | Rfu.unk_ce5); Rfu.unk_ce9 = Rfu.unk_ce5; - Rfu.unk_ce2 |= Rfu.unk_ce5; + Rfu.bm_PartnerFlags |= Rfu.unk_ce5; Rfu.unk_ce5 = 0; - rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, sizeof(Rfu.unk_c87)); - Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2); + rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, sizeof(Rfu.recvCmds)); + Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags); CreateTask(sub_80FAA94, 0); } } @@ -845,7 +847,7 @@ static bool32 sub_80F9514(void) u8 sp48[2 * (CMD_LENGTH - 1)]; u8 switchval; - sub_80FC6E8(&Rfu.unk_124, sp00); + RFU_queue_20_70_send(&Rfu.unk_124, sp00); for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH - 1; j++) @@ -854,7 +856,7 @@ static bool32 sub_80F9514(void) } } sub_80F9868(0); - if (gUnknown_3005E10.unk_02 == 0 && Rfu.unk_ce4) + if (lman.childClockSlave_flag == 0 && Rfu.unk_ce4) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); @@ -867,9 +869,9 @@ static bool32 sub_80F9514(void) if (Rfu.unk_ce4 == 1) { sub_80FB9E4(2, 0x9000); - sub_80FB0E8(0x9000); + GetLinkmanErrorParams(0x9000); } - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = 0; Rfu.unk_ce4 = 0; } if (Rfu.unk_cd0) @@ -877,7 +879,7 @@ static bool32 sub_80F9514(void) Rfu.unk_cd0--; CallRfuFunc(); sub_80F94BC(gSendCmd, sp48); - sub_80FC63C(&Rfu.unk_9e8, sp48); + RFU_queue_40_14_recv(&Rfu.unk_9e8, sp48); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i] = 0; } @@ -888,8 +890,8 @@ static void sub_80F965C(u8 unused, u32 flags) { s32 i, j; - const u8 *r10 = Rfu.unk_6c.unk_04; - for (i = 0; i < Rfu.unk_6c.unk_02; i++) + const u8 *r10 = Rfu.unk_6c.payload; + for (i = 0; i < Rfu.unk_6c.count; i++) { if (!(flags & 1)) { @@ -905,7 +907,7 @@ static void sub_80F965C(u8 unused, u32 flags) j++;j--; // Needed to match; } - sub_80FC63C(&Rfu.unk_9e8, gUnknown_3001FF8); + RFU_queue_40_14_recv(&Rfu.unk_9e8, gUnknown_3001FF8); Rfu.unk_6c.unk_0c |= (1 << i); } flags >>= 1; @@ -936,10 +938,10 @@ static u8 sub_80F9770(const u8 *a0) { Rfu.unk_cde[i] = a0[i]; } - return a0[Rfu.unk_c3e]; + return a0[Rfu.child_slot]; } -static void rfu_func_080F97B8(void) +static void RfuFunc_SendKeysToRfu(void) { static u8 gUnknown_3001188; if (gReceivedRemoteLinkPlayers @@ -952,20 +954,20 @@ static void rfu_func_080F97B8(void) } } -struct GFtgtGname *sub_80F9800(void) +struct GFtgtGname *GetHostRFUtgtGname(void) { return &gHostRFUtgtGnameBuffer; } bool32 IsSendingKeysToRfu(void) { - return Rfu.RfuFunc == rfu_func_080F97B8; + return Rfu.RfuFunc == RfuFunc_SendKeysToRfu; } -void sub_80F9828(void) +void StartSendingKeysToRfu(void) { AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH("rfu.c"), 1473); - Rfu.RfuFunc = rfu_func_080F97B8; + Rfu.RfuFunc = RfuFunc_SendKeysToRfu; } void Rfu_set_zero(void) @@ -997,8 +999,8 @@ static void sub_80F9868(u8 unused) if (Rfu.unk_80[i].unk_12 == 0) { Rfu.unk_80[i].unk_00 = 0; - Rfu.unk_80[i].unk_02 = gRecvCmds[i][1]; - Rfu.unk_80[i].unk_11 = gRecvCmds[i][2]; + Rfu.unk_80[i].count = gRecvCmds[i][1]; + Rfu.unk_80[i].owner = gRecvCmds[i][2]; Rfu.unk_80[i].unk_08 = 0; Rfu.unk_80[i].unk_12 = 1; Rfu.unk_5c[i] = 0; @@ -1011,11 +1013,11 @@ static void sub_80F9868(u8 unused) Rfu.unk_80[i].unk_08 |= (1 << Rfu.unk_80[i].unk_00); for (j = 0; j < 6; j++) gBlockRecvBuffer[i][Rfu.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1]; - if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].unk_02]) + if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].count]) { Rfu.unk_80[i].unk_12 = 2; Rfu_SetBlockReceivedFlag(i); - if (sub_80F9800()->unk_0a_0 == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) + if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) sub_80FAA58(gBlockRecvBuffer); } } @@ -1038,7 +1040,7 @@ static void sub_80F9868(u8 unused) if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag) { gReceivedRemoteLinkPlayers = 0; - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = gRecvCmds[i][2]; } Rfu.playerCount = gRecvCmds[i][3]; @@ -1056,7 +1058,7 @@ static void sub_80F9868(u8 unused) case 0xee00: if (Rfu.unk_0c == 1) { - Rfu.unk_ce3 |= gRecvCmds[i][1]; + Rfu.bm_DisconnectSlot |= gRecvCmds[i][1]; Rfu.unk_ce4 = gRecvCmds[i][2]; sub_80FA9D0(gRecvCmds[i][1]); } @@ -1102,14 +1104,14 @@ static bool8 sub_80F9C78(void) return TRUE; } -static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data) +static void ResetSendDataManager(struct UnkRfuStruct_2_Sub_6c *data) { data->unk_00 = 0; - data->unk_02 = 0; - data->unk_04 = NULL; + data->count = 0; + data->payload = NULL; data->unk_08 = 0; data->unk_10 = 0; - data->unk_11 = 0; + data->owner = 0; data->unk_12 = 0; } @@ -1138,8 +1140,8 @@ static void sub_80F9D04(u16 command) switch (command) { case 0x8800: - gSendCmd[1] = Rfu.unk_6c.unk_02; - gSendCmd[2] = Rfu.unk_6c.unk_11 + 0x80; + gSendCmd[1] = Rfu.unk_6c.count; + gSendCmd[2] = Rfu.unk_6c.owner + 0x80; break; case 0xa100: if (sub_80F9C50()) @@ -1147,7 +1149,7 @@ static void sub_80F9D04(u16 command) break; case 0x7700: case 0x7800: - tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3; + tmp = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot; Rfu.playerCount = gUnknown_843EC41[tmp] + 1; gSendCmd[1] = Rfu.playerCount; buff = (u8 *)(gSendCmd + 2); @@ -1172,11 +1174,11 @@ static void sub_80F9D04(u16 command) } } -void sub_80F9E2C(void *a0) +void sub_80F9E2C(void * data) { if (gSendCmd[0] == 0 && !sub_80FBA00()) { - memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2)); + memcpy(Rfu.unk_f2, data, sizeof(Rfu.unk_f2)); sub_80F9D04(0x2f00); } } @@ -1195,17 +1197,17 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size) return FALSE; } r4 = (size % 12) != 0; - Rfu.unk_6c.unk_11 = GetMultiplayerId(); + Rfu.unk_6c.owner = GetMultiplayerId(); Rfu.unk_6c.unk_10 = 1; - Rfu.unk_6c.unk_02 = (size / 12) + r4; + Rfu.unk_6c.count = (size / 12) + r4; Rfu.unk_6c.unk_00 = 0; if (size > 0x100) - Rfu.unk_6c.unk_04 = src; + Rfu.unk_6c.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); - Rfu.unk_6c.unk_04 = gBlockSendBuffer; + Rfu.unk_6c.payload = gBlockSendBuffer; } sub_80F9D04(0x8800); Rfu.RfuFunc = rfufunc_80F9F44; @@ -1233,12 +1235,12 @@ static void rfufunc_80F9F44(void) static void sub_80F9FA8(void) { s32 i; - const u8 *src = Rfu.unk_6c.unk_04; + const u8 *src = Rfu.unk_6c.payload; gSendCmd[0] = 0x8900 | Rfu.unk_6c.unk_00; for (i = 0; i < 7; i++) gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 0]; Rfu.unk_6c.unk_00++; - if (Rfu.unk_6c.unk_02 <= Rfu.unk_6c.unk_00) + if (Rfu.unk_6c.count <= Rfu.unk_6c.unk_00) { Rfu.unk_6c.unk_10 = 0; Rfu.RfuFunc = rfufunc_80FA020; @@ -1247,17 +1249,17 @@ static void sub_80F9FA8(void) static void rfufunc_80FA020(void) { - const u8 *src = Rfu.unk_6c.unk_04; + const u8 *src = Rfu.unk_6c.payload; u8 mpId = GetMultiplayerId(); s32 i; if (Rfu.unk_0c == 0) { - gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.unk_02 - 1); + gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.count - 1); for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 0]; - if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.unk_02 - 1) + gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 0]; + if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.count - 1) { - if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].unk_02]) + if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].count]) { sub_80F965C(mpId, Rfu.unk_80[mpId].unk_08); gUnknown_203AC08.unk_64++; @@ -1280,7 +1282,7 @@ bool8 sub_80FA0F8(u8 a0) static void sub_80FA114(void) { rfu_clearAllSlot(); - sub_80FD52C(); + rfu_LMAN_powerDownRFU(); gReceivedRemoteLinkPlayers = 0; Rfu.unk_ef = 1; Rfu.RfuFunc = NULL; @@ -1297,7 +1299,7 @@ static void sub_80FA160(void) { if (Rfu.unk_0c == 0) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 2; } else @@ -1306,9 +1308,9 @@ static void sub_80FA160(void) void LinkRfu_FatalError(void) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 1; - Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + Rfu.bm_DisconnectSlot = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; } static void sub_80FA1C4(void) @@ -1327,7 +1329,7 @@ static void sub_80FA1C4(void) gBattleTypeFlags &= (u16)~BATTLE_TYPE_20; if (Rfu.unk_0c == 0) { - Rfu.unk_ee = 3; + Rfu.errorState = 3; sub_80FA160(); } else @@ -1367,7 +1369,7 @@ static void sub_80FA2B0(void) if (GetMultiplayerId() != 0) { - if (Rfu.unk_124.unk_8c2 == 0 && Rfu.unk_fe > 0x3c) + if (Rfu.unk_124.count == 0 && Rfu.unk_fe > 0x3c) { sub_80F9D04(0x6600); Rfu.unk_fe = 0; @@ -1391,7 +1393,7 @@ static void sub_80FA2B0(void) static void sub_80FA350(void) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA2B0; @@ -1405,7 +1407,7 @@ static void sub_80FA388(void) if (GetMultiplayerId() != 0) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA2B0; @@ -1421,7 +1423,7 @@ static void sub_80FA388(void) } if (i == playerCount) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA350; @@ -1439,12 +1441,12 @@ void sub_80FA42C(void) } } -bool32 sub_80FA44C(u32 a0) +bool32 RfuSerialNumberIsValid(u32 serialNo) { s32 i; - for (i = 0; gUnknown_843EC8C[i] != a0; i++) + for (i = 0; sAcceptedSerialNos[i] != serialNo; i++) { - if (gUnknown_843EC8C[i] == 0xFFFF) + if (sAcceptedSerialNos[i] == 0xFFFF) return FALSE; } return TRUE; @@ -1453,15 +1455,15 @@ bool32 sub_80FA44C(u32 a0) u8 sub_80FA484(bool32 a0) { if (!a0) - return sub_80FEA34(0, 0); - sub_80FEA34(1, 0x258); + return rfu_LMAN_setLinkRecovery(0, 0); + rfu_LMAN_setLinkRecovery(1, 600); return 0; } void sub_80FA4A8(void) { Rfu.unk_cd9 = 1; - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); } u8 LinkRfu_GetMultiplayerId(void) @@ -1507,7 +1509,7 @@ static bool8 sub_80FA528(void) } } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED) + else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, i); } @@ -1541,9 +1543,9 @@ bool32 sub_80FA5D4(void) return FALSE; } -bool32 sub_80FA634(u16 a0, const u8 *a1) +bool32 sub_80FA634(u16 trainerId, const u8 *trainerName) { - u8 r1 = sub_80FBC70(a1, a0); + u8 r1 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (r1 == 0xFF) return TRUE; if (Rfu.unk_cd1[r1] == 9) @@ -1553,7 +1555,7 @@ bool32 sub_80FA634(u16 a0, const u8 *a1) void sub_80FA670(u8 a0, u16 a1, const u8 *a2) { - u8 r4 = sub_80FBC70(a2, a1); + u8 r4 = GetPartnerIndexByNameAndTrainerID(a2, a1); Rfu.unk_cd1[r4] = a0; rfu_clearSlot(TYPE_NI_SEND, r4); rfu_NI_setSendData(1 << r4, 8, Rfu.unk_cd1 + r4, 1); @@ -1562,13 +1564,13 @@ void sub_80FA670(u8 a0, u16 a1, const u8 *a2) void sub_80FA6BC(void) { Rfu.unk_c85 = 8; - rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e); - rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1); + rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot); + rfu_NI_setSendData(1 << Rfu.child_slot, 8, &Rfu.unk_c85, 1); } -u32 sub_80FA6FC(u16 a0, const u8 *a1) +u32 sub_80FA6FC(u16 trainerId, const u8 *trainerName) { - u8 r0 = sub_80FBC70(a1, a0); + u8 r0 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (r0 == 0xFF) return 2; if (gRfuSlotStatusNI[r0]->send.state == 0) @@ -1597,18 +1599,18 @@ static s32 sub_80FA788(void) s32 retval = 0; if (Rfu.unk_c85 == 8) { - if (gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_FAILED) - rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e); + if (gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_FAILED) + rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot); } - if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) + if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) { - rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e); + rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot); sub_80FB9E4(Rfu.unk_c86, 0); retval = Rfu.unk_c86; } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED) + else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED) { - rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e); + rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot); retval = 6; } return retval; @@ -1682,7 +1684,7 @@ static void sub_80FA834(u8 taskId) DestroyTask(taskId); gReceivedRemoteLinkPlayers = 1; Rfu.unk_ce8 = FALSE; - sub_80FEA34(1, 0x258); + rfu_LMAN_setLinkRecovery(1, 600); if (Rfu.unk_ce6) { for (i = 0; i < RFU_CHILD_MAX; i++) @@ -1840,42 +1842,42 @@ static void sub_80FACF0(u8 taskId) } } -static void sub_80FAD98(void) +static void RfuCheckErrorStatus(void) { - if (Rfu.unk_ee == 1 && gUnknown_3005E10.unk_02 == 0) + if (Rfu.errorState == 1 && lman.childClockSlave_flag == 0) { if (gMain.callback2 == c2_mystery_gift_e_reader_run) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; - sub_800ACBC((Rfu.unk_0a << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.unk_124.unk_8c2, Rfu.unk_9e8.unk_232, sub_80FB9F4() == 2); - Rfu.unk_ee = 2; + SetLinkErrorFromRfu((Rfu.linkman_msg << 16) | (Rfu.linkman_param[0] << 8) | Rfu.linkman_param[1], Rfu.unk_124.count, Rfu.unk_9e8.count, sub_80FB9F4() == 2); + Rfu.errorState = 2; CloseLink(); } - else if (Rfu.unk_9e8.unk_233 == 1 || Rfu.unk_124.unk_8c3 == 1) + else if (Rfu.unk_9e8.full == 1 || Rfu.unk_124.full == 1) { - if (gUnknown_3005E10.unk_02) - sub_80FEB14(); + if (lman.childClockSlave_flag) + rfu_LMAN_requestChangeAgbClockMaster(); sub_80FB9E4(1, 0x7000); - sub_80FB0E8(0x7000); + GetLinkmanErrorParams(0x7000); } } static void rfu_REQ_recvData_then_sendData(void) { - if (gUnknown_3005E10.unk_06 == 1) + if (lman.parent_child == MODE_PARENT) { rfu_REQ_recvData(); rfu_waitREQComplete(); - LinkRfu_REQ_SendData_HandleParentRelationship(0); + rfu_LMAN_REQ_sendData(RFU_CHILD_CLOCK_SLAVE_OFF); } } -bool32 sub_80FAE94(void) +bool32 LinkRfuMain1(void) { bool32 retval = FALSE; Rfu.unk_ccd = 0; - sub_80FDA30(Random()); + rfu_LMAN_manager_entity(Random()); if (Rfu.unk_ef == 0) { switch (Rfu.unk_0c) @@ -1894,14 +1896,14 @@ bool32 sub_80FAE94(void) return retval; } -bool32 sub_80FAEF0(void) +bool32 LinkRfuMain2(void) { bool32 retval = FALSE; if (Rfu.unk_ef == 0) { if (Rfu.unk_0c == 1) retval = sub_80F9204(); - sub_80FAD98(); + RfuCheckErrorStatus(); } return retval; } @@ -1955,11 +1957,11 @@ void sub_80FB030(u32 linkPlayerCount) u32 r7; s32 r8; - if (sub_80F9800()->unk_0a_0 == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { r5 = 0; r7 = 0; - r8 = Rfu.unk_ce2 ^ Rfu.unk_ce3; + r8 = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((r8 >> i) & 1) @@ -1975,33 +1977,33 @@ void sub_80FB030(u32 linkPlayerCount) } } -static void sub_80FB0E8(u32 a0) +static void GetLinkmanErrorParams(u32 msg) { - if (Rfu.unk_ee == 0) + if (Rfu.errorState == 0) { - Rfu.unk_10 = gUnknown_3005E10.unk_14; - Rfu.unk_12 = gUnknown_3005E10.unk_16; - Rfu.unk_0a = a0; - Rfu.unk_ee = 1; + Rfu.linkman_param[0] = lman.param[0]; + Rfu.linkman_param[1] = lman.param[1]; + Rfu.linkman_msg = msg; + Rfu.errorState = 1; } } static void sub_80FB118(void) { - Rfu.unk_ee = 0; + Rfu.errorState = 0; } void sub_80FB128(bool32 a0) { if (!a0) - Rfu.unk_ee = 0; + Rfu.errorState = 0; else - Rfu.unk_ee = 4; + Rfu.errorState = 4; } static void sub_80FB154(void) { - sub_80FBE20(gUnknown_3005E10.unk_00, 1); + sub_80FBE20(lman.acceptSlot_flag, 1); Rfu.RfuFunc = NULL; } @@ -2010,25 +2012,25 @@ static void sub_80FB174(void) Rfu.RfuFunc = sub_80FB154; } -static void sub_80FB184(u8 a0, u8 unused1) +static void sub_80FB184(u8 msg, u8 param_count) { u8 i; u8 r6 = 0; - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 2; break; - case 0x10: + case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: break; - case 0x11: - sub_80FB564(gUnknown_3005E10.unk_14); + case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: + sub_80FB564(lman.param[0]); for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_14 >> i) & 1) + if ((lman.param[0] >> i) & 1) { struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname; - if (structPtr->unk_0a_0 == sub_80F9800()->unk_0a_0) + if (structPtr->activity == GetHostRFUtgtGname()->activity) { Rfu.unk_cd1[i] = 0; Rfu.unk_cd5[i] = 0; @@ -2046,50 +2048,54 @@ static void sub_80FB184(u8 a0, u8 unused1) rfu_waitREQComplete(); } break; - case 0x12: + case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; - case 0x13: + case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; - case 0x14: - if (Rfu.unk_ce7 != gUnknown_3005E10.unk_00) + case LMAN_MSG_END_WAIT_CHILD_NAME: + if (Rfu.unk_ce7 != lman.acceptSlot_flag) { - rfu_REQ_disconnect(Rfu.unk_ce7 ^ gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(Rfu.unk_ce7 ^ lman.acceptSlot_flag); rfu_waitREQComplete(); } Rfu.unk_04 = 0x11; break; - case 0x31: - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + Rfu.linkLossRecoveryState = 1; break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; break; - case 0x30: - case 0x33: - Rfu.unk_f0 = 4; - Rfu.unk_ce2 &= ~gUnknown_3005E10.unk_14; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 4; + Rfu.bm_PartnerFlags &= ~lman.param[0]; if (gReceivedRemoteLinkPlayers == 1) { - if (Rfu.unk_ce2 == 0) - sub_80FB0E8(a0); + if (Rfu.bm_PartnerFlags == 0) + GetLinkmanErrorParams(msg); else sub_80FB174(); } - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); break; case 0x34: break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xf3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xf0 ... 0xf2: - case 0xff: - sub_80FB0E8(a0); - sub_80FB9E4(1, a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + GetLinkmanErrorParams(msg); + sub_80FB9E4(1, msg); Rfu.unk_cdb = 1; break; } @@ -2097,68 +2103,72 @@ static void sub_80FB184(u8 a0, u8 unused1) static const u8 unref_843EDF3[] = _(" あきと"); -static void sub_80FB37C(u8 a0, u8 unused1) +static void sub_80FB37C(u8 msg, u8 param_count) { - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 6; break; - case 0x20: - Rfu.unk_ccd = gUnknown_3005E10.unk_14; + case LMAN_MSG_PARENT_FOUND: + Rfu.unk_ccd = lman.param[0]; break; - case 0x21: + case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; - case 0x22: - Rfu.unk_c3e = gUnknown_3005E10.unk_14; + case LMAN_MSG_CONNECT_PARENT_SUCCESSED: + Rfu.child_slot = lman.param[0]; break; - case 0x23: - sub_80FB9E4(2, a0); + case LMAN_MSG_CONNECT_PARENT_FAILED: + sub_80FB9E4(2, msg); break; - case 0x24: + case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.unk_04 = 11; Rfu.unk_c85 = 0; Rfu.unk_c86 = 0; - rfu_setRecvBuffer(TYPE_NI, Rfu.unk_c3e, &Rfu.unk_c86, 1); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, 70); + rfu_setRecvBuffer(TYPE_NI, Rfu.child_slot, &Rfu.unk_c86, 1); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); break; - case 0x25: - sub_80FB9E4(2, 0x25); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + sub_80FB9E4(2, msg); break; - case 0x30: - Rfu.unk_f0 = 2; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 2; if (Rfu.unk_c86 == 6) break; - case 0x33: - if (Rfu.unk_f0 != 2) - Rfu.unk_f0 = 4; + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + if (Rfu.linkLossRecoveryState != 2) + Rfu.linkLossRecoveryState = 4; if (Rfu.unk_c86 != 9) - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); nullsub_87("LINK LOSS DISCONNECT!", 5, 5); if (gReceivedRemoteLinkPlayers == 1) - sub_80FB0E8(a0); + GetLinkmanErrorParams(msg); break; - case 0x31: - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + Rfu.linkLossRecoveryState = 1; nullsub_87("LINK LOSS RECOVERY NOW", 5, 5); break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; Rfu.unk_c3c = 1; break; case 0x34: break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xF3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xF0 ... 0xF2: - case 0xFF: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_cdb = 1; break; } @@ -2188,7 +2198,7 @@ static u8 sub_80FB5A0(s32 a0) if ((a0 >> i) & 1) { struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname; - if (structPtr->unk_0a_0 == 0x45) + if (structPtr->activity == 0x45) ret |= (1 << i); } } @@ -2196,22 +2206,22 @@ static u8 sub_80FB5A0(s32 a0) return ret; } -static void sub_80FB5EC(u8 a0, u8 unused1) +static void sub_80FB5EC(u8 msg, u8 param_count) { u8 r1; - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 0x11; break; - case 0x10: + case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: sub_80FB9E4(4, 0); break; - case 0x11: - if (sub_80F9800()->unk_0a_0 == 0x45 && Rfu.unk_cd9 == 0) + case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: + if (GetHostRFUtgtGname()->activity == 0x45 && Rfu.unk_cd9 == 0) { - u8 idx = sub_80FB5A0(gUnknown_3005E10.unk_14); + u8 idx = sub_80FB5A0(lman.param[0]); if (idx != 0) { r1 = 1 << sub_80F886C(idx); @@ -2226,42 +2236,42 @@ static void sub_80FB5EC(u8 a0, u8 unused1) Rfu.unk_ce6 |= idx; } } - if (idx != gUnknown_3005E10.unk_14) + if (idx != lman.param[0]) { - Rfu.unk_ce3 |= (idx ^ gUnknown_3005E10.unk_14); + Rfu.bm_DisconnectSlot |= (idx ^ lman.param[0]); Rfu.unk_ce4 = 2; } } - else if (sub_80F9800()->unk_0a_0 == 0x54) + else if (GetHostRFUtgtGname()->activity == 0x54) { - rfu_REQ_disconnect(gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); } - sub_80FB564(gUnknown_3005E10.unk_14); + sub_80FB564(lman.param[0]); break; - case 0x12: + case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; - case 0x13: + case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; - case 0x14: - if (sub_80F9800()->unk_0a_0 != 0x45 && gUnknown_3005E10.unk_01 > 1) + case LMAN_MSG_END_WAIT_CHILD_NAME: + if (GetHostRFUtgtGname()->activity != 0x45 && lman.acceptCount > 1) { - r1 = 1 << sub_80F886C(gUnknown_3005E10.unk_14); - rfu_REQ_disconnect(gUnknown_3005E10.unk_00 ^ r1); + r1 = 1 << sub_80F886C(lman.param[0]); + rfu_REQ_disconnect(lman.acceptSlot_flag ^ r1); rfu_waitREQComplete(); } if (Rfu.unk_04 == 0xF) Rfu.unk_04 = 0x10; break; - case 0x20: - Rfu.unk_ccd = gUnknown_3005E10.unk_14; + case LMAN_MSG_PARENT_FOUND: + Rfu.unk_ccd = lman.param[0]; break; - case 0x21: + case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; - case 0x22: - Rfu.unk_c3e = gUnknown_3005E10.unk_14; + case LMAN_MSG_CONNECT_PARENT_SUCCESSED: + Rfu.child_slot = lman.param[0]; break; - case 0x23: + case LMAN_MSG_CONNECT_PARENT_FAILED: Rfu.unk_04 = 0x12; if (Rfu.unk_ccf < 2) { @@ -2270,67 +2280,72 @@ static void sub_80FB5EC(u8 a0, u8 unused1) } else { - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); } break; - case 0x24: + case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.unk_04 = 0xD; sub_80FB9E4(3, 0); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); break; - case 0x25: - sub_80FB9E4(2, a0); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + sub_80FB9E4(2, msg); break; - case 0x31: - if (gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14) - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + if (lman.acceptSlot_flag & lman.param[0]) + Rfu.linkLossRecoveryState = 1; break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; if (gRfuLinkStatus->parentChild == MODE_CHILD) Rfu.unk_c3c = 1; break; - case 0x30: - Rfu.unk_f0 = 2; - case 0x33: - if (Rfu.unk_f0 != 2) - Rfu.unk_f0 = 4; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 2; + // fallthrough + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + if (Rfu.linkLossRecoveryState != 2) + Rfu.linkLossRecoveryState = 4; if (Rfu.unk_0c == 1) { if (gReceivedRemoteLinkPlayers == 1) { - Rfu.unk_ce2 &= ~(gUnknown_3005E10.unk_14); - if (Rfu.unk_ce2 == 0) - sub_80FB0E8(a0); + Rfu.bm_PartnerFlags &= ~(lman.param[0]); + if (Rfu.bm_PartnerFlags == 0) + GetLinkmanErrorParams(msg); else sub_80FB174(); } } else if (Rfu.unk_ce4 != 2 && gReceivedRemoteLinkPlayers == 1) { - sub_80FB0E8(a0); - sub_80FD760(0); + GetLinkmanErrorParams(msg); + rfu_LMAN_stopManager(0); } - if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gUnknown_3005E10.unk_07 == 0 && FuncIsActiveTask(sub_80F8B34) == TRUE) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(sub_80F8B34) == TRUE) Rfu.unk_04 = 0x11; - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); break; - case 0x40: - Rfu.unk_ce3 = 0; + case LMAN_MSG_LINK_DISCONNECTED_BY_USER: + Rfu.bm_DisconnectSlot = 0; break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xF3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xF0 ... 0xF2: - case 0xFF: - sub_80FB0E8(a0); - sub_80FB9E4(1, a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + GetLinkmanErrorParams(msg); + sub_80FB9E4(1, msg); Rfu.unk_cdb = 0; break; } @@ -2341,10 +2356,10 @@ void sub_80FB9D0(void) Rfu.unk_ce4 = 2; } -void sub_80FB9E4(u8 a0, u16 a1) +void sub_80FB9E4(u8 a0, u16 msg) { Rfu.unk_f1 = a0; - Rfu.unk_0a = a1; + Rfu.linkman_msg = msg; } u8 sub_80FB9F4(void) @@ -2354,8 +2369,8 @@ u8 sub_80FB9F4(void) bool32 sub_80FBA00(void) { - u32 var = sub_80FB9F4() - 1; - if (var < 2) + u32 var = sub_80FB9F4(); + if (var == 1 || var == 2) return TRUE; else return FALSE; @@ -2373,7 +2388,7 @@ bool8 Rfu_IsMaster(void) void RFUVSync(void) { - LinkRfu_syncVBlank_(); + rfu_LMAN_syncVBlank(); } void sub_80FBA44(void) @@ -2445,9 +2460,9 @@ void sub_80FBB8C(u32 a0) { Rfu.unk_0c = 1; sub_80FAF1C(); - sub_80FD430(sub_80FB184, NULL); + rfu_LMAN_initializeManager(sub_80FB184, NULL); sRfuReqConfig = sRfuReqConfigTemplate; - sRfuReqConfig.availSlotFlag = sAvailSlots[a0 - 1]; + sRfuReqConfig.availSlot_flag = sAvailSlots[a0 - 1]; sub_80F8E74(); } @@ -2455,7 +2470,7 @@ void sub_80FBBD8(void) { Rfu.unk_0c = 0; sub_80FAF1C(); - sub_80FD430(sub_80FB37C, sub_80F8D20); + rfu_LMAN_initializeManager(sub_80FB37C, sub_80F8D20); sub_80F8F10(); } @@ -2465,10 +2480,10 @@ void sub_80FBC00(void) return; Rfu.unk_0c = 2; sub_80FAF1C(); - sub_80FD430(sub_80FB5EC, NULL); + rfu_LMAN_initializeManager(sub_80FB5EC, NULL); sRfuReqConfig = sRfuReqConfigTemplate; - sRfuReqConfig.unk_11 = 0; - sRfuReqConfig.unk_12 = 0x258; + sRfuReqConfig.linkRecovery_enable = 0; + sRfuReqConfig.linkRecovery_period = 600; Rfu.unk_67 = CreateTask(sub_80F8B34, 1); } @@ -2478,17 +2493,24 @@ static u16 ReadU16(const void *ptr) return (ptr_[1] << 8) | (ptr_[0]); } -static u8 sub_80FBC70(const u8 *a0, u16 a1) +/* + * ================================================================ + * Looks up the player by uname and pid. Returns the index in + * gRfuLinkStatus->partner of the first match with a valid slot ID. + * Returns 0xFF if not found. + * ================================================================ + */ +static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId) { u8 i; u8 ret = 0xFF; for (i = 0; i < RFU_CHILD_MAX; i++) { - u16 trainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId); - if (sub_80FA44C(gRfuLinkStatus->partner[i].serialNo) - && !StringCompare(a0, gRfuLinkStatus->partner[i].uname) - && a1 == trainerId) + u16 partnerTrainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId); + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[i].serialNo) + && !StringCompare(trainerName, gRfuLinkStatus->partner[i].uname) + && trainerId == partnerTrainerId) { ret = i; if (gRfuLinkStatus->partner[i].slot != 0xFF) @@ -2499,19 +2521,19 @@ static u8 sub_80FBC70(const u8 *a0, u16 a1) return ret; } -static void sub_80FBCF8(u32 a0) +static void sub_80FBCF8(u32 bmDisconnectSlot) { - rfu_REQ_disconnect(a0); + rfu_REQ_disconnect(bmDisconnectSlot); rfu_waitREQComplete(); - Rfu.unk_ce2 &= ~(a0); + Rfu.bm_PartnerFlags &= ~(bmDisconnectSlot); rfu_clearSlot(TYPE_UNI_SEND, Rfu.unk_cda); - rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70); - Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2); + rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, 70); + Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags); } -void sub_80FBD4C(const u8 *ptr, u16 a1) +void sub_80FBD4C(const u8 *trainerName, u16 trainerId) { - u8 var = sub_80FBC70(ptr, a1); + u8 var = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (var != 0xFF) sub_80FBCF8(1 << var); } @@ -2525,7 +2547,7 @@ void sub_80FBD6C(u32 a0) for (i = 0; i < RFU_CHILD_MAX; i++) { - if (Rfu.unk_cde[i] == a0 && (Rfu.unk_ce2 >> i) & 1) + if (Rfu.unk_cde[i] == a0 && (Rfu.bm_PartnerFlags >> i) & 1) var |= 1 << i; } if (var) @@ -2568,7 +2590,7 @@ static void sub_80FBE80(u8 taskId) if (sub_80F8EA4()) { - u8 id = sub_80FBC70((u8*)data, ReadU16(&data[8])); + u8 id = GetPartnerIndexByNameAndTrainerID((u8*)data, ReadU16(&data[8])); if (id != 0xFF) { if (gRfuLinkStatus->partner[id].slot != 0xFF) @@ -2577,7 +2599,7 @@ static void sub_80FBE80(u8 taskId) if (sub_80F8ECC()) DestroyTask(taskId); } - else if (sub_80F9800()->unk_0a_0 == 0x15 || sub_80F9800()->unk_0a_0 == 0x16) + else if (GetHostRFUtgtGname()->activity == 0x15 || GetHostRFUtgtGname()->activity == 0x16) { data[15]++; } @@ -2619,12 +2641,12 @@ void sub_80FBF54(const u8 *src, u16 trainerId) static bool32 sub_80FBF98(s16 a1, struct GFtgtGname *structPtr) { - if (sub_80F9800()->unk_0a_0 == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { - if (structPtr->unk_0a_0 != 0x45) + if (structPtr->activity != 0x45) return TRUE; } - else if (structPtr->unk_0a_0 != 0x40) + else if (structPtr->activity != 0x40) { return TRUE; } @@ -2660,15 +2682,15 @@ static void sub_80FC028(u8 taskId) DestroyTask(taskId); } - if (Rfu.unk_ccd != 0 && gUnknown_3005E10.unk_06 == 0) + if (Rfu.unk_ccd != 0 && lman.parent_child == 0) { u16 trainerId = ReadU16(((struct GFtgtGname *)&Rfu.unk_104.gname)->unk_00.playerTrainerId); - u8 id = sub_80FBC70(Rfu.unk_104.uname, trainerId); + u8 id = GetPartnerIndexByNameAndTrainerID(Rfu.unk_104.uname, trainerId); if (id != 0xFF) { if (!sub_80FBF98(gTasks[taskId].data[1], (struct GFtgtGname *)&gRfuLinkStatus->partner[id].gname)) { - if (gRfuLinkStatus->partner[id].slot != 0xFF && !sub_80FD610(gRfuLinkStatus->partner[id].id, 0x5A)) + if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 0x5A)) { Rfu.unk_04 = 0xA; DestroyTask(taskId); @@ -2691,7 +2713,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2) Rfu.unk_f1 = 0; StringCopy(Rfu.unk_104.uname, name); memcpy(Rfu.unk_104.gname, structPtr, RFU_GAME_NAME_LENGTH); - sub_80FEB3C(); + rfu_LMAN_forceChangeSP(); taskId = CreateTask(sub_80FC028, 2); gTasks[taskId].data[1] = a2; taskId2 = FindTaskIdByFunc(sub_80F8B34); @@ -2709,7 +2731,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2) bool8 sub_80FC1B0(void) { - if (Rfu.unk_f0 == 1) + if (Rfu.linkLossRecoveryState == 1) return TRUE; else return FALSE; @@ -2721,7 +2743,7 @@ bool32 sub_80FC1CC(void) for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_00 >> i) & 1 && Rfu.unk_cd1[i] == 0) + if ((lman.acceptSlot_flag >> i) & 1 && Rfu.unk_cd1[i] == 0) return FALSE; } @@ -2784,9 +2806,9 @@ static void sub_80FC228(void) nullsub_87(gUnknown_843EE47, 6, i + 3); nullsub_87(gUnknown_843EE57, 0x16, i + 3); } - nullsub_88(gRfuLinkStatus->partner[Rfu.unk_c3e].serialNo, 1, 3, 4); - nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].gname, 6, 3); - nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].uname, 0x16, 3); + nullsub_88(gRfuLinkStatus->partner[Rfu.child_slot].serialNo, 1, 3, 4); + nullsub_87(gRfuLinkStatus->partner[Rfu.child_slot].gname, 6, 3); + nullsub_87(gRfuLinkStatus->partner[Rfu.child_slot].uname, 0x16, 3); } else { @@ -2824,12 +2846,12 @@ static const char gUnknown_843EEA8[][8] = { static u32 sub_80FC44C(void) { - return Rfu.unk_9e8.unk_232; + return Rfu.unk_9e8.count; } u32 GetRfuRecvQueueLength(void) { - return Rfu.unk_124.unk_8c2; + return Rfu.unk_124.count; } static void nullsub_89(u8 taskId) diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 69b6603a8..d7866b98a 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -166,7 +166,7 @@ static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { SpriteCallbackDummy }; -void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr) +void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue) { s32 i; s32 j; @@ -175,16 +175,16 @@ void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr) { for (j = 0; j < 70; j++) { - ptr->unk_00[i][j] = 0; + queue->slots[i][j] = 0; } } - ptr->unk_8c1 = 0; - ptr->unk_8c0 = 0; - ptr->unk_8c2 = 0; - ptr->unk_8c3 = 0; + queue->send_slot = 0; + queue->recv_slot = 0; + queue->count = 0; + queue->full = 0; } -void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr) +void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr) { s32 i; s32 j; @@ -193,16 +193,16 @@ void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr) { for (j = 0; j < 14; j++) { - ptr->unk_00[i][j] = 0; + ptr->slots[i][j] = 0; } } - ptr->unk_231 = 0; - ptr->unk_230 = 0; - ptr->unk_232 = 0; - ptr->unk_233 = 0; + ptr->send_slot = 0; + ptr->recv_slot = 0; + ptr->count = 0; + ptr->full = 0; } -static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr) +static void RFU_queue_2_256_reset(struct UnkRfuStruct_Sub_Unused *ptr) { s32 i; s32 j; @@ -211,29 +211,29 @@ static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr) { for (j = 0; j < 256; j++) { - ptr->unk_00[i][j] = 0; + ptr->slots[i][j] = 0; } } - ptr->unk_201 = 0; - ptr->unk_200 = 0; - ptr->unk_202 = 0; - ptr->unk_203 = 0; + ptr->send_slot = 0; + ptr->recv_slot = 0; + ptr->count = 0; + ptr->full = 0; } -void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data) { s32 i; u16 imeBak; u8 count; - if (q1->unk_8c2 < 20) + if (queue->count < 20) { imeBak = REG_IME; REG_IME = 0; count = 0; for (i = 0; i < 70; i += 14) { - if (q2[i] == 0 && q2[i + 1] == 0) + if (data[i] == 0 && data[i + 1] == 0) { count++; } @@ -242,36 +242,36 @@ void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) { for (i = 0; i < 70; i++) { - q1->unk_00[q1->unk_8c0][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_8c0++; - q1->unk_8c0 %= 20; - q1->unk_8c2++; + queue->recv_slot++; + queue->recv_slot %= 20; + queue->count++; for (i = 0; i < 70; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->unk_8c3 = 1; + queue->full = 1; } } -void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data) { s32 i; u16 imeBak; - if (q1->unk_232 < 40) + if (queue->count < 40) { imeBak = REG_IME; REG_IME = 0; for (i = 0; i < 14; i++) { - if (q2[i] != 0) + if (data[i] != 0) { break; } @@ -280,57 +280,57 @@ void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) { for (i = 0; i < 14; i++) { - q1->unk_00[q1->unk_230][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_230++; - q1->unk_230 %= 40; - q1->unk_232++; + queue->recv_slot++; + queue->recv_slot %= 40; + queue->count++; for (i = 0; i < 14; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->unk_233 = 1; + queue->full = 1; } } -bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest) { u16 imeBak; s32 i; imeBak = REG_IME; REG_IME = 0; - if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0) + if (queue->recv_slot == queue->send_slot || queue->full) { for (i = 0; i < 70; i++) { - q2[i] = 0; + dest[i] = 0; } REG_IME = imeBak; return FALSE; } for (i = 0; i < 70; i++) { - q2[i] = q1->unk_00[q1->unk_8c1][i]; + dest[i] = queue->slots[queue->send_slot][i]; } - q1->unk_8c1++; - q1->unk_8c1 %= 20; - q1->unk_8c2--; + queue->send_slot++; + queue->send_slot %= 20; + queue->count--; REG_IME = imeBak; return TRUE; } -bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest) { s32 i; u16 imeBak; - if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0) + if (queue->recv_slot == queue->send_slot || queue->full != 0) { return FALSE; } @@ -338,98 +338,98 @@ bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) REG_IME = 0; for (i = 0; i < 14; i++) { - q2[i] = q1->unk_00[q1->unk_231][i]; + dest[i] = queue->slots[queue->send_slot][i]; } - q1->unk_231++; - q1->unk_231 %= 40; - q1->unk_232--; + queue->send_slot++; + queue->send_slot %= 40; + queue->count--; REG_IME = imeBak; return TRUE; } -void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2) +void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *queue, const u8 *data) { s32 i; - if (q2[1] == 0) + if (data[1] == 0) { - sub_80FC888(q1, NULL); + RFU_queue_2_14_send(queue, NULL); } else { for (i = 0; i < 14; i++) { - q1->unk_00[q1->unk_1c][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_1c++; - q1->unk_1c %= 2; - if (q1->unk_1e < 2) + queue->recv_slot++; + queue->recv_slot %= 2; + if (queue->count < 2) { - q1->unk_1e++; + queue->count++; } else { - q1->unk_1d = q1->unk_1c; + queue->send_slot = queue->recv_slot; } } } -bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) +bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *queue, u8 *dest) { s32 i; - if (q1->unk_1e == 0) + if (queue->count == 0) { return FALSE; } - if (q2 != NULL) + if (dest != NULL) { for (i = 0; i < 14; i++) { - q2[i] = q1->unk_00[q1->unk_1d][i]; + dest[i] = queue->slots[queue->send_slot][i]; } } - q1->unk_1d++; - q1->unk_1d %= 2; - q1->unk_1e--; + queue->send_slot++; + queue->send_slot %= 2; + queue->count--; return TRUE; } -static void sub_80FC8D8(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2) +static void RFU_queue_2_256_recv(struct UnkRfuStruct_Sub_Unused *queue, u8 *data) { s32 i; - if (q1->unk_202 < 2) + if (queue->count < 2) { for (i = 0; i < 256; i++) { - q1->unk_00[q1->unk_200][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_200++; - q1->unk_200 %= 2; - q1->unk_202++; + queue->recv_slot++; + queue->recv_slot %= 2; + queue->count++; } else { - q1->unk_203 = 1; + queue->full = 1; } } -static bool8 sub_80FC944(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2) +static bool8 RFU_queue_2_256_send(struct UnkRfuStruct_Sub_Unused *queue, u8 *send) { s32 i; - if (q1->unk_200 == q1->unk_201 || q1->unk_203) + if (queue->recv_slot == queue->send_slot || queue->full) { return FALSE; } for (i = 0; i < 256; i++) { - q2[i] = q1->unk_00[q1->unk_201][i]; + send[i] = queue->slots[queue->send_slot][i]; } - q1->unk_201++; - q1->unk_201 %= 2; - q1->unk_202--; + queue->send_slot++; + queue->send_slot %= 2; + queue->count--; return TRUE; } @@ -438,7 +438,7 @@ static void sub_80FC9B8(u8 *q1, u8 mode) s32 i; u8 rval; u16 r5 = 0; - static u8 _3002018; + static u8 counter; switch (mode) { @@ -470,11 +470,11 @@ static void sub_80FC9B8(u8 *q1, u8 mode) case 3: for (i = 0; i < 200; i++) { - q1[i] = i + 1 + _3002018; - r5 += (i + 1 + _3002018) & 0xFF; + q1[i] = i + 1 + counter; + r5 += (i + 1 + counter) & 0xFF; } *((u16 *)(q1 + i)) = r5; - _3002018++; + counter++; break; } } @@ -617,7 +617,7 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3 r3 >>= 8; } data->playerGender = gSaveBlock2Ptr->playerGender; - data->unk_0a_0 = activity; + data->activity = activity; data->unk_0a_7 = r2; data->unk_00.unk_00_0 = GAME_LANGUAGE; data->unk_00.unk_01_2 = GAME_VERSION; @@ -629,14 +629,21 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3 data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR); } +/* + * ========================================================== + * Returns 1 if parent, 0 if child or neutral. + * If partner serial number is valid, copies gname and uname. + * Otherwise, blanks these. + * ========================================================== + */ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) { bool8 retVal; - if (gUnknown_3005E10.unk_06 == 1) + if (lman.parent_child == MODE_PARENT) { retVal = TRUE; - if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) { memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); @@ -650,7 +657,7 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) else { retVal = FALSE; - if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo)) { memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); @@ -664,6 +671,12 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) return retVal; } +/* + * ========================================================== + * Specific check for serial number 0x7F7D, + * which comes from ??? + * ========================================================== + */ bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx) { bool8 retVal = FALSE; @@ -879,7 +892,7 @@ void RecordMixTrainerNames(void) s32 connectedTrainerRecordIndices[5]; struct TrainerNameRecord *newRecords = AllocZeroed(20 * sizeof(struct TrainerNameRecord)); - // Check if we already have a record saved for connected trainers. + // Check if we alsendy have a record saved for connected trainers. for (i = 0; i < GetLinkPlayerCount(); i++) { connectedTrainerRecordIndices[i] = -1; @@ -900,7 +913,7 @@ void RecordMixTrainerNames(void) { CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name); - // If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it. + // If we alsendy had a record for this trainer, wipe it so that the next step doesn't duplicate it. if (connectedTrainerRecordIndices[i] >= 0) { ZeroName(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName); diff --git a/src/party_menu.c b/src/party_menu.c index df0e70b37..c9a88f157 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -3881,7 +3881,7 @@ static void CursorCB_Register(u8 taskId) u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); - switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_80F9800(), species2, species, obedience)) + switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience)) { case CANT_REGISTER_MON: StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); @@ -3907,7 +3907,7 @@ static void CursorCB_Trade1(u8 taskId) u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); - u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_80F9800(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience); + u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience); if (stringId != UR_TRADE_MSG_NONE) { diff --git a/src/rfu_union_tool.c b/src/rfu_union_tool.c index 20b29de9b..6c4f0c8cb 100644 --- a/src/rfu_union_tool.c +++ b/src/rfu_union_tool.c @@ -473,7 +473,7 @@ static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2) { return gUnknown_845711B[r1]; } - else if (r2->unk_0a_0 == 0x45) + else if (r2->activity == 0x45) { return 1; } @@ -542,7 +542,7 @@ static void sub_811BCA0(u32 r7, struct GFtgtGname * r8) static void sub_811BDA8(u32 r5, struct GFtgtGname * r4) { u32 i; - switch (r4->unk_0a_0) + switch (r4->activity) { case 0x40: case 0x54: @@ -584,11 +584,11 @@ static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0) sUnionObjRefreshTimer = 0; for (i = 0, r4 = r0->field_0->arr; i < 8; i++) { - if (r4[i].field_1A_0 == 1) + if (r4[i].tradeStatus == 1) { sub_811BDA8(i, &r4[i].unk.gname); } - else if (r4[i].field_1A_0 == 2) + else if (r4[i].tradeStatus == 2) { sub_811BE6C(i, &r4[i].unk.gname); } @@ -639,7 +639,7 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) { continue; } - if (r4[i].field_1A_0 != 1) + if (r4[i].tradeStatus != 1) { continue; } diff --git a/src/union_room.c b/src/union_room.c index f942fb7d3..30f4d7d9b 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -65,7 +65,7 @@ static void sub_81161E4(struct UnkStruct_Leader * leader); static bool8 sub_8116444(struct UnkStruct_Leader * leader, u32 a1, u32 a2); static void sub_81164C8(u8 windowId, s32 itemId, u8 y); static u8 sub_8116524(struct UnkStruct_Main0 * a0); -static u8 sub_81165E8(struct UnkStruct_Main0 * a0); +static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * a0); static void sub_8116738(u8 taskId); static u32 sub_8116D10(struct UnkStruct_Group * group, s32 id); static void sub_8116D60(struct UnkStruct_Group * group, s32 id); @@ -90,16 +90,16 @@ static u8 sub_811A084(struct UnkStruct_Main4 * arg0, u32 arg1); static bool32 sub_811A0B4(const u8 * str); static bool32 sub_811A0E0(void); static bool8 PrintOnTextbox(u8 *textState, const u8 *str); -static s8 sub_811A14C(u8 *dest, bool32 arg1); -static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate); -static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6); +static s8 sub_811A14C(u8 *state_p, bool32 no_draw); +static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate); +static s32 TradeBoardMenuHandler(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6); static void sub_811A3F8(void); static void sub_811A41C(void); -static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); -static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count); -static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count); -static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1); -static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1); +static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); +static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * arg0, u8 count); +static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * arg0, u8 count); +static bool8 AreUnkSharedObjectsDifferent(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1); +static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1); static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1); static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2); static void sub_811A81C(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id); @@ -109,10 +109,10 @@ static u32 sub_811A9FC(s32 a0); static u32 sub_811AA24(struct UnkStruct_x20 * unkX20); static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender); static void nullsub_92(u8 windowId, s32 itemId, u8 y); -static void sub_811ACA4(u8 windowId, s32 itemId, u8 y); -static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1); +static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y); +static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1); static s32 GetUnionRoomPlayerGender(s32 a0, struct UnkStruct_Main0 * a1); -static s32 sub_811ADD0(u32 type, u32 species); +static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species); static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender); static void sub_811AECC(u8 *dst, u8 arg1); static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3); @@ -414,7 +414,7 @@ static const struct ListMenuTemplate gUnknown_8456F04 = { .cursorKind = 0 }; -static const struct WindowTemplate gUnknown_8456F1C = { +static const struct WindowTemplate sTradeBoardWindowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -434,7 +434,7 @@ static const struct WindowTemplate gUnknown_8456F24 = { .baseBlock = 0x039 }; -static const struct ListMenuItem gUnknown_8456F2C[] = { +static const struct ListMenuItem sTradeBoardListMenuItems[] = { {gUnknown_84571AC, -3}, {gUnknown_84571AC, 0}, {gUnknown_84571AC, 1}, @@ -447,10 +447,10 @@ static const struct ListMenuItem gUnknown_8456F2C[] = { {gUnknown_8459368, 8} }; -static const struct ListMenuTemplate gUnknown_8456F7C = { - .items = gUnknown_8456F2C, +static const struct ListMenuTemplate sTradeBoardListMenuTemplate = { + .items = sTradeBoardListMenuItems, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .itemPrintFunc = sub_811ACA4, + .itemPrintFunc = TradeBoardListMenuItemPrintFunc, .totalItems = 10, .maxShowed = 5, .windowId = 0, @@ -518,7 +518,7 @@ static const struct ListMenuTemplate gUnknown_845701C = { .cursorKind = 0 }; -static const struct UnkStruct_Shared gUnknown_8457034 = {}; +static const struct UnkStruct_Shared sUnkStruct_Shared_Dummy = {}; // starts at gUnknown_082F0474 in pokeemerald, union link groups @@ -584,16 +584,16 @@ static void sub_811586C(u8 windowId, u8 arg1, u8 stringId) switch (arg1 << 8) { case 0x200: - sub_811A444(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0); break; case 0x400: - sub_811A444(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0); break; case 0x2500: - sub_811A444(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0); break; case 0x3500: - sub_811A444(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0); break; } @@ -605,11 +605,11 @@ static void sub_8115924(u8 windowId) u8 text[12]; u8 text2[12]; - sub_811A444(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0); StringCopy(text2, gUnknown_84571B4); ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5); StringAppend(text2, text); - sub_811A444(windowId, 0, text2, 0, 0x10, 0); + UR_AddTextPrinterParameterized(windowId, 0, text2, 0, 0x10, 0); } static void sub_811599C(u8 *dst, u8 caseId) @@ -659,11 +659,11 @@ static void sub_8115A68(u8 taskId) data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 5); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 5); LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName); data->field_0->arr[0].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].tradeStatus = 1; data->field_0->arr[0].field_1A_1 = 0; data->field_0->arr[0].field_1B = 0; data->field_17 = sub_811A054(data->field_4, 0xFF); @@ -672,7 +672,7 @@ static void sub_8115A68(u8 taskId) data->field_11 = AddWindow(&gUnknown_8456D04); FillWindowPixelBuffer(data->field_10, PIXEL_FILL(2)); - sub_811A444(data->field_10, 0, gUnknown_845747C, 8, 2, 4); + UR_AddTextPrinterParameterized(data->field_10, 0, gUnknown_845747C, 8, 2, 4); PutWindowTilemap(data->field_10); CopyWindowToVram(data->field_10, 2); @@ -686,14 +686,14 @@ static void sub_8115A68(u8 taskId) CopyWindowToVram(data->field_11, 2); CopyBgTilemapBufferToVram(0); - data->field_13 = 1; + data->playerCount = 1; data->state = 4; break; case 4: StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]); if ((gUnknown_203B059 >> 4) != 0) { - if (data->field_13 > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0) + if (data->playerCount > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0) StringExpandPlaceholders(gStringVar4, gUnknown_8457264); else StringExpandPlaceholders(gStringVar4, gUnknown_8457234); @@ -703,7 +703,7 @@ static void sub_8115A68(u8 taskId) sub_811599C(gStringVar4, gUnknown_203B058); } - sub_811586C(data->field_11, gUnknown_203B059, data->field_13); + sub_811586C(data->field_11, gUnknown_203B059, data->playerCount); data->state = 5; break; case 5: @@ -714,7 +714,7 @@ static void sub_8115A68(u8 taskId) sub_8116444(data, 7, 10); if (JOY_NEW(B_BUTTON)) { - if (data->field_13 == 1) + if (data->playerCount == 1) data->state = 23; else if ((gUnknown_203B059 & 0xF0) != 0) data->state = 30; @@ -722,7 +722,7 @@ static void sub_8115A68(u8 taskId) data->state = 19; } if ((gUnknown_203B059 >> 4) != 0 - && data->field_13 > (gUnknown_203B059 >> 4) - 1 + && data->playerCount > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0 && sub_80FC1CC() && JOY_NEW(START_BUTTON)) @@ -739,14 +739,14 @@ static void sub_8115A68(u8 taskId) if (!sub_80FA5D4()) { data->state = 6; - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); } break; case 10: id = ((gUnknown_203B058 & 0xF) == 2) ? 1 : 0; if (PrintOnTextbox(&data->textState, gUnknown_845767C[id])) { - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 4; } @@ -765,19 +765,19 @@ static void sub_8115A68(u8 taskId) } break; case 11: - switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName))) + switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName))) { case 0: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); data->field_19 = 5; - sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(5, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 12; break; case 1: case -1: data->field_19 = 6; - sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(6, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 12; break; case -3: @@ -786,29 +786,29 @@ static void sub_8115A68(u8 taskId) } break; case 12: - val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); if (val == 1) { if (data->field_19 == 5) { - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); - data->field_13++; - if (data->field_13 == (gUnknown_203B059 & 0xF)) + data->playerCount++; + if (data->playerCount == (gUnknown_203B059 & 0xF)) { - if ((gUnknown_203B059 & 0xF0) != 0 || data->field_13 == 4) + if ((gUnknown_203B059 & 0xF0) != 0 || data->playerCount == 4) { data->state = 15; } else { - IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]); + IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gUnknown_8457554); data->state = 13; } sub_80F8F5C(); - sub_811586C(data->field_11, gUnknown_203B059, data->field_13); + sub_811586C(data->field_11, gUnknown_203B059, data->playerCount); } else { @@ -817,9 +817,9 @@ static void sub_8115A68(u8 taskId) } else { - sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId)); - data->field_0->arr[data->field_13].field_1A_0 = 0; - sub_81165E8(data->field_0); + sub_80FBD4C(data->field_0->arr[data->playerCount].unk.playerName, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId)); + data->field_0->arr[data->playerCount].tradeStatus = 0; + UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 4; } @@ -873,7 +873,7 @@ static void sub_8115A68(u8 taskId) case -1: if ((gUnknown_203B059 & 0xF0) != 0) data->state = 15; - else if (data->field_13 == (gUnknown_203B059 & 0xF)) + else if (data->playerCount == (gUnknown_203B059 & 0xF)) data->state = 15; else data->state = 4; @@ -1040,7 +1040,7 @@ static bool8 sub_8116444(struct UnkStruct_Leader * data, u32 arg1, u32 arg2) case 1: PlaySE(SE_PC_LOGIN); RedrawListMenu(data->listTaskId); - IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->field_13]); + IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->playerCount]); sub_8116244(gStringVar4, gUnknown_203B058); data->state = arg1; break; @@ -1059,7 +1059,7 @@ static void sub_81164C8(u8 windowId, s32 itemId, u8 y) struct UnkStruct_Leader * data = sUnionRoomMain.leader; u8 var = 0; - switch (data->field_0->arr[itemId].field_1A_0) + switch (data->field_0->arr[itemId].tradeStatus) { case 1: if (data->field_0->arr[itemId].field_1B != 0) @@ -1082,7 +1082,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) for (i = 1; i < 5; i++) { - u16 var = data->field_0->arr[i].field_1A_0; + u16 var = data->field_0->arr[i].tradeStatus; if (var == 1) { id = sub_811A748(&data->field_0->arr[i], data->field_4->arr); @@ -1093,7 +1093,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) } else { - data->field_0->arr[i].field_1A_0 = 2; + data->field_0->arr[i].tradeStatus = 2; ret = 2; } } @@ -1114,7 +1114,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) return ret; } -static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) +static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * arg0) { struct UnkStruct_Leader * data = sUnionRoomMain.leader; u8 copiedCount; @@ -1127,7 +1127,7 @@ static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) copiedCount = 0; for (i = 0; i < 5; i++) { - if (data->field_8->arr[i].field_1A_0 == 1) + if (data->field_8->arr[i].tradeStatus == 1) { data->field_0->arr[copiedCount] = data->field_8->arr[i]; copiedCount++; @@ -1137,16 +1137,16 @@ static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) ret = copiedCount; for (; copiedCount < 5; copiedCount++) { - data->field_0->arr[copiedCount].unk = gUnknown_8457034; + data->field_0->arr[copiedCount].unk = sUnkStruct_Shared_Dummy; data->field_0->arr[copiedCount].field_18 = 0; - data->field_0->arr[copiedCount].field_1A_0 = 0; + data->field_0->arr[copiedCount].tradeStatus = 0; data->field_0->arr[copiedCount].field_1A_1 = 0; data->field_0->arr[copiedCount].field_1B = 0; } for (i = 0; i < 5; i++) { - if (data->field_0->arr[i].field_1A_0 != 1) + if (data->field_0->arr[i].tradeStatus != 1) continue; if (data->field_0->arr[i].field_1B != 0x40) continue; @@ -1194,15 +1194,15 @@ static void sub_8116738(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, gSpecialVar_0x8004); data->field_C = AddWindow(&gUnknown_8456CD0); data->listWindowId = AddWindow(&gUnknown_8456D4C); data->field_D = AddWindow(&gUnknown_8456D54); FillWindowPixelBuffer(data->field_C, PIXEL_FILL(2)); - sub_811A444(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4); + UR_AddTextPrinterParameterized(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4); PutWindowTilemap(data->field_C); CopyWindowToVram(data->field_C, 2); @@ -1234,9 +1234,9 @@ static void sub_8116738(u8 taskId) { // this unused variable along with the assignment is needed to match u32 unusedVar; - unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0; + unusedVar = data->field_0->arr[id].unk.gname.activity; - if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) + if (data->field_0->arr[id].tradeStatus == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) { u32 var = sub_8116D10(data, id); if (var == 0) @@ -1278,7 +1278,7 @@ static void sub_8116738(u8 taskId) case 6: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; sub_80FB9E4(0, 0); switch (gUnknown_203B058) { @@ -1478,8 +1478,8 @@ static void sub_8116E1C(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, 0xFF); data->field_F = 0; data->state = 3; @@ -1526,7 +1526,7 @@ static bool32 sub_8116F28(u32 arg0, u32 id) static u8 sub_8116F5C(struct UnkStruct_Group * data, u32 id) { - if (data->field_0->arr[id].field_1A_0 == 1) + if (data->field_0->arr[id].tradeStatus == 1) { if (data->field_0->arr[id].unk.gname.unk_0a_7) return 3; @@ -1556,14 +1556,14 @@ static u8 sub_8116FE4(void) for (i = 0; i < 16; i++) { - if (data->field_0->arr[i].field_1A_0 != 0) + if (data->field_0->arr[i].tradeStatus != 0) { id = sub_811A748(&data->field_0->arr[i], data->field_4->arr); if (id != 0xFF) { - if (data->field_0->arr[i].field_1A_0 == 1) + if (data->field_0->arr[i].tradeStatus == 1) { - if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0)) + if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0)) { data->field_0->arr[i].unk = data->field_4->arr[id].unk0; data->field_0->arr[i].field_1B = 0x40; @@ -1581,7 +1581,7 @@ static u8 sub_8116FE4(void) } else { - data->field_0->arr[i].field_1A_0 = 1; + data->field_0->arr[i].tradeStatus = 1; data->field_0->arr[i].field_1B = 0x40; ret = 1; } @@ -1590,12 +1590,12 @@ static u8 sub_8116FE4(void) } else { - if (data->field_0->arr[i].field_1A_0 != 2) + if (data->field_0->arr[i].tradeStatus != 2) { data->field_0->arr[i].field_18++; if (data->field_0->arr[i].field_18 >= 300) { - data->field_0->arr[i].field_1A_0 = 2; + data->field_0->arr[i].tradeStatus = 2; ret = 2; } } @@ -1961,11 +1961,11 @@ static void sub_8117A0C(u8 taskId) data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 5); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 5); LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName); data->field_0->arr[0].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].tradeStatus = 1; data->field_0->arr[0].field_1A_1 = 0; data->field_0->arr[0].field_1B = 0; data->field_17 = sub_811A054(data->field_4, 0xFF); @@ -1979,7 +1979,7 @@ static void sub_8117A0C(u8 taskId) data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyBgTilemapBufferToVram(0); - data->field_13 = 1; + data->playerCount = 1; data->state = 2; break; case 2: @@ -2002,7 +2002,7 @@ static void sub_8117A0C(u8 taskId) case 6: if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8)) { - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 2; } @@ -2016,39 +2016,39 @@ static void sub_8117A0C(u8 taskId) case 0: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); data->field_19 = 5; - sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(5, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 8; break; case 1: case -1: data->field_19 = 6; - sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(6, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 8; break; } break; case 8: - val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); if (val == 1) { if (data->field_19 == 5) { - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); - data->field_13++; - IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]); + data->playerCount++; + IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gUnknown_8457554); data->state = 9; sub_80F8F5C(); } else { - sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId)); - data->field_0->arr[data->field_13].field_1A_0 = 0; - sub_81165E8(data->field_0); + sub_80FBD4C(data->field_0->arr[data->playerCount].unk.playerName, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId)); + data->field_0->arr[data->playerCount].tradeStatus = 0; + UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 2; } @@ -2169,8 +2169,8 @@ static void sub_8117F20(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, data->field_12 + 7); winTemplate1 = gUnknown_8456D4C; @@ -2209,9 +2209,9 @@ static void sub_8117F20(u8 taskId) { // this unused variable along with the assignment is needed to match u32 unusedVar; - unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0; + unusedVar = data->field_0->arr[id].unk.gname.activity; - if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) + if (data->field_0->arr[id].tradeStatus == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) { data->field_F = id; LoadWirelessStatusIndicatorSpriteGfx(); @@ -2242,7 +2242,7 @@ static void sub_8117F20(u8 taskId) case 5: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; data->state = 10; } @@ -2335,8 +2335,8 @@ static void sub_81182DC(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A084(data->field_4, data->field_12 + 7); if (data->field_13 != 0) @@ -2371,7 +2371,7 @@ static void sub_81182DC(u8 taskId) id = ListMenu_ProcessInput(data->listTaskId); if (data->field_14 > 120) { - if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7) + if (data->field_0->arr[0].tradeStatus == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7) { if (sub_8119FB0(&data->field_0->arr[0].unk.gname, data->field_12 + 7)) { @@ -2407,7 +2407,7 @@ static void sub_81182DC(u8 taskId) case 5: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; data->state = 12; } @@ -2549,7 +2549,7 @@ static void sub_81186E0(u8 taskId) data->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - sub_811A5E4(data->field_0->arr, 8); + BlankUnkStruct_x20Array(data->field_0->arr, 8); gUnknown_203B058 = 0x40; data->field_20 = sub_8119E84(data->field_C, data->field_4, 9); ZeroUnionObjWork(data->unionObjs); @@ -2567,9 +2567,9 @@ static void sub_81186E0(u8 taskId) sub_800B1F4(); OpenLink(); sub_80FBC00(); - sub_811A5E4(&data->field_8->arr[0], 1); - sub_811A650(data->field_4->arr, 4); - sub_811A650(data->field_C->arr, 4); + BlankUnkStruct_x20Array(&data->field_8->arr[0], 1); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x1CArray(data->field_C->arr, 4); gSpecialVar_Result = 0; data->state = 3; break; @@ -2760,7 +2760,7 @@ static void sub_81186E0(u8 taskId) sub_8118664(6, gUnknown_8457B04[id][playerGender]); break; case 6: - var5 = sub_811A218(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C); if (var5 != -1) { if (gReceivedRemoteLinkPlayers == 0) @@ -3089,20 +3089,20 @@ static void sub_81186E0(u8 taskId) } break; case 42: - if (sub_80F9800()->species == SPECIES_NONE) + if (GetHostRFUtgtGname()->species == SPECIES_NONE) { data->state = 43; } else { - if (sub_80F9800()->species == SPECIES_EGG) + if (GetHostRFUtgtGname()->species == SPECIES_EGG) { StringCopy(gStringVar4, gUnknown_8458DE8); } else { - StringCopy(gStringVar1, gSpeciesNames[sub_80F9800()->species]); - ConvertIntToDecimalStringN(gStringVar2, sub_80F9800()->level, STR_CONV_MODE_LEFT_ALIGN, 3); + StringCopy(gStringVar1, gSpeciesNames[GetHostRFUtgtGname()->species]); + ConvertIntToDecimalStringN(gStringVar2, GetHostRFUtgtGname()->level, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gUnknown_8458DBC); } sub_8118664(44, gStringVar4); @@ -3113,7 +3113,7 @@ static void sub_81186E0(u8 taskId) data->state = 47; break; case 47: - var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54); if (var5 != -1) { if (var5 == -2 || var5 == 3) @@ -3149,7 +3149,7 @@ static void sub_81186E0(u8 taskId) } break; case 52: - var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04); if (var5 != -1) { switch (var5) @@ -3202,7 +3202,7 @@ static void sub_81186E0(u8 taskId) data->state = 48; break; case 48: - var5 = sub_811A2EC(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &gUnknown_8456F7C, data->field_0); + var5 = TradeBoardMenuHandler(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &sTradeBoardListMenuTemplate, data->field_0); if (var5 != -1) { switch (var5) @@ -3214,19 +3214,19 @@ static void sub_81186E0(u8 taskId) data->state = 4; break; default: - switch (sub_811ADD0(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species)) + switch (IsRequestedTypeAndSpeciesInPlayerParty(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species)) { - case 0: + case UR_TRADE_MATCH: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); sub_8118664(49, gUnknown_8458E70); taskData[1] = var5; break; - case 1: + case UR_TRADE_NOTYPE: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]); sub_8118664(46, gUnknown_8458ED0); break; - case 2: + case UR_TRADE_NOEGG: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]); sub_8118664(46, gUnknown_8458F04); @@ -3368,13 +3368,13 @@ static void sub_81199FC(u8 taskId) break; case 2: structPtr->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); - sub_811A650(structPtr->field_4->arr, 4); + BlankUnkStruct_x1CArray(structPtr->field_4->arr, 4); structPtr->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); - sub_811A650(structPtr->field_C->arr, 4); + BlankUnkStruct_x1CArray(structPtr->field_C->arr, 4); structPtr->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); - sub_811A5E4(structPtr->field_0->arr, 8); + BlankUnkStruct_x20Array(structPtr->field_0->arr, 8); structPtr->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - sub_811A5E4(&structPtr->field_8->arr[0], 1); + BlankUnkStruct_x20Array(&structPtr->field_8->arr[0], 1); structPtr->field_20 = sub_8119E84(structPtr->field_C, structPtr->field_4, 10); structPtr->state = 3; break; @@ -3387,7 +3387,7 @@ static void sub_81199FC(u8 taskId) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) { - if (structPtr->field_0->arr[i].field_1A_0 == 1) + if (structPtr->field_0->arr[i].tradeStatus == 1) { IntlConvPartnerUname(text, structPtr->field_0->arr[i]); if (PlayerHasMetTrainerBefore(ReadAsU16(structPtr->field_0->arr[i].unk.gname.unk_00.playerTrainerId), text)) @@ -3439,25 +3439,25 @@ static u8 sub_8119B94(void) for (i = 0; i < 4; i++) { - if (sub_811A694(&structPtr->field_C->arr[i].unk0, &gUnknown_8457034) == TRUE) + if (AreUnkSharedObjectsDifferent(&structPtr->field_C->arr[i].unk0, &sUnkStruct_Shared_Dummy) == TRUE) { structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0; structPtr->field_8->arr[0].field_18 = 0; - structPtr->field_8->arr[0].field_1A_0 = 1; + structPtr->field_8->arr[0].tradeStatus = 1; structPtr->field_8->arr[0].field_1B = 1; return 4; } } for (j = 0; j < 8; j++) { - if (structPtr->field_0->arr[j].field_1A_0 != 0) + if (structPtr->field_0->arr[j].tradeStatus != 0) { i = sub_811A748(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]); if (i != 0xFF) { - if (structPtr->field_0->arr[j].field_1A_0 == 1) + if (structPtr->field_0->arr[j].tradeStatus == 1) { - if (sub_811A6DC(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0)) + if (AreUnionRoomPlayerGnamesDifferent(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0)) { structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0; structPtr->field_0->arr[j].field_1B = 0x40; @@ -3472,27 +3472,27 @@ static u8 sub_8119B94(void) } else { - structPtr->field_0->arr[j].field_1A_0 = 1; + structPtr->field_0->arr[j].tradeStatus = 1; structPtr->field_0->arr[j].field_1B = 0; r7 = 2; } structPtr->field_0->arr[j].field_18 = 0; } - else if (structPtr->field_0->arr[j].field_1A_0 != 2) + else if (structPtr->field_0->arr[j].tradeStatus != 2) { structPtr->field_0->arr[j].field_18++; if (structPtr->field_0->arr[j].field_18 >= 600) { - structPtr->field_0->arr[j].field_1A_0 = 2; + structPtr->field_0->arr[j].tradeStatus = 2; r7 = 2; } } - else if (structPtr->field_0->arr[j].field_1A_0 == 2) + else if (structPtr->field_0->arr[j].tradeStatus == 2) { structPtr->field_0->arr[j].field_18++; if (structPtr->field_0->arr[j].field_18 >= 900) { - sub_811A5E4(&structPtr->field_0->arr[j], 1); + BlankUnkStruct_x20Array(&structPtr->field_0->arr[j], 1); } } } @@ -3511,35 +3511,35 @@ static void sub_8119D34(u8 taskId) s32 i, j; struct UnkStruct_Shared sp0; struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data; - bool8 r4; + bool8 parent_child; for (i = 0; i < 4; i++) { - r4 = sub_80FCC3C(&sp0.gname, sp0.playerName, i); - if (!sub_8116F28(sp0.gname.unk_0a_0, gTasks[taskId].data[4])) + parent_child = sub_80FCC3C(&sp0.gname, sp0.playerName, i); + if (!sub_8116F28(sp0.gname.activity, gTasks[taskId].data[4])) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } if (sp0.gname.unk_00.unk_00_0 == 1) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } - if (!r4) + if (!parent_child) { for (j = 0; j < i; j++) { - if (!sub_811A694(&ptr[1]->arr[j].unk0, &sp0)) + if (!AreUnkSharedObjectsDifferent(&ptr[1]->arr[j].unk0, &sp0)) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } } ptr[1]->arr[i].unk0 = sp0; - ptr[1]->arr[i].unk18 = sub_811A694(&ptr[1]->arr[i].unk0, &gUnknown_8457034); + ptr[1]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[1]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } else { ptr[0]->arr[i].unk0 = sp0; - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } } @@ -3562,18 +3562,18 @@ static void sub_8119EB8(u8 taskId) for (i = 0; i < 4; i++) { sub_80FCC3C(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i); - if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.unk_0a_0, gTasks[taskId].data[2])) + if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.activity, gTasks[taskId].data[2])) { - ptr[0]->arr[i].unk0 = gUnknown_8457034; + ptr[0]->arr[i].unk0 = sUnkStruct_Shared_Dummy; } for (j = 0; j < i; j++) { - if (!sub_811A694(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0)) + if (!AreUnkSharedObjectsDifferent(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0)) { - ptr[0]->arr[i].unk0 = gUnknown_8457034; + ptr[0]->arr[i].unk0 = sUnkStruct_Shared_Dummy; } } - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } @@ -3618,7 +3618,7 @@ static void sub_8119FD8(u8 taskId) { sub_8119FB0(&ptr[0]->arr[i].unk0.gname, gTasks[taskId].data[2]); } - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } @@ -3683,31 +3683,31 @@ static bool8 PrintOnTextbox(u8 *textState, const u8 *str) return FALSE; } -static s8 sub_811A14C(u8 *arg0, bool32 arg1) +static s8 sub_811A14C(u8 *state_p, bool32 no_draw) { s8 r1; - switch (*arg0) + switch (*state_p) { case 0: - if (arg1) + if (no_draw) { return -3; } DisplayYesNoMenuDefaultYes(); - (*arg0)++; + (*state_p)++; break; case 1: - if (arg1) + if (no_draw) { DestroyYesNoMenu(); - *arg0 = 0; + *state_p = 0; return -3; } r1 = Menu_ProcessInputNoWrapClearOnChoose(); if (r1 == -1 || r1 == 0 || r1 == 1) { - *arg0 = 0; + *state_p = 0; return r1; } break; @@ -3715,54 +3715,54 @@ static s8 sub_811A14C(u8 *arg0, bool32 arg1) return -2; } -static u8 sub_811A1AC(const struct WindowTemplate * template) +static u8 CreateTradeBoardWindow(const struct WindowTemplate * template) { u8 windowId = AddWindow(template); DrawStdWindowFrame(windowId, FALSE); FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); - sub_811A444(windowId, 0, gUnknown_8459378, 8, 1, 6); + UR_AddTextPrinterParameterized(windowId, 0, gUnknown_8459378, 8, 1, 6); PutWindowTilemap(windowId); CopyWindowToVram(windowId, 2); return windowId; } -static void sub_811A1FC(u8 windowId) +static void DeleteTradeBoardWindow(u8 windowId) { ClearStdWindowAndFrame(windowId, TRUE); RemoveWindow(windowId); } -static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate) +static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate) { - s32 r1, r8; + s32 input; - switch (*arg0) + switch (*state_p) { case 0: - *arg1 = AddWindow(winTemplate); - DrawStdWindowFrame(*arg1, FALSE); + *win_id_p = AddWindow(winTemplate); + DrawStdWindowFrame(*win_id_p, FALSE); gMultiuseListMenuTemplate = *menuTemplate; - gMultiuseListMenuTemplate.windowId = *arg1; - *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); - CopyWindowToVram(*arg1, TRUE); - (*arg0)++; + gMultiuseListMenuTemplate.windowId = *win_id_p; + *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + CopyWindowToVram(*win_id_p, TRUE); + (*state_p)++; break; case 1: - r8 = ListMenu_ProcessInput(*arg2); + input = ListMenu_ProcessInput(*list_menu_id_p); if (JOY_NEW(A_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - *arg0 = 0; - return r8; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + *state_p = 0; + return input; } else if (JOY_NEW(B_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + *state_p = 0; return -2; } break; @@ -3771,46 +3771,46 @@ static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate return -1; } -static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6) +static s32 TradeBoardMenuHandler(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, u8 *trade_board_win_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * traders) { s32 input; s32 r4; - switch (*arg0) + switch (*state_p) { case 0: - *arg3 = sub_811A1AC(&gUnknown_8456F1C); - *arg1 = AddWindow(winTemplate); - DrawStdWindowFrame(*arg1, FALSE); + *trade_board_win_id_p = CreateTradeBoardWindow(&sTradeBoardWindowTemplate); + *win_id_p = AddWindow(winTemplate); + DrawStdWindowFrame(*win_id_p, FALSE); gMultiuseListMenuTemplate = *menuTemplate; - gMultiuseListMenuTemplate.windowId = *arg1; - *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1); - CopyWindowToVram(*arg1, TRUE); - (*arg0)++; + gMultiuseListMenuTemplate.windowId = *win_id_p; + *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1); + CopyWindowToVram(*win_id_p, TRUE); + (*state_p)++; break; case 1: - input = ListMenu_ProcessInput(*arg2); + input = ListMenu_ProcessInput(*list_menu_id_p); if (JOY_NEW(A_BUTTON | B_BUTTON)) { if (input == 8 || JOY_NEW(B_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - sub_811A1FC(*arg3); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + DeleteTradeBoardWindow(*trade_board_win_id_p); + *state_p = 0; return -2; } else { - r4 = sub_811AD7C(arg6->arr, input); + r4 = GetIndexOfNthTradeBoardOffer(traders->arr, input); if (r4 >= 0) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - sub_811A1FC(*arg3); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + DeleteTradeBoardWindow(*trade_board_win_id_p); + *state_p = 0; return r4; } else @@ -3838,7 +3838,7 @@ static void sub_811A41C(void) EnableBothScriptContexts(); } -static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) +static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) { struct TextPrinterTemplate printerTemplate; @@ -3908,32 +3908,32 @@ static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 co AddTextPrinter(&printerTemplate, 0xFF, NULL); } -static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count) +static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * arg0, u8 count) { s32 i; for (i = 0; i < count; i++) { - arg0[i].unk = gUnknown_8457034; + arg0[i].unk = sUnkStruct_Shared_Dummy; arg0[i].field_18 = 0xFF; - arg0[i].field_1A_0 = 0; + arg0[i].tradeStatus = 0; arg0[i].field_1A_1 = 0; arg0[i].field_1B = 0; } } -static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count) +static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * arg0, u8 count) { s32 i; for (i = 0; i < 4; i++) { - arg0[i].unk0 = gUnknown_8457034; - arg0[i].unk18 = 0; + arg0[i].unk0 = sUnkStruct_Shared_Dummy; + arg0[i].unk18 = FALSE; } } -static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1) +static bool8 AreUnkSharedObjectsDifferent(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1) { s32 i; @@ -3956,11 +3956,11 @@ static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_ return FALSE; } -static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1) +static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1) { s32 i; - if (arg0->gname.unk_0a_0 != arg1->gname.unk_0a_0) + if (arg0->gname.activity != arg1->gname.activity) { return TRUE; } @@ -3998,7 +3998,7 @@ static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1) for (i = 0; i < 4; i++) { - if (arg1[i].unk18 && !sub_811A694(&arg0->unk, &arg1[i].unk0)) + if (arg1[i].unk18 && !AreUnkSharedObjectsDifferent(&arg0->unk, &arg1[i].unk0)) { result = i; arg1[i].unk18 = FALSE; @@ -4016,11 +4016,11 @@ static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, { for (i = 0; i < arg2; i++) { - if (arg0[i].field_1A_0 == 0) + if (arg0[i].tradeStatus == 0) { arg0[i].unk = arg1->unk0; arg0[i].field_18 = 0; - arg0[i].field_1A_0 = 1; + arg0[i].tradeStatus = 1; arg0[i].field_1B = 64; arg1->unk18 = FALSE; return i; @@ -4039,18 +4039,18 @@ static void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar4, gUnknown_84571B0); - sub_811A444(arg0, 0, gStringVar4, arg1, arg2, 0); + UR_AddTextPrinterParameterized(arg0, 0, gStringVar4, arg1, arg2, 0); arg1 += 18; - r2 = arg3->unk.gname.unk_0a_0; - if (arg3->field_1A_0 == 1 && !(r2 & 0x40)) + r2 = arg3->unk.gname.activity; + if (arg3->tradeStatus == 1 && !(r2 & 0x40)) { IntlConvPartnerUname(sp10, *arg3); - sub_811A444(arg0, 2, sp10, arg1, arg2, arg4); + UR_AddTextPrinterParameterized(arg0, 2, sp10, arg1, arg2, arg4); ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gUnknown_84571B4); StringAppend(gStringVar4, sp0); arg1 += 77; - sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4); + UR_AddTextPrinterParameterized(arg0, 0, gStringVar4, arg1, arg2, arg4); } } @@ -4059,15 +4059,15 @@ static void sub_811A910(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 u8 sp0[6]; u8 sp10[30]; - if (arg3->field_1A_0 == 1) + if (arg3->tradeStatus == 1) { IntlConvPartnerUname(sp10, *arg3); - sub_811A444(windowId, 2, sp10, x, y, arg4); + UR_AddTextPrinterParameterized(windowId, 2, sp10, x, y, arg4); ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gUnknown_84571B4); StringAppend(gStringVar4, sp0); x += 71; - sub_811A444(windowId, 0, gStringVar4, x, y, arg4); + UR_AddTextPrinterParameterized(windowId, 0, gStringVar4, x, y, arg4); } } @@ -4124,7 +4124,7 @@ static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 play { IntlConvPartnerUname(gStringVar1, *r5); r2 = PlayerHasMetTrainerBefore(ReadAsU16(r5->unk.gname.unk_00.playerTrainerId), gStringVar1); - if (r5->unk.gname.unk_0a_0 == 0x45) + if (r5->unk.gname.activity == 0x45) { StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[r2][playerGender]); return 2; @@ -4142,7 +4142,7 @@ static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 play { playerGender = (r5->unk.gname.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1; } - switch (r5->unk.gname.unk_0a_0 & 0x3F) + switch (r5->unk.gname.activity & 0x3F) { case 1: StringExpandPlaceholders(gStringVar4, gUnknown_8458758[playerGender][Random() % 4]); @@ -4169,40 +4169,40 @@ static void nullsub_92(u8 windowId, s32 itemId, u8 y) } -static void sub_811ABE4(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx) +static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx) { u8 level_t[4]; u16 species = gname->species; u8 type = gname->type; u8 level = gname->level; - sub_811A444(windowId, 2, uname, 8, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, uname, 8, y, colorIdx); if (species == SPECIES_EGG) { - sub_811A444(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx); } else { BlitMoveInfoIcon(windowId, type + 1, 0x44, y); - sub_811A444(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx); ConvertIntToDecimalStringN(level_t, level, STR_CONV_MODE_LEFT_ALIGN, 3); - sub_811A444(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx); } } -static void sub_811ACA4(u8 windowId, s32 itemId, u8 y) +static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y) { struct UnkStruct_Leader * leader = sUnionRoomMain.leader; struct GFtgtGname * rfu; s32 i, j; u8 uname[8]; - if (itemId == -3 && y == gUnknown_8456F7C.upText_Y) + if (itemId == -3 && y == sTradeBoardListMenuTemplate.upText_Y) { - rfu = sub_80F9800(); + rfu = GetHostRFUtgtGname(); if (rfu->species != SPECIES_NONE) { - sub_811ABE4(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5); + TradeBoardPrintItemInfo(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5); } } else @@ -4210,28 +4210,28 @@ static void sub_811ACA4(u8 windowId, s32 itemId, u8 y) j = 0; for (i = 0; i < 8; i++) { - if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE) + if (leader->field_0->arr[i].tradeStatus == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE) { j++; } if (j == itemId + 1) { IntlConvPartnerUname(uname, leader->field_0->arr[i]); - sub_811ABE4(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6); + TradeBoardPrintItemInfo(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6); break; } } } } -static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1) +static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1) { s32 i; s32 j = 0; for (i = 0; i < 8; i++) { - if (arg[i].field_1A_0 == 1 && arg[i].unk.gname.species != SPECIES_NONE) + if (arg[i].tradeStatus == 1 && arg[i].unk.gname.species != SPECIES_NONE) { j++; } @@ -4249,7 +4249,7 @@ static s32 GetUnionRoomPlayerGender(s32 arg1, struct UnkStruct_Main0 * arg0) return arg0->arr[arg1].unk.gname.playerGender; } -static s32 sub_811ADD0(u32 type, u32 species) +static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species) { s32 i; @@ -4260,10 +4260,10 @@ static s32 sub_811ADD0(u32 type, u32 species) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); if (species == SPECIES_EGG) { - return 0; + return UR_TRADE_MATCH; } } - return 2; + return UR_TRADE_NOEGG; } else { @@ -4272,10 +4272,10 @@ static s32 sub_811ADD0(u32 type, u32 species) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type) { - return 0; + return UR_TRADE_MATCH; } } - return 1; + return UR_TRADE_NOTYPE; } } diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 15601c028..fb5860ef8 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -207,7 +207,7 @@ void EnterUnionRoomChat(void) sWork = Alloc(sizeof(struct UnionRoomChat)); InitChatWork(sWork); gKeyRepeatStartDelay = 20; - sub_812B4AC(); + HelpSystem_DisableToggleWithRButton(); SetVBlankCallback(NULL); SetMainCallback2(CB2_LoadInterface); } @@ -893,7 +893,7 @@ static void ChatEntryRoutine_SaveAndExit(void) case 13: if (!gPaletteFade.active) { - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); UnionRoomChat_FreeGraphicsWork(); FreeChatWork(); SetMainCallback2(CB2_ReturnToField); @@ -914,7 +914,7 @@ static bool32 TypeChatMessage_HandleDPad(void) { if (JOY_REPT(DPAD_UP)) { - if (sWork->currentRow) + if (sWork->currentRow > 0) sWork->currentRow--; else sWork->currentRow = sKeyboardPageMaxRow[sWork->currentPage]; @@ -938,7 +938,7 @@ static bool32 TypeChatMessage_HandleDPad(void) { if (JOY_REPT(DPAD_LEFT)) { - if (sWork->currentCol) + if (sWork->currentCol > 0) sWork->currentCol--; else sWork->currentCol = 4; diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 9be2823aa..919ea1e93 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -364,12 +364,12 @@ void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx) u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1) { - u32 r8 = unk20->unk.gname.unk_0a_0; + u32 r8 = unk20->unk.gname.activity; s32 i, j, k; for (i = 0; i < NELEMS(gUnknown_846FAC0); i++) { - if (r8 == gUnknown_846FAC0[i][0] && unk20->field_1A_0 == 1) + if (r8 == gUnknown_846FAC0[i][0] && unk20->tradeStatus == 1) { if (gUnknown_846FAC0[i][2] == 0) { |