summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-06-03 23:27:19 -0700
committerYamaArashi <shadow962@live.com>2016-06-05 13:43:46 -0700
commit2998cc719a41e38568468006d41539d1886412df (patch)
tree8cd0b9e274caf61efd70c6ace731637ad16e3df6
parent2405230037bdc7804834eb10aed91bd538dabb4e (diff)
link.c
-rw-r--r--Makefile2
-rw-r--r--asm/rom2.s4313
-rw-r--r--asm/rom3.s234
-rw-r--r--asm/rom5.s216
-rw-r--r--charmap.txt1
-rw-r--r--data/data2.s16
-rw-r--r--ewram_syms.txt9
-rw-r--r--generated.mk10
-rw-r--r--graphics/interface/link_test_digits.pal19
-rw-r--r--graphics/interface/link_test_digits.pngbin0 -> 269 bytes
-rw-r--r--include/gba/io_reg.h38
-rw-r--r--include/gba/types.h46
-rw-r--r--include/global.h6
-rw-r--r--include/link.h182
-rw-r--r--include/link/.gitignore2
-rw-r--r--include/main.h6
-rw-r--r--include/task.h4
-rw-r--r--include/text.h1
-rw-r--r--iwram_syms.txt2
-rw-r--r--ld_script.txt14
-rw-r--r--src/link.c1810
-rw-r--r--src/main.c38
-rw-r--r--src/string_util.c15
-rw-r--r--src/text.c4
24 files changed, 2385 insertions, 4603 deletions
diff --git a/Makefile b/Makefile
index aad173523..38e8c1ff2 100644
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@ PREPROC := tools/preproc/preproc
C_SRCS := $(wildcard src/*.c)
C_OBJS := $(C_SRCS:%.c=%.o)
-ASM_OBJS := asm/crt0.o asm/rom2.o asm/rom3.o asm/rom4.o asm/rom5.o \
+ASM_OBJS := asm/crt0.o asm/rom3.o asm/rom4.o asm/rom5.o \
asm/libgcnmultiboot.o asm/m4a_1.o asm/m4a_3.o asm/libagbsyscall.o asm/libc.o
DATA_ASM_OBJS := data/data1.o data/data2.o data/graphics.o data/sound_data.o
diff --git a/asm/rom2.s b/asm/rom2.s
deleted file mode 100644
index c05ebd17e..000000000
--- a/asm/rom2.s
+++ /dev/null
@@ -1,4313 +0,0 @@
- .include "asm/macros.s"
-
- .syntax unified
-
- .text
-
- thumb_func_start Task_DestroySelf
-Task_DestroySelf: @ 8007080
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- pop {r0}
- bx r0
- thumb_func_end Task_DestroySelf
-
- thumb_func_start sub_8007090
-sub_8007090: @ 8007090
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- lsls r1, 24
- lsrs r5, r1, 24
- mov r8, r5
- lsls r2, 24
- lsrs r6, r2, 24
- lsls r3, 24
- lsrs r7, r3, 24
- ldr r0, _080070E0
- lsls r1, r4, 4
- movs r2, 0x20
- bl gpu_pal_apply
- ldr r2, _080070E4
- ldr r0, _080070E8
- str r0, [r2]
- lsls r0, r7, 14
- movs r1, 0xC0
- lsls r1, 19
- adds r0, r1
- str r0, [r2, 0x4]
- ldr r0, _080070EC
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- ldr r0, _080070F0
- str r6, [r0]
- str r4, [r0, 0x4]
- cmp r5, 0x2
- beq _08007104
- cmp r5, 0x2
- bgt _080070F4
- cmp r5, 0x1
- beq _080070FC
- b _0800711A
- .align 2, 0
-_080070E0: .4byte gUnknown_081E7330
-_080070E4: .4byte 0x040000d4
-_080070E8: .4byte gUnknown_081E7350
-_080070EC: .4byte 0x80000110
-_080070F0: .4byte 0x03002fb0
-_080070F4:
- mov r0, r8
- cmp r0, 0x3
- beq _0800710C
- b _0800711A
-_080070FC:
- ldr r2, _08007100
- b _0800710E
- .align 2, 0
-_08007100: .4byte 0x0400000a
-_08007104:
- ldr r2, _08007108
- b _0800710E
- .align 2, 0
-_08007108: .4byte 0x0400000c
-_0800710C:
- ldr r2, _08007124
-_0800710E:
- lsls r0, r6, 8
- movs r1, 0x1
- orrs r0, r1
- lsls r1, r7, 2
- orrs r0, r1
- strh r0, [r2]
-_0800711A:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08007124: .4byte 0x0400000e
- thumb_func_end sub_8007090
-
- thumb_func_start sub_8007128
-sub_8007128: @ 8007128
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- mov r8, r0
- adds r5, r1, 0
- adds r4, r2, 0
- adds r6, r3, 0
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- lsls r5, 24
- lsrs r5, 24
- lsls r4, 24
- lsrs r4, 24
- lsls r6, 24
- lsrs r6, 24
- ldr r0, _0800718C
- mov r2, r8
- lsls r1, r2, 4
- movs r2, 0x20
- bl gpu_pal_apply
- ldr r2, _08007190
- ldr r0, _08007194
- str r0, [r2]
- lsls r0, r6, 14
- movs r1, 0xC0
- lsls r1, 19
- adds r0, r1
- str r0, [r2, 0x4]
- ldr r0, _08007198
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- ldr r0, _0800719C
- str r4, [r0]
- mov r1, r8
- str r1, [r0, 0x4]
- ldr r0, _080071A0
- lsls r5, 2
- adds r5, r0
- ldr r0, [r5]
- lsls r4, 8
- lsls r6, 2
- orrs r4, r6
- strh r4, [r0]
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800718C: .4byte gUnknown_081E7330
-_08007190: .4byte 0x040000d4
-_08007194: .4byte gUnknown_081E7350
-_08007198: .4byte 0x80000110
-_0800719C: .4byte 0x03002fb0
-_080071A0: .4byte gBGControlRegs
- thumb_func_end sub_8007128
-
- thumb_func_start sub_80071A4
-sub_80071A4: @ 80071A4
- push {r4-r6,lr}
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetTasks
- ldr r0, _08007248
- bl SetVBlankCallback
- ldr r4, _0800724C
- adds r0, r4, 0
- bl SetUpWindowConfig
- adds r0, r4, 0
- bl sub_8071C4C
- bl sub_8007CEC
- ldr r1, _08007250
- ldr r2, _08007254
- adds r0, r2, 0
- strh r0, [r1]
- bl sub_8007378
- ldr r0, _08007258
- ldrh r0, [r0, 0x20]
- bl SeedRng
- movs r4, 0
- ldr r6, _0800725C
- movs r5, 0xFF
-_080071E4:
- bl Random
- adds r1, r4, r6
- lsls r0, 16
- lsrs r0, 16
- ands r0, r5
- strb r0, [r1]
- adds r4, 0x1
- cmp r4, 0x3
- ble _080071E4
- movs r0, 0
- movs r1, 0x2
- movs r2, 0x4
- movs r3, 0
- bl sub_8007090
- movs r1, 0x80
- lsls r1, 19
- movs r2, 0xAA
- lsls r2, 5
- adds r0, r2, 0
- strh r0, [r1]
- ldr r0, _08007260
- movs r1, 0
- bl CreateTask
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl fade_and_return_progress_probably
- ldr r1, _08007264
- movs r0, 0
- str r0, [r1]
- bl sub_8007280
- ldr r0, _08007268
- movs r1, 0
- bl CreateTask
- ldr r0, _0800726C
- bl SetMainCallback2
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08007248: .4byte sub_8007300
-_0800724C: .4byte gWindowConfig_81E6CE4
-_08007250: .4byte 0x03002b74
-_08007254: .4byte 0x00001111
-_08007258: .4byte 0x03001770
-_0800725C: .4byte 0x02024eae
-_08007260: .4byte Task_DestroySelf
-_08007264: .4byte 0x03000444
-_08007268: .4byte Task_LinkTest
-_0800726C: .4byte CB2_80075CC
- thumb_func_end sub_80071A4
-
- thumb_func_start sub_8007270
-sub_8007270: @ 8007270
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _0800727C
- strh r0, [r1, 0x18]
- bx lr
- .align 2, 0
-_0800727C: .4byte 0x03002a00
- thumb_func_end sub_8007270
-
- thumb_func_start sub_8007280
-sub_8007280: @ 8007280
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- ldr r3, _080072EC
- ldr r2, _080072F0
- ldrb r1, [r2, 0xA]
- ldrb r0, [r2, 0xB]
- lsls r0, 8
- orrs r1, r0
- ldrb r0, [r2, 0xC]
- lsls r0, 16
- orrs r1, r0
- ldrb r0, [r2, 0xD]
- lsls r0, 24
- orrs r1, r0
- str r1, [r3, 0x4]
- movs r4, 0
- adds r6, r2, 0
- ldr r7, _080072F4
- ldr r0, _080072F8
- mov r12, r0
- ldr r1, _080072FC
- mov r8, r1
- adds r5, r3, 0
- adds r5, 0x8
-_080072B2:
- adds r0, r4, r5
- adds r1, r4, r2
- ldrb r1, [r1]
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0xA
- ble _080072B2
- ldrb r0, [r6, 0x8]
- movs r2, 0
- strb r0, [r3, 0x13]
- ldrh r0, [r7]
- str r0, [r3, 0x14]
- mov r4, r12
- ldrb r0, [r4]
- strh r0, [r3, 0x1A]
- mov r1, r8
- ldrb r0, [r1]
- movs r4, 0x80
- lsls r4, 7
- adds r1, r4, 0
- adds r0, r1
- strh r0, [r3]
- strh r2, [r3, 0x2]
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080072EC: .4byte 0x03002a00
-_080072F0: .4byte 0x02024ea4
-_080072F4: .4byte 0x03002b74
-_080072F8: .4byte gGameLanguage
-_080072FC: .4byte gGameVersion
- thumb_func_end sub_8007280
-
- thumb_func_start sub_8007300
-sub_8007300: @ 8007300
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl copy_pal_bg_faded_to_pal_ram
- pop {r0}
- bx r0
- thumb_func_end sub_8007300
-
- thumb_func_start sub_8007314
-sub_8007314: @ 8007314
- push {lr}
- ldr r3, _08007334
- ldr r1, _08007338
- ldr r2, _0800733C
- adds r0, r1, 0
- adds r0, 0xE
-_08007320:
- strh r2, [r0]
- subs r0, 0x2
- cmp r0, r1
- bge _08007320
- movs r0, 0x1
- strb r0, [r3]
- bl sub_800877C
- pop {r0}
- bx r0
- .align 2, 0
-_08007334: .4byte 0x020238c0
-_08007338: .4byte 0x03002f90
-_0800733C: .4byte 0x0000efff
- thumb_func_end sub_8007314
-
- thumb_func_start task02_080097CC
-task02_080097CC: @ 8007340
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- ldr r0, _08007370
- lsls r1, r2, 2
- adds r1, r2
- lsls r1, 3
- adds r1, r0
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x5
- bne _0800736A
- ldr r1, _08007374
- movs r0, 0x1
- strb r0, [r1]
- adds r0, r2, 0
- bl DestroyTask
-_0800736A:
- pop {r0}
- bx r0
- .align 2, 0
-_08007370: .4byte 0x03004b20
-_08007374: .4byte 0x03003040
- thumb_func_end task02_080097CC
-
- thumb_func_start sub_8007378
-sub_8007378: @ 8007378
- push {r4-r6,lr}
- bl sub_8008838
- bl sub_8007314
- ldr r1, _080073D8
- ldr r0, _080073DC
- str r0, [r1]
- ldr r0, _080073E0
- movs r1, 0
- strb r1, [r0]
- ldr r0, _080073E4
- strb r1, [r0]
- ldr r0, _080073E8
- strb r1, [r0]
- bl sub_8007F18
- ldr r0, _080073EC
- movs r1, 0
- str r1, [r0]
- ldr r0, _080073F0
- strb r1, [r0]
- ldr r0, _080073F4
- strb r1, [r0]
- ldr r0, _080073F8
- strb r1, [r0]
- ldr r6, _080073FC
- movs r2, 0
- movs r5, 0x1
- ldr r4, _08007400
- ldr r3, _08007404
-_080073B6:
- adds r0, r1, r6
- strb r5, [r0]
- adds r0, r1, r4
- strb r2, [r0]
- adds r0, r1, r3
- strb r2, [r0]
- adds r1, 0x1
- cmp r1, 0x3
- ble _080073B6
- ldr r0, _08007408
- movs r1, 0x2
- bl CreateTask
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080073D8: .4byte 0x03002fc0
-_080073DC: .4byte sub_800802C
-_080073E0: .4byte 0x03001bf8
-_080073E4: .4byte 0x0300295c
-_080073E8: .4byte 0x03002f80
-_080073EC: .4byte 0x0300042c
-_080073F0: .4byte 0x03002a68
-_080073F4: .4byte 0x03002a64
-_080073F8: .4byte 0x03002fa4
-_080073FC: .4byte 0x0300296c
-_08007400: .4byte 0x03002b78
-_08007404: .4byte 0x03002b70
-_08007408: .4byte task02_080097CC
- thumb_func_end sub_8007378
-
- thumb_func_start AllocZeroed
-AllocZeroed: @ 800740C
- push {lr}
- ldr r0, _08007420
- movs r1, 0
- strb r1, [r0]
- ldr r0, _08007424
- strb r1, [r0]
- bl sub_800871C
- pop {r0}
- bx r0
- .align 2, 0
-_08007420: .4byte 0x03002fa4
-_08007424: .4byte 0x020238c0
- thumb_func_end AllocZeroed
-
- thumb_func_start sub_8007428
-sub_8007428: @ 8007428
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- ldr r5, _080074EC
- ldr r4, _080074F0
- ldrb r0, [r5]
- ldrh r1, [r4]
- cmp r0, r1
- beq _0800744C
- ldrh r0, [r4]
- movs r1, 0x2
- movs r2, 0x3
- movs r3, 0x2
- bl sub_8007FD8
- ldrh r0, [r4]
- strb r0, [r5]
-_0800744C:
- movs r5, 0
- ldr r7, _080074F4
-_08007450:
- ldr r0, _080074F8
- adds r6, r5, r0
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 2
- adds r4, r0, r7
- ldrb r0, [r6]
- ldrh r1, [r4]
- cmp r0, r1
- beq _08007478
- ldrh r0, [r4]
- adds r2, r5, 0x4
- lsls r2, 24
- lsrs r2, 24
- movs r1, 0x2
- movs r3, 0x2
- bl sub_8007FD8
- ldrh r0, [r4]
- strb r0, [r6]
-_08007478:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x3
- bls _08007450
- bl sub_8007EE4
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0xF
- bne _080074DE
- movs r5, 0
- ldr r0, _080074F4
- mov r9, r0
- ldr r1, _080074FC
- mov r8, r1
-_08007498:
- adds r0, r7, 0
- asrs r0, r5
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _080074D4
- lsls r0, r5, 8
- ldr r1, _08007500
- adds r0, r1
- lsls r4, r5, 1
- adds r1, r4, r5
- lsls r1, 2
- add r1, r9
- ldrh r1, [r1, 0x2]
- bl sub_8007F74
- ldr r1, _08007504
- adds r4, r1
- movs r6, 0
- strh r0, [r4]
- adds r0, r5, 0
- bl sub_8007F30
- ldrh r0, [r4]
- cmp r0, r8
- beq _080074D4
- ldr r0, _08007508
- strb r6, [r0]
- ldr r0, _0800750C
- strb r6, [r0]
-_080074D4:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x3
- bls _08007498
-_080074DE:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080074EC: .4byte 0x03000448
-_080074F0: .4byte 0x030003e8
-_080074F4: .4byte 0x030003f8
-_080074F8: .4byte 0x0300044c
-_080074FC: .4byte 0x00000342
-_08007500: .4byte 0x03002b80
-_08007504: .4byte 0x03003048
-_08007508: .4byte 0x020238b4
-_0800750C: .4byte 0x020238b5
- thumb_func_end sub_8007428
-
- thumb_func_start sub_8007510
-sub_8007510: @ 8007510
- push {r4,r5,lr}
- sub sp, 0x4
- ldr r4, _080075B0
- ldrh r1, [r4, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08007526
- ldr r1, _080075B4
- movs r0, 0x1
- strb r0, [r1]
-_08007526:
- ldrh r1, [r4, 0x2C]
- movs r5, 0x2
- adds r0, r5, 0
- ands r0, r1
- cmp r0, 0
- beq _0800753A
- ldr r0, _080075B8
- ldr r1, _080075BC
- bl sub_8007D00
-_0800753A:
- ldrh r1, [r4, 0x2E]
- movs r0, 0x80
- lsls r0, 2
- ands r0, r1
- cmp r0, 0
- beq _08007556
- movs r0, 0x1
- negs r0, r0
- str r5, [sp]
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl pal_fade_maybe
-_08007556:
- ldrh r1, [r4, 0x2E]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _08007566
- movs r0, 0x1
- bl sub_8008704
-_08007566:
- ldrh r1, [r4, 0x2E]
- movs r0, 0x80
- lsls r0, 1
- ands r0, r1
- cmp r0, 0
- beq _08007578
- movs r0, 0x1
- bl sub_8125D44
-_08007578:
- ldrh r1, [r4, 0x2E]
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- beq _08007586
- bl sub_800832C
-_08007586:
- ldr r0, _080075C0
- ldrb r0, [r0]
- cmp r0, 0
- beq _080075A6
- ldr r2, [r4, 0x20]
- ldr r0, _080075C4
- ldrb r1, [r0]
- ldr r0, _080075C8
- ldr r0, [r0]
- cmp r0, 0
- bne _080075A0
- movs r0, 0x10
- orrs r1, r0
-_080075A0:
- adds r0, r2, 0
- bl sub_8008184
-_080075A6:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080075B0: .4byte 0x03001770
-_080075B4: .4byte 0x03003040
-_080075B8: .4byte 0x02004000
-_080075BC: .4byte 0x00002004
-_080075C0: .4byte 0x020238b4
-_080075C4: .4byte 0x03001bf8
-_080075C8: .4byte 0x03002fc0
- thumb_func_end sub_8007510
-
- thumb_func_start CB2_80075CC
-CB2_80075CC: @ 80075CC
- push {lr}
- bl sub_8007510
- movs r0, 0x1
- movs r1, 0x1
- movs r2, 0
- bl sub_8007428
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl fade_and_return_progress_probably
- pop {r0}
- bx r0
- thumb_func_end CB2_80075CC
-
- thumb_func_start sub_80075F0
-sub_80075F0: @ 80075F0
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r0, _08007600
- ldrb r0, [r0]
- cmp r0, 0
- bne _08007604
- movs r0, 0
- b _0800764C
- .align 2, 0
-_08007600: .4byte 0x020238c0
-_08007604:
- movs r1, 0
- ldr r5, _08007654
- ldr r3, _08007658
- movs r2, 0
-_0800760C:
- lsls r0, r1, 1
- adds r0, r3
- strh r2, [r0]
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x7
- bls _0800760C
- ldrh r0, [r4]
- strh r0, [r5]
- ldr r0, _0800765C
- ldr r0, [r0]
- movs r1, 0x40
- ands r0, r1
- cmp r0, 0
- beq _08007648
- ldr r0, _08007660
- ldr r0, [r0]
- lsls r0, 26
- lsrs r0, 30
- bl sub_80076B0
- ldr r0, _08007664
- ldr r0, [r0]
- cmp r0, 0
- beq _08007644
- bl _call_via_r0
-_08007644:
- bl sub_800854C
-_08007648:
- ldr r0, _0800765C
- ldrh r0, [r0]
-_0800764C:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08007654: .4byte 0x030029e8
-_08007658: .4byte 0x03002f90
-_0800765C: .4byte 0x03002a60
-_08007660: .4byte 0x04000128
-_08007664: .4byte 0x03002fc0
- thumb_func_end sub_80075F0
-
- thumb_func_start sub_8007668
-sub_8007668: @ 8007668
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r0, 24
- movs r5, 0
- ldr r1, _0800767C
- adds r0, r1
- strb r5, [r0]
- movs r4, 0
- adds r6, r1, 0
- b _08007688
- .align 2, 0
-_0800767C: .4byte 0x0300296c
-_08007680:
- adds r0, r4, r6
- ldrb r0, [r0]
- adds r5, r0
- adds r4, 0x1
-_08007688:
- bl sub_8008300
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- blt _08007680
- cmp r5, 0
- bne _080076A4
- ldr r1, _080076AC
- ldrb r0, [r1]
- cmp r0, 0
- bne _080076A4
- movs r0, 0x1
- strb r0, [r1]
-_080076A4:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080076AC: .4byte 0x03002fa4
- thumb_func_end sub_8007668
-
- thumb_func_start sub_80076B0
-sub_80076B0: @ 80076B0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- movs r7, 0
- ldr r0, _08007708
- mov r8, r0
-_080076C2:
- ldr r0, _0800770C
- lsls r4, r7, 1
- adds r2, r4, r0
- movs r1, 0
- strh r1, [r2]
- mov r3, r8
- adds r1, r4, r3
- ldrh r0, [r1]
- mov r9, r4
- adds r5, r7, 0x1
- str r5, [sp]
- cmp r0, 0
- bne _080076DE
- b _0800798A
-_080076DE:
- ldrh r1, [r1]
- ldr r0, _08007710
- cmp r1, r0
- bne _080076E8
- b _0800792A
-_080076E8:
- cmp r1, r0
- bgt _08007734
- ldr r0, _08007714
- cmp r1, r0
- bne _080076F4
- b _08007980
-_080076F4:
- cmp r1, r0
- bgt _08007720
- ldr r0, _08007718
- cmp r1, r0
- beq _08007788
- ldr r0, _0800771C
- cmp r1, r0
- bne _08007706
- b _08007934
-_08007706:
- b _0800798A
- .align 2, 0
-_08007708: .4byte 0x03002a20
-_0800770C: .4byte 0x03002910
-_08007710: .4byte 0x00005fff
-_08007714: .4byte 0x00004444
-_08007718: .4byte 0x00002222
-_0800771C: .4byte 0x00002ffe
-_08007720:
- ldr r0, _08007730
- cmp r1, r0
- beq _080077D8
- adds r0, 0x11
- cmp r1, r0
- beq _080077D8
- b _0800798A
- .align 2, 0
-_08007730: .4byte 0x00005555
-_08007734:
- ldr r0, _08007750
- cmp r1, r0
- bne _0800773C
- b _0800794A
-_0800773C:
- cmp r1, r0
- bgt _0800775C
- ldr r0, _08007754
- cmp r1, r0
- beq _0800780C
- ldr r0, _08007758
- cmp r1, r0
- bne _0800774E
- b _08007944
-_0800774E:
- b _0800798A
- .align 2, 0
-_08007750: .4byte 0x0000aaab
-_08007754: .4byte 0x00008888
-_08007758: .4byte 0x0000aaaa
-_0800775C:
- ldr r0, _08007770
- cmp r1, r0
- bne _08007764
- b _08007980
-_08007764:
- cmp r1, r0
- bgt _08007778
- ldr r0, _08007774
- cmp r1, r0
- beq _080077E4
- b _0800798A
- .align 2, 0
-_08007770: .4byte 0x0000cafe
-_08007774: .4byte 0x0000bbbb
-_08007778:
- ldr r0, _08007784
- cmp r1, r0
- bne _08007780
- b _0800795C
-_08007780:
- b _0800798A
- .align 2, 0
-_08007784: .4byte 0x0000cccc
-_08007788:
- bl sub_8007280
- ldr r0, _080077CC
- adds r2, r0, 0
- adds r2, 0x10
- ldr r1, _080077D0
- ldm r1!, {r3,r4,r6}
- stm r2!, {r3,r4,r6}
- ldm r1!, {r3,r5,r6}
- stm r2!, {r3,r5,r6}
- ldr r1, [r1]
- str r1, [r2]
- ldr r4, _080077D4
- adds r2, r0, 0
- adds r1, r4, 0
- ldm r1!, {r3,r5,r6}
- stm r2!, {r3,r5,r6}
- ldrh r3, [r1]
- strh r3, [r2]
- ldrb r1, [r1, 0x2]
- strb r1, [r2, 0x2]
- adds r1, r0, 0
- adds r1, 0x2C
- ldm r4!, {r2,r5,r6}
- stm r1!, {r2,r5,r6}
- ldrh r2, [r4]
- strh r2, [r1]
- ldrb r2, [r4, 0x2]
- strb r2, [r1, 0x2]
- movs r1, 0x3C
- bl sub_8007D00
- b _0800798A
- .align 2, 0
-_080077CC: .4byte 0x03002920
-_080077D0: .4byte 0x03002a00
-_080077D4: .4byte gUnknown_081E75FC
-_080077D8:
- ldr r1, _080077E0
- movs r0, 0x1
- strb r0, [r1]
- b _0800798A
- .align 2, 0
-_080077E0: .4byte 0x03002a68
-_080077E4:
- adds r1, r4, r7
- lsls r1, 2
- ldr r3, _08007808
- adds r1, r3
- movs r5, 0
- strh r5, [r1]
- mov r0, r8
- adds r0, 0x8
- adds r0, r4, r0
- ldrh r0, [r0]
- strh r0, [r1, 0x2]
- mov r0, r8
- adds r0, 0x10
- adds r0, r4, r0
- ldrh r0, [r0]
- strb r0, [r1, 0x9]
- b _0800798A
- .align 2, 0
-_08007808: .4byte 0x030003f8
-_0800780C:
- adds r0, r4, r7
- lsls r0, 2
- ldr r6, _08007848
- adds r3, r0, r6
- ldrh r1, [r3, 0x2]
- movs r0, 0x80
- lsls r0, 1
- adds r2, r6, 0
- mov r10, r2
- cmp r1, r0
- bls _08007854
- ldr r6, _0800784C
- movs r2, 0
- ldr r5, _08007850
-_08007828:
- ldrh r1, [r3]
- lsrs r1, 1
- adds r1, r2
- lsls r1, 1
- adds r1, r6
- adds r2, 0x1
- lsls r0, r2, 3
- adds r0, r4, r0
- adds r0, r5
- ldrh r0, [r0]
- strh r0, [r1]
- lsls r2, 16
- lsrs r2, 16
- cmp r2, 0x6
- bls _08007828
- b _08007882
- .align 2, 0
-_08007848: .4byte 0x030003f8
-_0800784C: .4byte 0x02000000
-_08007850: .4byte 0x03002a20
-_08007854:
- movs r2, 0
- ldr r5, _080078E8
- mov r12, r5
- adds r5, r4, 0
- adds r4, r3, 0
- ldr r6, _080078EC
- lsls r3, r7, 8
-_08007862:
- ldrh r1, [r4]
- lsrs r1, 1
- adds r1, r2
- lsls r1, 1
- adds r1, r3
- add r1, r12
- adds r2, 0x1
- lsls r0, r2, 3
- adds r0, r5, r0
- adds r0, r6
- ldrh r0, [r0]
- strh r0, [r1]
- lsls r2, 16
- lsrs r2, 16
- cmp r2, 0x6
- bls _08007862
-_08007882:
- mov r6, r9
- adds r1, r6, r7
- lsls r1, 2
- add r1, r10
- ldrh r0, [r1]
- adds r0, 0xE
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- ldrh r1, [r1, 0x2]
- cmp r0, r1
- bcc _0800798A
- ldr r0, _080078F0
- adds r0, r7, r0
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _08007920
- lsls r1, r7, 8
- ldr r0, _080078E8
- adds r5, r1, r0
- lsls r4, r7, 3
- subs r1, r4, r7
- lsls r1, 2
- ldr r0, _080078F4
- adds r1, r0
- adds r0, r5, 0
- adds r0, 0x10
- ldm r0!, {r2,r3,r6}
- stm r1!, {r2,r3,r6}
- ldm r0!, {r2,r3,r6}
- stm r1!, {r2,r3,r6}
- ldr r0, [r0]
- str r0, [r1]
- ldr r6, _080078F8
- adds r0, r5, 0
- adds r1, r6, 0
- bl strcmp
- cmp r0, 0
- bne _080078E0
- adds r0, r5, 0
- adds r0, 0x2C
- adds r1, r6, 0
- bl strcmp
- cmp r0, 0
- beq _08007900
-_080078E0:
- ldr r0, _080078FC
- bl SetMainCallback2
- b _08007908
- .align 2, 0
-_080078E8: .4byte 0x03002b80
-_080078EC: .4byte 0x03002a20
-_080078F0: .4byte 0x0300296c
-_080078F4: .4byte 0x03002970
-_080078F8: .4byte gUnknown_081E75FC
-_080078FC: .4byte sub_80085BC
-_08007900:
- lsls r0, r7, 24
- lsrs r0, 24
- bl sub_8007668
-_08007908:
- subs r2, r4, r7
- lsls r2, 2
- ldr r1, _0800791C
- adds r0, r2, r1
- adds r1, r2
- ldrb r1, [r1, 0x12]
- bl SetStringCharset
- b _0800798A
- .align 2, 0
-_0800791C: .4byte 0x03002978
-_08007920:
- lsls r0, r7, 24
- lsrs r0, 24
- bl schedule_bg_copy_tilemap_to_vram
- b _0800798A
-_0800792A:
- ldr r0, _08007930
- b _08007936
- .align 2, 0
-_08007930: .4byte 0x03002b78
-_08007934:
- ldr r0, _08007940
-_08007936:
- adds r0, r7, r0
- movs r1, 0x1
- strb r1, [r0]
- b _0800798A
- .align 2, 0
-_08007940: .4byte 0x03002b70
-_08007944:
- bl sub_8007E24
- b _0800798A
-_0800794A:
- lsls r0, r7, 24
- lsrs r0, 24
- mov r1, r8
- adds r1, 0x8
- adds r1, r4, r1
- ldrh r1, [r1]
- bl sub_80516C4
- b _0800798A
-_0800795C:
- ldr r3, _0800797C
- mov r0, r8
- adds r0, 0x8
- adds r0, r4, r0
- ldrh r2, [r0]
- lsls r2, 3
- adds r0, r2, r3
- ldr r1, [r0]
- adds r3, 0x4
- adds r2, r3
- ldrh r2, [r2]
- movs r0, 0
- bl sub_8007E88
- b _0800798A
- .align 2, 0
-_0800797C: .4byte gUnknown_081E75CC
-_08007980:
- mov r0, r8
- adds r0, 0x8
- adds r0, r4, r0
- ldrh r0, [r0]
- strh r0, [r2]
-_0800798A:
- ldr r1, [sp]
- lsls r0, r1, 16
- lsrs r7, r0, 16
- cmp r7, 0x3
- bhi _08007996
- b _080076C2
-_08007996:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80076B0
-
- thumb_func_start sub_80079A8
-sub_80079A8: @ 80079A8
- push {lr}
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, _080079CC
- cmp r2, r0
- beq _08007A70
- cmp r2, r0
- bgt _08007A00
- ldr r0, _080079D0
- cmp r2, r0
- beq _08007A5C
- cmp r2, r0
- bgt _080079DC
- ldr r0, _080079D4
- cmp r2, r0
- beq _08007A48
- ldr r0, _080079D8
- b _080079F2
- .align 2, 0
-_080079CC: .4byte 0x00006666
-_080079D0: .4byte 0x00004444
-_080079D4: .4byte 0x00002222
-_080079D8: .4byte 0x00002ffe
-_080079DC:
- ldr r0, _080079EC
- cmp r2, r0
- bne _080079E4
- b _08007AE0
-_080079E4:
- cmp r2, r0
- bgt _080079F0
- subs r0, 0x11
- b _080079F2
- .align 2, 0
-_080079EC: .4byte 0x00005566
-_080079F0:
- ldr r0, _080079FC
-_080079F2:
- cmp r2, r0
- bne _080079F8
- b _08007AE0
-_080079F8:
- b _08007B02
- .align 2, 0
-_080079FC: .4byte 0x00005fff
-_08007A00:
- ldr r0, _08007A14
- cmp r2, r0
- beq _08007AB8
- cmp r2, r0
- bgt _08007A20
- ldr r0, _08007A18
- cmp r2, r0
- beq _08007A7C
- ldr r0, _08007A1C
- b _080079F2
- .align 2, 0
-_08007A14: .4byte 0x0000aaab
-_08007A18: .4byte 0x00007777
-_08007A1C: .4byte 0x0000aaaa
-_08007A20:
- ldr r0, _08007A34
- cmp r2, r0
- beq _08007AEC
- cmp r2, r0
- bgt _08007A3C
- ldr r0, _08007A38
- cmp r2, r0
- beq _08007A9C
- b _08007B02
- .align 2, 0
-_08007A34: .4byte 0x0000cafe
-_08007A38: .4byte 0x0000bbbb
-_08007A3C:
- ldr r0, _08007A44
- cmp r2, r0
- beq _08007ACC
- b _08007B02
- .align 2, 0
-_08007A44: .4byte 0x0000cccc
-_08007A48:
- ldr r0, _08007A54
- strh r2, [r0]
- ldr r1, _08007A58
- ldrh r1, [r1]
- b _08007B00
- .align 2, 0
-_08007A54: .4byte 0x03002f90
-_08007A58: .4byte 0x03002b74
-_08007A5C:
- ldr r0, _08007A68
- strh r2, [r0]
- ldr r1, _08007A6C
- ldrh r1, [r1, 0x2C]
- b _08007B00
- .align 2, 0
-_08007A68: .4byte 0x03002f90
-_08007A6C: .4byte 0x03001770
-_08007A70:
- ldr r0, _08007A78
- movs r1, 0
- b _08007AFE
- .align 2, 0
-_08007A78: .4byte 0x03002f90
-_08007A7C:
- ldr r0, _08007A98
- strh r2, [r0]
- movs r1, 0
- adds r3, r0, 0
- movs r2, 0xEE
-_08007A86:
- adds r1, 0x1
- lsls r0, r1, 1
- adds r0, r3
- strh r2, [r0]
- lsls r1, 24
- lsrs r1, 24
- cmp r1, 0x4
- bls _08007A86
- b _08007B02
- .align 2, 0
-_08007A98: .4byte 0x03002f90
-_08007A9C:
- ldr r1, _08007AB0
- strh r2, [r1]
- ldr r2, _08007AB4
- ldrh r0, [r2, 0x2]
- strh r0, [r1, 0x2]
- ldrb r0, [r2, 0x9]
- adds r0, 0x80
- strh r0, [r1, 0x4]
- b _08007B02
- .align 2, 0
-_08007AB0: .4byte 0x03002f90
-_08007AB4: .4byte 0x030003e8
-_08007AB8:
- ldr r0, _08007AC4
- strh r2, [r0]
- ldr r1, _08007AC8
- ldrh r1, [r1]
- b _08007B00
- .align 2, 0
-_08007AC4: .4byte 0x03002f90
-_08007AC8: .4byte 0x0203855e
-_08007ACC:
- ldr r0, _08007AD8
- strh r2, [r0]
- ldr r1, _08007ADC
- ldrb r1, [r1]
- b _08007B00
- .align 2, 0
-_08007AD8: .4byte 0x03002f90
-_08007ADC: .4byte 0x03003054
-_08007AE0:
- ldr r0, _08007AE8
- strh r2, [r0]
- b _08007B02
- .align 2, 0
-_08007AE8: .4byte 0x03002f90
-_08007AEC:
- ldr r0, _08007B08
- ldrh r1, [r0]
- cmp r1, 0
- beq _08007B02
- ldr r0, _08007B0C
- ldrb r0, [r0]
- cmp r0, 0
- bne _08007B02
- ldr r0, _08007B10
-_08007AFE:
- strh r2, [r0]
-_08007B00:
- strh r1, [r0, 0x2]
-_08007B02:
- pop {r0}
- bx r0
- .align 2, 0
-_08007B08: .4byte 0x03004858
-_08007B0C: .4byte 0x03001764
-_08007B10: .4byte 0x03002f90
- thumb_func_end sub_80079A8
-
- thumb_func_start sub_8007B14
-sub_8007B14: @ 8007B14
- ldr r1, _08007B1C
- ldr r0, _08007B20
- str r0, [r1]
- bx lr
- .align 2, 0
-_08007B1C: .4byte 0x03002fc0
-_08007B20: .4byte sub_8007B44
- thumb_func_end sub_8007B14
-
- thumb_func_start sub_8007B24
-sub_8007B24: @ 8007B24
- push {lr}
- ldr r0, _08007B34
- ldr r1, [r0]
- ldr r0, _08007B38
- cmp r1, r0
- beq _08007B3C
- movs r0, 0
- b _08007B3E
- .align 2, 0
-_08007B34: .4byte 0x03002fc0
-_08007B38: .4byte sub_8007B44
-_08007B3C:
- movs r0, 0x1
-_08007B3E:
- pop {r1}
- bx r1
- thumb_func_end sub_8007B24
-
- thumb_func_start sub_8007B44
-sub_8007B44: @ 8007B44
- push {lr}
- ldr r0, _08007B58
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _08007B54
- ldr r0, _08007B5C
- bl sub_80079A8
-_08007B54:
- pop {r0}
- bx r0
- .align 2, 0
-_08007B58: .4byte 0x03002fa4
-_08007B5C: .4byte 0x0000cafe
- thumb_func_end sub_8007B44
-
- thumb_func_start sub_8007B60
-sub_8007B60: @ 8007B60
- ldr r1, _08007B68
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_08007B68: .4byte 0x03002fc0
- thumb_func_end sub_8007B60
-
- thumb_func_start sub_8007B6C
-sub_8007B6C: @ 8007B6C
- ldr r1, _08007B74
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_08007B74: .4byte 0x03002fc0
- thumb_func_end sub_8007B6C
-
- thumb_func_start sub_8007B78
-sub_8007B78: @ 8007B78
- ldr r0, _08007B84
- ldr r0, [r0]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- bx lr
- .align 2, 0
-_08007B84: .4byte 0x03002a60
- thumb_func_end sub_8007B78
-
- thumb_func_start sub_8007B88
-sub_8007B88: @ 8007B88
- push {lr}
- ldr r0, _08007B9C
- movs r1, 0
- str r1, [r0]
- ldr r0, _08007BA0
- strh r1, [r0]
- bl sub_8007378
- pop {r0}
- bx r0
- .align 2, 0
-_08007B9C: .4byte 0x03000434
-_08007BA0: .4byte 0x030029ec
- thumb_func_end sub_8007B88
-
- thumb_func_start sub_8007BA4
-sub_8007BA4: @ 8007BA4
- push {r4-r7,lr}
- movs r7, 0
- ldr r0, _08007BCC
- ldrb r4, [r0]
- cmp r4, 0x1
- bne _08007C20
- bl sub_8007B78
- lsls r0, 24
- cmp r0, 0
- bne _08007BC2
- ldr r0, _08007BD0
- strb r4, [r0]
- bl AllocZeroed
-_08007BC2:
- movs r6, 0
- ldr r4, _08007BD4
- movs r5, 0
- b _08007BEC
- .align 2, 0
-_08007BCC: .4byte 0x03002fa4
-_08007BD0: .4byte 0x0300295c
-_08007BD4: .4byte 0x03002970
-_08007BD8:
- adds r0, r4, 0
- adds r0, 0x14
- adds r0, r5, r0
- ldr r1, [r0]
- ldr r0, [r4, 0x14]
- cmp r1, r0
- bne _08007BE8
- adds r7, 0x1
-_08007BE8:
- adds r5, 0x1C
- adds r6, 0x1
-_08007BEC:
- bl sub_8007B78
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- blt _08007BD8
- bl sub_8007B78
- lsls r0, 24
- lsrs r0, 24
- cmp r7, r0
- bne _08007C10
- ldr r1, _08007C0C
- movs r0, 0x1
- b _08007C14
- .align 2, 0
-_08007C0C: .4byte 0x03000434
-_08007C10:
- ldr r1, _08007C1C
- movs r0, 0x3
-_08007C14:
- str r0, [r1]
- adds r2, r1, 0
- b _08007C38
- .align 2, 0
-_08007C1C: .4byte 0x03000434
-_08007C20:
- ldr r0, _08007C40
- ldrh r1, [r0]
- adds r1, 0x1
- strh r1, [r0]
- lsls r1, 16
- movs r0, 0x96
- lsls r0, 18
- ldr r2, _08007C44
- cmp r1, r0
- bls _08007C38
- movs r0, 0x2
- str r0, [r2]
-_08007C38:
- ldrb r0, [r2]
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08007C40: .4byte 0x030029ec
-_08007C44: .4byte 0x03000434
- thumb_func_end sub_8007BA4
-
- thumb_func_start sub_8007C48
-sub_8007C48: @ 8007C48
- push {r4-r6,lr}
- movs r6, 0
- movs r4, 0
- ldr r5, _08007C54
- b _08007C78
- .align 2, 0
-_08007C54: .4byte 0x03002970
-_08007C58:
- lsls r0, r4, 3
- subs r0, r4
- lsls r0, 2
- adds r1, r5, 0
- adds r1, 0x14
- adds r0, r1
- ldr r1, [r0]
- ldr r0, [r5, 0x14]
- cmp r1, r0
- bne _08007C72
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
-_08007C72:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
-_08007C78:
- bl sub_8007B78
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- bcc _08007C58
- bl sub_8007B78
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- bne _08007C9C
- movs r2, 0x1
- ldr r0, _08007C98
- str r2, [r0]
- b _08007CA4
- .align 2, 0
-_08007C98: .4byte 0x03000434
-_08007C9C:
- movs r2, 0
- ldr r1, _08007CAC
- movs r0, 0x3
- str r0, [r1]
-_08007CA4:
- adds r0, r2, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08007CAC: .4byte 0x03000434
- thumb_func_end sub_8007C48
-
- thumb_func_start sub_8007CB0
-sub_8007CB0: @ 8007CB0
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08007CC4
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r2, 0x4
- adds r1, r2
- ldr r0, [r1]
- bx lr
- .align 2, 0
-_08007CC4: .4byte 0x03002970
- thumb_func_end sub_8007CB0
-
- thumb_func_start sub_8007CC8
-sub_8007CC8: @ 8007CC8
- push {r4,r5,lr}
- ldr r5, _08007CE8
- movs r4, 0x3
-_08007CCE:
- adds r0, r5, 0
- movs r1, 0
- movs r2, 0x1C
- bl memset
- adds r5, 0x1C
- subs r4, 0x1
- cmp r4, 0
- bge _08007CCE
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08007CE8: .4byte 0x03002970
- thumb_func_end sub_8007CC8
-
- thumb_func_start sub_8007CEC
-sub_8007CEC: @ 8007CEC
- ldr r1, _08007CFC
- movs r0, 0
- strb r0, [r1, 0x8]
- strh r0, [r1]
- strh r0, [r1, 0x2]
- str r0, [r1, 0x4]
- bx lr
- .align 2, 0
-_08007CFC: .4byte 0x030003e8
- thumb_func_end sub_8007CEC
-
- thumb_func_start sub_8007D00
-sub_8007D00: @ 8007D00
- push {r4-r7,lr}
- adds r7, r0, 0
- adds r6, r1, 0
- ldr r4, _08007D14
- ldrb r5, [r4, 0x8]
- cmp r5, 0
- beq _08007D18
- movs r0, 0
- b _08007D56
- .align 2, 0
-_08007D14: .4byte 0x030003e8
-_08007D18:
- bl link_get_multiplayer_id
- strb r0, [r4, 0x9]
- movs r0, 0x1
- strb r0, [r4, 0x8]
- strh r6, [r4, 0x2]
- strh r5, [r4]
- adds r0, 0xFF
- cmp r6, r0
- bls _08007D30
- str r7, [r4, 0x4]
- b _08007D42
-_08007D30:
- ldr r5, _08007D5C
- cmp r7, r5
- beq _08007D40
- adds r0, r5, 0
- adds r1, r7, 0
- adds r2, r6, 0
- bl memcpy
-_08007D40:
- str r5, [r4, 0x4]
-_08007D42:
- ldr r0, _08007D60
- bl sub_80079A8
- ldr r1, _08007D64
- ldr r0, _08007D68
- str r0, [r1]
- ldr r1, _08007D6C
- movs r0, 0
- str r0, [r1]
- movs r0, 0x1
-_08007D56:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08007D5C: .4byte 0x03002a70
-_08007D60: .4byte 0x0000bbbb
-_08007D64: .4byte 0x03002fc0
-_08007D68: .4byte sub_8007D70
-_08007D6C: .4byte 0x03000428
- thumb_func_end sub_8007D00
-
- thumb_func_start sub_8007D70
-sub_8007D70: @ 8007D70
- push {lr}
- ldr r1, _08007D88
- ldr r0, [r1]
- adds r0, 0x1
- str r0, [r1]
- cmp r0, 0x2
- bls _08007D84
- ldr r1, _08007D8C
- ldr r0, _08007D90
- str r0, [r1]
-_08007D84:
- pop {r0}
- bx r0
- .align 2, 0
-_08007D88: .4byte 0x03000428
-_08007D8C: .4byte 0x03002fc0
-_08007D90: .4byte sub_8007D94
- thumb_func_end sub_8007D70
-
- thumb_func_start sub_8007D94
-sub_8007D94: @ 8007D94
- push {r4-r6,lr}
- ldr r0, _08007DE4
- ldr r5, [r0, 0x4]
- ldr r2, _08007DE8
- ldr r1, _08007DEC
- strh r1, [r2]
- movs r3, 0
- adds r4, r0, 0
- adds r6, r4, 0
- adds r2, 0x2
-_08007DA8:
- lsls r0, r3, 1
- ldrh r1, [r6]
- adds r0, r1
- adds r0, r5
- ldrb r1, [r0, 0x1]
- lsls r1, 8
- ldrb r0, [r0]
- orrs r0, r1
- strh r0, [r2]
- adds r2, 0x2
- adds r3, 0x1
- cmp r3, 0x6
- ble _08007DA8
- ldrh r0, [r4]
- adds r0, 0xE
- strh r0, [r4]
- ldrh r1, [r4, 0x2]
- lsls r0, 16
- lsrs r0, 16
- cmp r1, r0
- bhi _08007DDC
- movs r0, 0
- strb r0, [r4, 0x8]
- ldr r1, _08007DF0
- ldr r0, _08007DF4
- str r0, [r1]
-_08007DDC:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08007DE4: .4byte 0x030003e8
-_08007DE8: .4byte 0x03002f90
-_08007DEC: .4byte 0x00008888
-_08007DF0: .4byte 0x03002fc0
-_08007DF4: .4byte sub_8007DF8
- thumb_func_end sub_8007D94
-
- thumb_func_start sub_8007DF8
-sub_8007DF8: @ 8007DF8
- ldr r1, _08007E00
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_08007E00: .4byte 0x03002fc0
- thumb_func_end sub_8007DF8
-
- thumb_func_start sub_8007E04
-sub_8007E04: @ 8007E04
- push {lr}
- bl link_get_multiplayer_id
- ldr r0, _08007E1C
- bl sub_80079A8
- ldr r1, _08007E20
- ldr r0, [r1]
- adds r0, 0x1
- str r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_08007E1C: .4byte 0x00004444
-_08007E20: .4byte 0x020238bc
- thumb_func_end sub_8007E04
-
- thumb_func_start sub_8007E24
-sub_8007E24: @ 8007E24
- ldr r1, _08007E34
- movs r0, 0
- str r0, [r1]
- ldr r1, _08007E38
- ldr r0, _08007E3C
- str r0, [r1]
- bx lr
- .align 2, 0
-_08007E34: .4byte 0x020238bc
-_08007E38: .4byte 0x03002fc0
-_08007E3C: .4byte sub_8007E04
- thumb_func_end sub_8007E24
-
- thumb_func_start sub_8007E40
-sub_8007E40: @ 8007E40
- ldr r0, _08007E48
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_08007E48: .4byte 0x020238bc
- thumb_func_end sub_8007E40
-
- thumb_func_start sub_8007E4C
-sub_8007E4C: @ 8007E4C
- push {lr}
- ldr r0, _08007E58
- bl sub_80079A8
- pop {r0}
- bx r0
- .align 2, 0
-_08007E58: .4byte 0x0000aaaa
- thumb_func_end sub_8007E4C
-
- thumb_func_start link_get_multiplayer_id
-link_get_multiplayer_id: @ 8007E5C
- ldr r0, _08007E68
- ldr r0, [r0]
- lsls r0, 26
- lsrs r0, 30
- bx lr
- .align 2, 0
-_08007E68: .4byte 0x04000128
- thumb_func_end link_get_multiplayer_id
-
- thumb_func_start bitmask_all_link_players_but_self
-bitmask_all_link_players_but_self: @ 8007E6C
- push {lr}
- bl link_get_multiplayer_id
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- movs r0, 0x1
- lsls r0, r1
- movs r1, 0xF
- eors r0, r1
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end bitmask_all_link_players_but_self
-
- thumb_func_start sub_8007E88
-sub_8007E88: @ 8007E88
- push {lr}
- adds r0, r1, 0
- lsls r1, r2, 16
- lsrs r1, 16
- bl sub_8007D00
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end sub_8007E88
-
- thumb_func_start sub_8007E9C
-sub_8007E9C: @ 8007E9C
- push {lr}
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r0, _08007EB0
- ldr r0, [r0]
- cmp r0, 0
- beq _08007EB4
- movs r0, 0
- b _08007EC0
- .align 2, 0
-_08007EB0: .4byte 0x03002fc0
-_08007EB4:
- ldr r0, _08007EC4
- strb r1, [r0]
- ldr r0, _08007EC8
- bl sub_80079A8
- movs r0, 0x1
-_08007EC0:
- pop {r1}
- bx r1
- .align 2, 0
-_08007EC4: .4byte 0x03003054
-_08007EC8: .4byte 0x0000cccc
- thumb_func_end sub_8007E9C
-
- thumb_func_start sub_8007ECC
-sub_8007ECC: @ 8007ECC
- push {lr}
- movs r1, 0
- ldr r0, _08007EE0
- ldr r0, [r0]
- cmp r0, 0
- bne _08007EDA
- movs r1, 0x1
-_08007EDA:
- adds r0, r1, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08007EE0: .4byte 0x03002fc0
- thumb_func_end sub_8007ECC
-
- thumb_func_start sub_8007EE4
-sub_8007EE4: @ 8007EE4
- ldr r2, _08007F00
- ldrb r0, [r2, 0x3]
- lsls r0, 3
- ldrb r1, [r2, 0x2]
- lsls r1, 2
- orrs r0, r1
- ldrb r1, [r2, 0x1]
- lsls r1, 1
- orrs r0, r1
- ldrb r1, [r2]
- orrs r0, r1
- lsls r0, 24
- lsrs r0, 24
- bx lr
- .align 2, 0
-_08007F00: .4byte 0x030029e0
- thumb_func_end sub_8007EE4
-
- thumb_func_start schedule_bg_copy_tilemap_to_vram
-schedule_bg_copy_tilemap_to_vram: @ 8007F04
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08007F14
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- bx lr
- .align 2, 0
-_08007F14: .4byte 0x030029e0
- thumb_func_end schedule_bg_copy_tilemap_to_vram
-
- thumb_func_start sub_8007F18
-sub_8007F18: @ 8007F18
- push {lr}
- ldr r1, _08007F2C
- movs r2, 0
- adds r0, r1, 0x3
-_08007F20:
- strb r2, [r0]
- subs r0, 0x1
- cmp r0, r1
- bge _08007F20
- pop {r0}
- bx r0
- .align 2, 0
-_08007F2C: .4byte 0x030029e0
- thumb_func_end sub_8007F18
-
- thumb_func_start sub_8007F30
-sub_8007F30: @ 8007F30
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08007F48
- adds r1, r0, r1
- ldrb r0, [r1]
- cmp r0, 0
- beq _08007F44
- movs r0, 0
- strb r0, [r1]
-_08007F44:
- pop {r0}
- bx r0
- .align 2, 0
-_08007F48: .4byte 0x030029e0
- thumb_func_end sub_8007F30
-
- thumb_func_start sub_8007F4C
-sub_8007F4C: @ 8007F4C
- push {lr}
- ldr r0, _08007F6C
- ldr r1, [r0]
- movs r0, 0x20
- ands r0, r1
- cmp r0, 0
- beq _08007F68
- movs r0, 0x1C
- ands r1, r0
- cmp r1, 0x4
- bls _08007F68
- ldr r1, _08007F70
- movs r0, 0x1
- strb r0, [r1]
-_08007F68:
- pop {r0}
- bx r0
- .align 2, 0
-_08007F6C: .4byte 0x03002a60
-_08007F70: .4byte 0x03003040
- thumb_func_end sub_8007F4C
-
- thumb_func_start sub_8007F74
-sub_8007F74: @ 8007F74
- push {r4,lr}
- adds r4, r0, 0
- lsls r1, 16
- movs r3, 0
- movs r2, 0
- lsrs r1, 17
- cmp r3, r1
- bcs _08007F9A
-_08007F84:
- lsls r0, r2, 1
- adds r0, r4
- ldrh r0, [r0]
- adds r0, r3, r0
- lsls r0, 16
- lsrs r3, r0, 16
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r1
- bcc _08007F84
-_08007F9A:
- adds r0, r3, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8007F74
-
- thumb_func_start sub_8007FA4
-sub_8007FA4: @ 8007FA4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- ldr r4, _08007FD4
- ldr r3, [r4]
- lsls r3, 11
- movs r5, 0xC0
- lsls r5, 19
- adds r3, r5
- lsrs r2, 19
- adds r2, r1
- lsls r2, 1
- adds r2, r3
- ldr r1, [r4, 0x4]
- lsls r1, 12
- adds r0, 0x1
- orrs r1, r0
- strh r1, [r2]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08007FD4: .4byte 0x03002fb0
- thumb_func_end sub_8007FA4
-
- thumb_func_start sub_8007FD8
-sub_8007FD8: @ 8007FD8
- push {r4-r7,lr}
- sub sp, 0x10
- adds r5, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r7, r2, 24
- lsls r3, 24
- lsrs r3, 24
- movs r4, 0
- cmp r4, r3
- bge _08008004
- movs r2, 0xF
-_08007FF2:
- mov r0, sp
- adds r1, r0, r4
- adds r0, r5, 0
- ands r0, r2
- strb r0, [r1]
- lsrs r5, 4
- adds r4, 0x1
- cmp r4, r3
- blt _08007FF2
-_08008004:
- subs r4, r3, 0x1
- cmp r4, 0
- blt _08008024
-_0800800A:
- mov r1, sp
- adds r0, r1, r4
- ldrb r0, [r0]
- adds r1, r6, 0
- adds r2, r7, 0
- bl sub_8007FA4
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
- subs r4, 0x1
- cmp r4, 0
- bge _0800800A
-_08008024:
- add sp, 0x10
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_8007FD8
-
- thumb_func_start sub_800802C
-sub_800802C: @ 800802C
- push {lr}
- ldr r0, _0800804C
- ldr r0, [r0]
- movs r1, 0x20
- ands r0, r1
- cmp r0, 0
- beq _08008040
- ldr r0, _08008050
- bl sub_80079A8
-_08008040:
- ldr r1, _08008054
- movs r0, 0
- str r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_0800804C: .4byte 0x03002a60
-_08008050: .4byte 0x00002222
-_08008054: .4byte 0x03002fc0
- thumb_func_end sub_800802C
-
- thumb_func_start Task_LinkTest
-Task_LinkTest: @ 8008058
- push {r4-r6,lr}
- ldr r0, _08008164
- ldrb r0, [r0]
- movs r1, 0x2
- movs r2, 0x1
- movs r3, 0x2
- bl sub_8007FD8
- ldr r4, _08008168
- ldr r0, [r4]
- movs r1, 0xF
- movs r2, 0x1
- movs r3, 0x8
- bl sub_8007FD8
- ldr r0, _0800816C
- ldrb r0, [r0, 0x1]
- movs r1, 0x2
- movs r2, 0xA
- movs r3, 0x2
- bl sub_8007FD8
- ldr r0, [r4]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- movs r1, 0xF
- movs r2, 0xA
- movs r3, 0x2
- bl sub_8007FD8
- bl link_get_multiplayer_id
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0xF
- movs r2, 0xC
- movs r3, 0x2
- bl sub_8007FD8
- ldr r0, _08008170
- ldrb r0, [r0]
- movs r1, 0x19
- movs r2, 0x1
- movs r3, 0x2
- bl sub_8007FD8
- ldr r0, _08008174
- ldrb r0, [r0]
- movs r1, 0x19
- movs r2, 0x2
- movs r3, 0x2
- bl sub_8007FD8
- bl sub_8007EE4
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0xF
- movs r2, 0x5
- movs r3, 0x2
- bl sub_8007FD8
- ldr r0, _08008178
- ldr r0, [r0]
- movs r1, 0x2
- movs r2, 0xC
- movs r3, 0x8
- bl sub_8007FD8
- ldr r0, _0800817C
- ldr r0, [r0]
- movs r1, 0x2
- movs r2, 0xD
- movs r3, 0x8
- bl sub_8007FD8
- bl sub_80086BC
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x5
- movs r3, 0x1
- bl sub_8007FD8
- bl sub_80086CC
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x6
- movs r3, 0x1
- bl sub_8007FD8
- bl sub_80086F4
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x7
- movs r3, 0x1
- bl sub_8007FD8
- bl sub_8008710
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x8
- movs r3, 0x1
- bl sub_8007FD8
- movs r6, 0
- movs r5, 0x80
- lsls r5, 19
- ldr r4, _08008180
-_08008142:
- ldrh r0, [r4]
- lsrs r2, r5, 24
- movs r1, 0xA
- movs r3, 0x4
- bl sub_8007FD8
- movs r0, 0x80
- lsls r0, 17
- adds r5, r0
- adds r4, 0x2
- adds r6, 0x1
- cmp r6, 0x3
- ble _08008142
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08008164: .4byte 0x03003040
-_08008168: .4byte 0x03002a60
-_0800816C: .4byte 0x03003070
-_08008170: .4byte 0x03003060
-_08008174: .4byte 0x03004030
-_08008178: .4byte 0x03002918
-_0800817C: .4byte 0x03002964
-_08008180: .4byte 0x03003048
- thumb_func_end Task_LinkTest
-
- thumb_func_start sub_8008184
-sub_8008184: @ 8008184
- ldr r2, _08008190
- str r0, [r2]
- ldr r0, _08008194
- str r1, [r0]
- bx lr
- .align 2, 0
-_08008190: .4byte 0x03002918
-_08008194: .4byte 0x03002964
- thumb_func_end sub_8008184
-
- thumb_func_start sub_8008198
-sub_8008198: @ 8008198
- push {r4,lr}
- movs r1, 0
- movs r2, 0
- ldr r0, _080081C4
- ldrb r0, [r0]
- cmp r1, r0
- bge _080081BA
- movs r4, 0x1
- adds r3, r0, 0
-_080081AA:
- adds r0, r4, 0
- lsls r0, r2
- orrs r1, r0
- lsls r0, r1, 24
- lsrs r1, r0, 24
- adds r2, 0x1
- cmp r2, r3
- blt _080081AA
-_080081BA:
- adds r0, r1, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080081C4: .4byte 0x03002f84
- thumb_func_end sub_8008198
-
- thumb_func_start sub_80081C8
-sub_80081C8: @ 80081C8
- push {r4-r7,lr}
- ldr r1, _080081FC
- strb r0, [r1]
- bl link_get_multiplayer_id
- ldr r1, _08008200
- strb r0, [r1]
- ldr r4, _08008204
- ldr r3, _08008208
- movs r2, 0x3
-_080081DC:
- adds r0, r3, 0
- adds r1, r4, 0
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldr r1, [r1]
- str r1, [r0]
- adds r4, 0x1C
- adds r3, 0x1C
- subs r2, 0x1
- cmp r2, 0
- bge _080081DC
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080081FC: .4byte 0x03002f84
-_08008200: .4byte 0x03002fa0
-_08008204: .4byte 0x03002970
-_08008208: .4byte 0x03002fd0
- thumb_func_end sub_80081C8
-
- thumb_func_start sub_800820C
-sub_800820C: @ 800820C
- ldr r0, _08008214
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_08008214: .4byte 0x03002f84
- thumb_func_end sub_800820C
-
- thumb_func_start sub_8008218
-sub_8008218: @ 8008218
- ldr r0, _08008220
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_08008220: .4byte 0x03002fa0
- thumb_func_end sub_8008218
-
- thumb_func_start sub_8008224
-sub_8008224: @ 8008224
- push {r4-r6,lr}
- movs r5, 0
- ldr r0, _08008258
- ldrb r2, [r0]
- adds r6, r0, 0
- cmp r5, r2
- bge _0800824E
- ldr r1, _0800825C
- ldr r0, _08008260
- adds r4, r0, 0x4
- adds r3, r1, 0x4
-_0800823A:
- ldr r1, [r3]
- ldr r0, [r4]
- cmp r1, r0
- bne _08008244
- adds r5, 0x1
-_08008244:
- adds r4, 0x1C
- adds r3, 0x1C
- subs r2, 0x1
- cmp r2, 0
- bne _0800823A
-_0800824E:
- ldrb r6, [r6]
- cmp r5, r6
- beq _08008264
- movs r0, 0
- b _08008266
- .align 2, 0
-_08008258: .4byte 0x03002f84
-_0800825C: .4byte 0x03002970
-_08008260: .4byte 0x03002fd0
-_08008264:
- movs r0, 0x1
-_08008266:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_8008224
-
- thumb_func_start sub_800826C
-sub_800826C: @ 800826C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- movs r4, 0
- ldr r0, _080082D8
- ldrb r0, [r0]
- cmp r4, r0
- bcs _080082CC
- ldr r6, _080082DC
- ldr r5, _080082E0
- movs r0, 0x8
- adds r0, r6
- mov r8, r0
- adds r7, r5, 0
- adds r7, 0x8
-_0800828A:
- lsls r0, r4, 3
- subs r0, r4
- lsls r2, r0, 2
- adds r1, r6, 0x4
- adds r1, r2, r1
- adds r0, r5, 0x4
- adds r0, r2, r0
- ldr r1, [r1]
- ldr r0, [r0]
- cmp r1, r0
- bne _080082AE
- mov r1, r8
- adds r0, r2, r1
- adds r1, r2, r7
- bl StringCompareWithoutExtCtrlCodes
- cmp r0, 0
- beq _080082BE
-_080082AE:
- ldr r1, _080082E4
- movs r0, 0x1
- strb r0, [r1]
- bl AllocZeroed
- ldr r0, _080082E8
- bl SetMainCallback2
-_080082BE:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _080082D8
- ldrb r0, [r0]
- cmp r4, r0
- bcc _0800828A
-_080082CC:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080082D8: .4byte 0x03002f84
-_080082DC: .4byte 0x03002fd0
-_080082E0: .4byte 0x03002970
-_080082E4: .4byte 0x0300295c
-_080082E8: .4byte sub_80085BC
- thumb_func_end sub_800826C
-
- thumb_func_start sub_80082EC
-sub_80082EC: @ 80082EC
- ldr r0, _080082F8
- movs r1, 0
- strb r1, [r0]
- ldr r0, _080082FC
- strb r1, [r0]
- bx lr
- .align 2, 0
-_080082F8: .4byte 0x03002f84
-_080082FC: .4byte 0x03002fa0
- thumb_func_end sub_80082EC
-
- thumb_func_start sub_8008300
-sub_8008300: @ 8008300
- ldr r0, _0800830C
- ldr r0, [r0]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- bx lr
- .align 2, 0
-_0800830C: .4byte 0x03002a60
- thumb_func_end sub_8008300
-
- thumb_func_start sub_8008310
-sub_8008310: @ 8008310
- ldr r0, _0800831C
- ldr r0, [r0]
- lsrs r0, 5
- movs r1, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_0800831C: .4byte 0x03002a60
- thumb_func_end sub_8008310
-
- thumb_func_start sub_8008320
-sub_8008320: @ 8008320
- ldr r0, _08008328
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_08008328: .4byte 0x03000430
- thumb_func_end sub_8008320
-
- thumb_func_start sub_800832C
-sub_800832C: @ 800832C
- push {lr}
- ldr r2, _08008344
- ldr r1, [r2]
- cmp r1, 0
- bne _0800833E
- ldr r0, _08008348
- str r0, [r2]
- ldr r0, _0800834C
- strb r1, [r0]
-_0800833E:
- pop {r0}
- bx r0
- .align 2, 0
-_08008344: .4byte 0x03002fc0
-_08008348: .4byte sub_8008350
-_0800834C: .4byte 0x03002a64
- thumb_func_end sub_800832C
-
- thumb_func_start sub_8008350
-sub_8008350: @ 8008350
- push {lr}
- ldr r0, _0800836C
- ldrb r0, [r0]
- cmp r0, 0
- bne _08008366
- ldr r0, _08008370
- bl sub_80079A8
- ldr r1, _08008374
- ldr r0, _08008378
- str r0, [r1]
-_08008366:
- pop {r0}
- bx r0
- .align 2, 0
-_0800836C: .4byte 0x03004030
-_08008370: .4byte 0x00005fff
-_08008374: .4byte 0x03002fc0
-_08008378: .4byte sub_800837C
- thumb_func_end sub_8008350
-
- thumb_func_start sub_800837C
-sub_800837C: @ 800837C
- push {r4,lr}
- bl sub_8007B78
- lsls r0, 24
- lsrs r2, r0, 24
- movs r3, 0
- movs r1, 0
- cmp r3, r2
- bge _080083A0
- ldr r4, _080083C8
-_08008390:
- adds r0, r1, r4
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800839A
- adds r3, 0x1
-_0800839A:
- adds r1, 0x1
- cmp r1, r2
- blt _08008390
-_080083A0:
- cmp r3, r2
- bne _080083C2
- ldr r2, _080083CC
- ldrh r1, [r2]
- ldr r0, _080083D0
- ands r0, r1
- strh r0, [r2]
- ldr r0, _080083D4
- movs r4, 0x1
- strb r4, [r0]
- bl AllocZeroed
- ldr r1, _080083D8
- movs r0, 0
- str r0, [r1]
- ldr r0, _080083DC
- strb r4, [r0]
-_080083C2:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080083C8: .4byte 0x03002b78
-_080083CC: .4byte 0x020239f8
-_080083D0: .4byte 0x0000ffdf
-_080083D4: .4byte 0x03001bf8
-_080083D8: .4byte 0x03002fc0
-_080083DC: .4byte 0x03002a64
- thumb_func_end sub_800837C
-
- thumb_func_start sub_80083E0
-sub_80083E0: @ 80083E0
- push {r4,r5,lr}
- bl sub_8007B78
- lsls r0, 24
- lsrs r3, r0, 24
- movs r1, 0
- movs r2, 0
- cmp r1, r3
- bge _0800840E
- ldr r5, _08008438
- ldr r4, _0800843C
-_080083F6:
- ldrh r0, [r4, 0x1A]
- cmp r0, 0x1
- beq _08008404
- adds r0, r2, r5
- ldrb r0, [r0]
- cmp r0, 0
- beq _08008406
-_08008404:
- adds r1, 0x1
-_08008406:
- adds r4, 0x1C
- adds r2, 0x1
- cmp r2, r3
- blt _080083F6
-_0800840E:
- cmp r1, r3
- bne _08008430
- ldr r2, _08008440
- ldrh r1, [r2]
- ldr r0, _08008444
- ands r0, r1
- strh r0, [r2]
- ldr r0, _08008448
- movs r4, 0x1
- strb r4, [r0]
- bl AllocZeroed
- ldr r1, _0800844C
- movs r0, 0
- str r0, [r1]
- ldr r0, _08008450
- strb r4, [r0]
-_08008430:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08008438: .4byte 0x03002b78
-_0800843C: .4byte 0x03002970
-_08008440: .4byte 0x020239f8
-_08008444: .4byte 0x0000ffdf
-_08008448: .4byte 0x03001bf8
-_0800844C: .4byte 0x03002fc0
-_08008450: .4byte 0x03002a64
- thumb_func_end sub_80083E0
-
- thumb_func_start sub_8008454
-sub_8008454: @ 8008454
- push {lr}
- ldr r0, _08008470
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800846A
- ldr r0, _08008474
- bl sub_80079A8
- ldr r1, _08008478
- ldr r0, _0800847C
- str r0, [r1]
-_0800846A:
- pop {r0}
- bx r0
- .align 2, 0
-_08008470: .4byte 0x03004030
-_08008474: .4byte 0x00005fff
-_08008478: .4byte 0x03002fc0
-_0800847C: .4byte sub_80083E0
- thumb_func_end sub_8008454
-
- thumb_func_start sub_8008480
-sub_8008480: @ 8008480
- push {lr}
- ldr r2, _08008498
- ldr r1, [r2]
- cmp r1, 0
- bne _08008492
- ldr r0, _0800849C
- str r0, [r2]
- ldr r0, _080084A0
- strb r1, [r0]
-_08008492:
- pop {r0}
- bx r0
- .align 2, 0
-_08008498: .4byte 0x03002fc0
-_0800849C: .4byte sub_8008454
-_080084A0: .4byte 0x03002a64
- thumb_func_end sub_8008480
-
- thumb_func_start sub_80084A4
-sub_80084A4: @ 80084A4
- push {lr}
- ldr r1, _080084BC
- ldr r0, [r1]
- cmp r0, 0
- bne _080084B2
- ldr r0, _080084C0
- str r0, [r1]
-_080084B2:
- ldr r1, _080084C4
- movs r0, 0
- strb r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_080084BC: .4byte 0x03002fc0
-_080084C0: .4byte sub_80084C8
-_080084C4: .4byte 0x03002a64
- thumb_func_end sub_80084A4
-
- thumb_func_start sub_80084C8
-sub_80084C8: @ 80084C8
- push {lr}
- ldr r0, _080084E4
- ldrb r0, [r0]
- cmp r0, 0
- bne _080084DE
- ldr r0, _080084E8
- bl sub_80079A8
- ldr r1, _080084EC
- ldr r0, _080084F0
- str r0, [r1]
-_080084DE:
- pop {r0}
- bx r0
- .align 2, 0
-_080084E4: .4byte 0x03004030
-_080084E8: .4byte 0x00002ffe
-_080084EC: .4byte 0x03002fc0
-_080084F0: .4byte sub_80084F4
- thumb_func_end sub_80084C8
-
- thumb_func_start sub_80084F4
-sub_80084F4: @ 80084F4
- push {r4,lr}
- bl sub_8007B78
- lsls r0, 24
- lsrs r2, r0, 24
- movs r1, 0
- cmp r1, r2
- bcs _0800851E
- ldr r3, _08008544
- ldrb r0, [r3]
- cmp r0, 0
- beq _0800851E
-_0800850C:
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, r2
- bcs _0800851E
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800850C
-_0800851E:
- cmp r1, r2
- bne _0800853C
- movs r1, 0
- ldr r4, _08008548
- ldr r3, _08008544
- movs r2, 0
-_0800852A:
- adds r0, r1, r3
- strb r2, [r0]
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x3
- bls _0800852A
- movs r0, 0
- str r0, [r4]
-_0800853C:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08008544: .4byte 0x03002b70
-_08008548: .4byte 0x03002fc0
- thumb_func_end sub_80084F4
-
- thumb_func_start sub_800854C
-sub_800854C: @ 800854C
- push {lr}
- ldr r0, _08008594
- ldrb r0, [r0]
- cmp r0, 0
- beq _08008590
- ldr r0, _08008598
- ldr r1, [r0]
- movs r0, 0xFE
- lsls r0, 11
- ands r0, r1
- cmp r0, 0
- beq _08008590
- ldr r0, _0800859C
- ldrb r0, [r0]
- cmp r0, 0
- bne _08008586
- ldr r0, _080085A0
- str r1, [r0]
- ldr r1, _080085A4
- ldr r0, _080085A8
- ldrb r0, [r0]
- str r0, [r1]
- ldr r1, _080085AC
- ldr r0, _080085B0
- ldrb r0, [r0]
- str r0, [r1]
- ldr r0, _080085B4
- bl SetMainCallback2
-_08008586:
- ldr r1, _080085B8
- movs r0, 0x1
- strb r0, [r1]
- bl AllocZeroed
-_08008590:
- pop {r0}
- bx r0
- .align 2, 0
-_08008594: .4byte 0x020238c0
-_08008598: .4byte 0x03002a60
-_0800859C: .4byte 0x03002f80
-_080085A0: .4byte 0x03000438
-_080085A4: .4byte 0x0300043c
-_080085A8: .4byte 0x03004030
-_080085AC: .4byte 0x03000440
-_080085B0: .4byte 0x03003060
-_080085B4: .4byte sub_80085BC
-_080085B8: .4byte 0x0300295c
- thumb_func_end sub_800854C
-
- thumb_func_start sub_80085BC
-sub_80085BC: @ 80085BC
- push {r4,lr}
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl pal_fade_control_reset_maybe
- movs r0, 0
- movs r1, 0
- movs r2, 0x2
- bl rboxid_80040B8
- bl ResetTasks
- ldr r0, _08008638
- bl SetVBlankCallback
- ldr r4, _0800863C
- adds r0, r4, 0
- bl SetUpWindowConfig
- adds r0, r4, 0
- bl sub_8071C4C
- bl sub_8071EF4
- ldr r0, _08008640
- movs r1, 0
- strh r1, [r0]
- subs r0, 0x40
- strh r1, [r0]
- subs r0, 0x2
- strh r1, [r0]
- movs r2, 0x80
- lsls r2, 19
- movs r3, 0xA0
- lsls r3, 1
- adds r0, r3, 0
- strh r0, [r2]
- ldr r0, _08008644
- strb r1, [r0]
- ldr r0, _08008648
- movs r1, 0
- bl CreateTask
- bl sub_8074D08
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl fade_and_return_progress_probably
- ldr r0, _0800864C
- bl SetMainCallback2
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08008638: .4byte sub_8007300
-_0800863C: .4byte gWindowConfig_81E7198
-_08008640: .4byte 0x04000052
-_08008644: .4byte 0x03001bb4
-_08008648: .4byte Task_DestroySelf
-_0800864C: .4byte sub_8008650
- thumb_func_end sub_80085BC
-
- thumb_func_start sub_8008650
-sub_8008650: @ 8008650
- push {lr}
- sub sp, 0x40
- ldr r0, _0800866C
- ldr r1, _08008670
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x1E
- beq _08008690
- cmp r0, 0x1E
- bgt _08008674
- cmp r0, 0
- beq _0800867E
- b _0800869E
- .align 2, 0
-_0800866C: .4byte 0x03001770
-_08008670: .4byte 0x0000043c
-_08008674:
- cmp r0, 0x3C
- beq _08008690
- cmp r0, 0x5A
- beq _08008698
- b _0800869E
-_0800867E:
- ldr r0, _0800868C
- movs r1, 0x14
- movs r2, 0x38
- movs r3, 0x1
- bl sub_80729D8
- b _0800869E
- .align 2, 0
-_0800868C: .4byte gUnknown_0842C34C
-_08008690:
- movs r0, 0x16
- bl audio_play
- b _0800869E
-_08008698:
- movs r0, 0x16
- bl audio_play
-_0800869E:
- ldr r0, _080086B4
- ldr r2, _080086B8
- adds r1, r0, r2
- ldrb r0, [r1]
- cmp r0, 0xC8
- beq _080086AE
- adds r0, 0x1
- strb r0, [r1]
-_080086AE:
- add sp, 0x40
- pop {r0}
- bx r0
- .align 2, 0
-_080086B4: .4byte 0x03001770
-_080086B8: .4byte 0x0000043c
- thumb_func_end sub_8008650
-
- thumb_func_start sub_80086BC
-sub_80086BC: @ 80086BC
- ldr r0, _080086C8
- ldrh r0, [r0]
- lsrs r0, 2
- movs r1, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_080086C8: .4byte 0x04000128
- thumb_func_end sub_80086BC
-
- thumb_func_start sub_80086CC
-sub_80086CC: @ 80086CC
- push {lr}
- movs r3, 0
- ldr r2, _080086F0
- ldrh r1, [r2]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _080086E8
- ldrh r1, [r2]
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- bne _080086E8
- movs r3, 0x1
-_080086E8:
- adds r0, r3, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080086F0: .4byte 0x04000128
- thumb_func_end sub_80086CC
-
- thumb_func_start sub_80086F4
-sub_80086F4: @ 80086F4
- ldr r0, _08008700
- ldr r0, [r0]
- lsrs r0, 6
- movs r1, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_08008700: .4byte 0x03002a60
- thumb_func_end sub_80086F4
-
- thumb_func_start sub_8008704
-sub_8008704: @ 8008704
- ldr r1, _0800870C
- strb r0, [r1]
- bx lr
- .align 2, 0
-_0800870C: .4byte 0x03002f80
- thumb_func_end sub_8008704
-
- thumb_func_start sub_8008710
-sub_8008710: @ 8008710
- ldr r0, _08008718
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_08008718: .4byte 0x0300295c
- thumb_func_end sub_8008710
-
- thumb_func_start sub_800871C
-sub_800871C: @ 800871C
- push {r4,r5,lr}
- sub sp, 0x4
- ldr r0, _0800875C
- ldr r2, _08008760
- ldrh r5, [r2]
- strh r5, [r0]
- movs r4, 0
- strh r4, [r2]
- ldr r3, _08008764
- ldrh r1, [r3]
- ldr r0, _08008768
- ands r0, r1
- strh r0, [r3]
- strh r5, [r2]
- ldr r0, _0800876C
- strh r4, [r0]
- subs r0, 0x1A
- strh r4, [r0]
- ldr r1, _08008770
- movs r0, 0xC0
- strh r0, [r1]
- movs r0, 0
- str r0, [sp]
- ldr r1, _08008774
- ldr r2, _08008778
- mov r0, sp
- bl CpuSet
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800875C: .4byte 0x03004034
-_08008760: .4byte 0x04000208
-_08008764: .4byte 0x04000200
-_08008768: .4byte 0x0000ff3f
-_0800876C: .4byte 0x04000128
-_08008770: .4byte 0x04000202
-_08008774: .4byte 0x03003070
-_08008778: .4byte 0x050003f0
- thumb_func_end sub_800871C
-
- thumb_func_start sub_800877C
-sub_800877C: @ 800877C
- push {r4-r7,lr}
- sub sp, 0x4
- ldr r6, _080087F4
- ldr r3, _080087F8
- ldrh r2, [r3]
- movs r4, 0
- strh r4, [r3]
- ldr r5, _080087FC
- ldrh r1, [r5]
- ldr r0, _08008800
- ands r0, r1
- strh r0, [r5]
- strh r2, [r3]
- ldr r0, _08008804
- strh r4, [r0]
- ldr r2, _08008808
- movs r1, 0x80
- lsls r1, 6
- adds r0, r1, 0
- strh r0, [r2]
- ldrh r0, [r2]
- ldr r7, _0800880C
- adds r1, r7, 0
- orrs r0, r1
- strh r0, [r2]
- ldrh r2, [r3]
- strh r2, [r6]
- strh r4, [r3]
- ldrh r0, [r5]
- movs r1, 0x80
- orrs r0, r1
- strh r0, [r5]
- strh r2, [r3]
- ldr r0, _08008810
- strh r4, [r0]
- movs r5, 0
- str r5, [sp]
- ldr r1, _08008814
- ldr r2, _08008818
- mov r0, sp
- bl CpuSet
- ldr r0, _0800881C
- strb r4, [r0]
- ldr r0, _08008820
- strh r5, [r0]
- ldr r0, _08008824
- strh r5, [r0]
- ldr r0, _08008828
- strb r4, [r0]
- ldr r0, _0800882C
- strb r4, [r0]
- ldr r0, _08008830
- strb r4, [r0]
- ldr r0, _08008834
- strb r4, [r0]
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080087F4: .4byte 0x03004034
-_080087F8: .4byte 0x04000208
-_080087FC: .4byte 0x04000200
-_08008800: .4byte 0x0000ff3f
-_08008804: .4byte 0x04000134
-_08008808: .4byte 0x04000128
-_0800880C: .4byte 0x00004003
-_08008810: .4byte 0x0400012a
-_08008814: .4byte 0x03003070
-_08008818: .4byte 0x050003f0
-_0800881C: .4byte 0x03000450
-_08008820: .4byte 0x03000452
-_08008824: .4byte 0x03000454
-_08008828: .4byte 0x03000456
-_0800882C: .4byte 0x03000457
-_08008830: .4byte 0x03003060
-_08008834: .4byte 0x03004030
- thumb_func_end sub_800877C
-
- thumb_func_start sub_8008838
-sub_8008838: @ 8008838
- push {lr}
- bl sub_800877C
- bl sub_800871C
- pop {r0}
- bx r0
- thumb_func_end sub_8008838
-
- thumb_func_start sub_8008848
-sub_8008848: @ 8008848
- push {r4-r7,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- ldr r0, _08008864
- ldrb r0, [r0, 0x1]
- cmp r0, 0x4
- bhi _080088FA
- lsls r0, 2
- ldr r1, _08008868
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08008864: .4byte 0x03003070
-_08008868: .4byte _0800886C
- .align 2, 0
-_0800886C:
- .4byte _08008880
- .4byte _08008890
- .4byte _080088A8
- .4byte _080088E4
- .4byte _080088EE
-_08008880:
- bl sub_800871C
- ldr r1, _0800888C
- movs r0, 0x1
- strb r0, [r1, 0x1]
- b _080088FA
- .align 2, 0
-_0800888C: .4byte 0x03003070
-_08008890:
- ldrb r0, [r4]
- cmp r0, 0x1
- bne _080088FA
- bl sub_800877C
- ldr r1, _080088A4
- movs r0, 0x2
- strb r0, [r1, 0x1]
- b _080088FA
- .align 2, 0
-_080088A4: .4byte 0x03003070
-_080088A8:
- ldrb r1, [r4]
- cmp r1, 0x1
- beq _080088B8
- cmp r1, 0x2
- beq _080088D0
- bl sub_8008974
- b _080088FA
-_080088B8:
- ldr r2, _080088CC
- ldrb r0, [r2]
- cmp r0, 0x8
- bne _080088FA
- ldrb r0, [r2, 0x3]
- cmp r0, 0x1
- bls _080088FA
- strb r1, [r2, 0xE]
- b _080088FA
- .align 2, 0
-_080088CC: .4byte 0x03003070
-_080088D0:
- ldr r0, _080088DC
- movs r1, 0
- strb r1, [r0, 0x1]
- ldr r0, _080088E0
- strh r1, [r0]
- b _080088FA
- .align 2, 0
-_080088DC: .4byte 0x03003070
-_080088E0: .4byte 0x0400012a
-_080088E4:
- bl sub_80089A0
- ldr r1, _08008934
- movs r0, 0x4
- strb r0, [r1, 0x1]
-_080088EE:
- adds r0, r5, 0
- bl sub_80089F0
- adds r0, r6, 0
- bl sub_8008AD8
-_080088FA:
- movs r0, 0
- strb r0, [r4]
- ldr r1, _08008934
- ldrb r2, [r1, 0x2]
- ldrb r0, [r1, 0x3]
- lsls r0, 2
- orrs r2, r0
- ldrb r0, [r1]
- cmp r0, 0x8
- bne _08008912
- movs r0, 0x20
- orrs r2, r0
-_08008912:
- ldrb r0, [r1, 0xC]
- lsls r3, r0, 8
- ldrb r0, [r1, 0xF]
- lsls r4, r0, 9
- ldrb r0, [r1, 0x10]
- lsls r5, r0, 12
- ldrb r0, [r1, 0x11]
- lsls r6, r0, 13
- ldrb r0, [r1, 0x12]
- lsls r7, r0, 14
- ldrb r0, [r1, 0x1]
- cmp r0, 0x4
- bne _08008938
- movs r0, 0x40
- orrs r0, r3
- orrs r0, r2
- b _0800893C
- .align 2, 0
-_08008934: .4byte 0x03003070
-_08008938:
- adds r0, r2, 0
- orrs r0, r3
-_0800893C:
- orrs r0, r4
- orrs r0, r5
- orrs r0, r6
- orrs r0, r7
- adds r2, r0, 0
- ldrb r3, [r1, 0x13]
- cmp r3, 0x1
- bne _08008952
- movs r0, 0x80
- lsls r0, 9
- orrs r2, r0
-_08008952:
- ldrb r0, [r1, 0x2]
- cmp r0, 0x3
- bls _0800895E
- movs r0, 0x80
- lsls r0, 10
- orrs r2, r0
-_0800895E:
- adds r1, r2, 0
- cmp r3, 0x2
- bne _0800896A
- movs r0, 0x80
- lsls r0, 11
- orrs r1, r0
-_0800896A:
- adds r0, r1, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8008848
-
- thumb_func_start sub_8008974
-sub_8008974: @ 8008974
- push {lr}
- ldr r0, _08008990
- ldr r1, [r0]
- movs r0, 0xC
- ands r1, r0
- ldr r2, _08008994
- cmp r1, 0x8
- bne _08008998
- ldrb r0, [r2, 0x2]
- cmp r0, 0
- bne _08008998
- strb r1, [r2]
- b _0800899C
- .align 2, 0
-_08008990: .4byte 0x04000128
-_08008994: .4byte 0x03003070
-_08008998:
- movs r0, 0
- strb r0, [r2]
-_0800899C:
- pop {r0}
- bx r0
- thumb_func_end sub_8008974
-
- thumb_func_start sub_80089A0
-sub_80089A0: @ 80089A0
- push {r4,lr}
- ldr r0, _080089D8
- ldrb r0, [r0]
- cmp r0, 0
- beq _080089D0
- ldr r1, _080089DC
- ldr r2, _080089E0
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x41
- strh r0, [r1]
- ldr r0, _080089E4
- ldr r2, _080089E8
- ldrh r4, [r2]
- strh r4, [r0]
- movs r0, 0
- strh r0, [r2]
- ldr r3, _080089EC
- ldrh r0, [r3]
- movs r1, 0x40
- orrs r0, r1
- strh r0, [r3]
- strh r4, [r2]
-_080089D0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080089D8: .4byte 0x03003070
-_080089DC: .4byte 0x0400010c
-_080089E0: .4byte 0x0000ff3b
-_080089E4: .4byte 0x03004034
-_080089E8: .4byte 0x04000208
-_080089EC: .4byte 0x04000200
- thumb_func_end sub_80089A0
-
- thumb_func_start sub_80089F0
-sub_80089F0: @ 80089F0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r3, r0, 0
- ldr r2, _08008A68
- ldr r1, _08008A6C
- ldrh r0, [r1]
- strh r0, [r2]
- movs r0, 0
- strh r0, [r1]
- ldr r1, _08008A70
- ldr r4, _08008A74
- adds r0, r1, r4
- ldrb r4, [r0]
- adds r6, r1, 0
- cmp r4, 0x31
- bhi _08008A80
- movs r1, 0xCE
- lsls r1, 2
- adds r0, r6, r1
- ldrb r0, [r0]
- adds r0, r4, r0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _08008A2E
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
-_08008A2E:
- movs r2, 0
- ldr r4, _08008A78
- mov r9, r4
- ldr r1, _08008A7C
- mov r10, r1
- lsls r5, r0, 1
- movs r0, 0x18
- adds r0, r6
- mov r8, r0
- mov r12, r2
- movs r7, 0x64
-_08008A44:
- ldrh r0, [r4]
- ldrh r1, [r3]
- orrs r0, r1
- strh r0, [r4]
- adds r0, r2, 0
- muls r0, r7
- adds r0, r5, r0
- add r0, r8
- strh r1, [r0]
- mov r1, r12
- strh r1, [r3]
- adds r3, 0x2
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _08008A44
- b _08008A8C
- .align 2, 0
-_08008A68: .4byte 0x03004034
-_08008A6C: .4byte 0x04000208
-_08008A70: .4byte 0x03003070
-_08008A74: .4byte 0x00000339
-_08008A78: .4byte 0x03000452
-_08008A7C: .4byte 0x03003060
-_08008A80:
- movs r0, 0x1
- strb r0, [r6, 0x12]
- ldr r2, _08008AC4
- mov r9, r2
- ldr r4, _08008AC8
- mov r10, r4
-_08008A8C:
- mov r1, r9
- ldrh r0, [r1]
- cmp r0, 0
- beq _08008AA4
- ldr r2, _08008ACC
- adds r0, r6, r2
- ldrb r1, [r0]
- adds r1, 0x1
- movs r2, 0
- strb r1, [r0]
- mov r4, r9
- strh r2, [r4]
-_08008AA4:
- ldr r1, _08008AD0
- ldr r2, _08008AD4
- ldrh r0, [r2]
- strh r0, [r1]
- ldr r4, _08008ACC
- adds r0, r6, r4
- ldrb r0, [r0]
- mov r1, r10
- strb r0, [r1]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08008AC4: .4byte 0x03000452
-_08008AC8: .4byte 0x03003060
-_08008ACC: .4byte 0x00000339
-_08008AD0: .4byte 0x04000208
-_08008AD4: .4byte 0x03004034
- thumb_func_end sub_80089F0
-
- thumb_func_start sub_8008AD8
-sub_8008AD8: @ 8008AD8
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- mov r12, r0
- ldr r2, _08008B38
- ldr r1, _08008B3C
- ldrh r0, [r1]
- strh r0, [r2]
- movs r0, 0
- strh r0, [r1]
- ldr r1, _08008B40
- ldr r3, _08008B44
- adds r0, r1, r3
- ldrb r0, [r0]
- adds r7, r1, 0
- cmp r0, 0
- bne _08008B48
- movs r3, 0
- mov r8, r7
- ldrb r6, [r7, 0x3]
-_08008B04:
- movs r2, 0
- adds r5, r3, 0x1
- cmp r2, r6
- bcs _08008B28
- lsls r0, r3, 3
- mov r1, r12
- adds r3, r0, r1
- movs r4, 0
- mov r0, r8
- ldrb r1, [r0, 0x3]
-_08008B18:
- lsls r0, r2, 1
- adds r0, r3
- strh r4, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, r1
- bcc _08008B18
-_08008B28:
- lsls r0, r5, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _08008B04
- movs r0, 0x1
- strb r0, [r7, 0xC]
- b _08008BC0
- .align 2, 0
-_08008B38: .4byte 0x03004034
-_08008B3C: .4byte 0x04000208
-_08008B40: .4byte 0x03003070
-_08008B44: .4byte 0x00000fbd
-_08008B48:
- movs r3, 0
- ldrb r1, [r7, 0x3]
- mov r9, r1
- movs r2, 0xCF
- lsls r2, 2
- adds r2, r7
- mov r8, r2
- mov r10, r7
-_08008B58:
- movs r2, 0
- adds r5, r3, 0x1
- cmp r2, r9
- bcs _08008B94
- lsls r0, r3, 3
- mov r1, r12
- adds r6, r0, r1
- ldr r0, _08008BD8
- ldrb r1, [r0]
- lsls r1, 1
- mov r0, r10
- ldrb r4, [r0, 0x3]
- movs r0, 0x64
- muls r0, r3
- adds r3, r1, r0
-_08008B76:
- lsls r0, r2, 1
- adds r1, r0, r6
- adds r0, r2
- lsls r0, 3
- adds r0, r2
- lsls r0, 5
- adds r0, r3, r0
- add r0, r8
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, r4
- bcc _08008B76
-_08008B94:
- lsls r0, r5, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _08008B58
- adds r2, r7, 0
- ldr r3, _08008BDC
- adds r1, r2, r3
- ldrb r0, [r1]
- subs r0, 0x1
- movs r3, 0
- strb r0, [r1]
- ldr r0, _08008BE0
- adds r2, r0
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _08008BBE
- strb r3, [r2]
-_08008BBE:
- strb r3, [r7, 0xC]
-_08008BC0:
- ldr r1, _08008BE4
- ldr r2, _08008BE8
- ldrh r0, [r2]
- strh r0, [r1]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08008BD8: .4byte 0x0300402c
-_08008BDC: .4byte 0x00000fbd
-_08008BE0: .4byte 0x00000fbc
-_08008BE4: .4byte 0x04000208
-_08008BE8: .4byte 0x03004034
- thumb_func_end sub_8008AD8
-
- thumb_func_start sub_8008BEC
-sub_8008BEC: @ 8008BEC
- push {r4,lr}
- ldr r3, _08008C14
- ldrb r4, [r3]
- cmp r4, 0
- beq _08008C28
- ldrb r0, [r3, 0x1]
- cmp r0, 0x2
- beq _08008C22
- cmp r0, 0x4
- bne _08008C52
- movs r0, 0xD
- ldrsb r0, [r3, r0]
- cmp r0, 0x8
- bgt _08008C18
- ldrb r0, [r3, 0x10]
- cmp r0, 0x1
- beq _08008C22
- movs r0, 0x1
- strb r0, [r3, 0x13]
- b _08008C52
- .align 2, 0
-_08008C14: .4byte 0x03003070
-_08008C18:
- ldrb r0, [r3, 0x13]
- cmp r0, 0x1
- beq _08008C52
- movs r0, 0
- strb r0, [r3, 0xD]
-_08008C22:
- bl sub_8008CF4
- b _08008C52
-_08008C28:
- ldrb r2, [r3, 0x1]
- cmp r2, 0x4
- beq _08008C32
- cmp r2, 0x2
- bne _08008C52
-_08008C32:
- ldr r1, _08008C58
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xA
- bls _08008C52
- cmp r2, 0x4
- bne _08008C4A
- movs r0, 0x2
- strb r0, [r3, 0x13]
-_08008C4A:
- cmp r2, 0x2
- bne _08008C52
- strb r4, [r3, 0x3]
- strb r4, [r3, 0xF]
-_08008C52:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08008C58: .4byte 0x03000450
- thumb_func_end sub_8008BEC
-
- thumb_func_start Timer3Intr
-Timer3Intr: @ 8008C5C
- push {lr}
- bl sub_8008FCC
- bl sub_8008CF4
- pop {r0}
- bx r0
- thumb_func_end Timer3Intr
-
- thumb_func_start sub_8008C6C
-sub_8008C6C: @ 8008C6C
- push {r4,lr}
- ldr r4, _08008C98
- ldr r0, _08008C9C
- ldr r1, [r0]
- lsls r0, r1, 26
- lsrs r0, 30
- strb r0, [r4, 0x2]
- ldrb r0, [r4, 0x1]
- cmp r0, 0x2
- beq _08008CA0
- cmp r0, 0x4
- bne _08008CBE
- lsls r0, r1, 25
- lsrs r0, 31
- strb r0, [r4, 0x10]
- bl sub_8008E00
- bl sub_8008F18
- bl sub_8009000
- b _08008CBE
- .align 2, 0
-_08008C98: .4byte 0x03003070
-_08008C9C: .4byte 0x04000128
-_08008CA0:
- bl sub_8008D04
- lsls r0, 24
- cmp r0, 0
- beq _08008CBE
- ldrb r0, [r4]
- cmp r0, 0
- beq _08008CBA
- movs r0, 0x3
- strb r0, [r4, 0x1]
- movs r0, 0x8
- strb r0, [r4, 0xD]
- b _08008CBE
-_08008CBA:
- movs r0, 0x4
- strb r0, [r4, 0x1]
-_08008CBE:
- ldr r3, _08008CE4
- ldrb r0, [r3, 0xD]
- adds r0, 0x1
- movs r2, 0
- strb r0, [r3, 0xD]
- ldr r1, _08008CE8
- strb r2, [r1]
- lsls r0, 24
- asrs r0, 24
- cmp r0, 0x8
- bne _08008CDE
- ldr r0, _08008CEC
- ldr r2, _08008CF0
- adds r1, r3, r2
- ldrb r1, [r1]
- strb r1, [r0]
-_08008CDE:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08008CE4: .4byte 0x03003070
-_08008CE8: .4byte 0x03000450
-_08008CEC: .4byte 0x03004030
-_08008CF0: .4byte 0x00000fbd
- thumb_func_end sub_8008C6C
-
- thumb_func_start sub_8008CF4
-sub_8008CF4: @ 8008CF4
- ldr r0, _08008D00
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
- bx lr
- .align 2, 0
-_08008D00: .4byte 0x04000128
- thumb_func_end sub_8008CF4
-
- thumb_func_start sub_8008D04
-sub_8008D04: @ 8008D04
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- movs r5, 0
- ldr r6, _08008D20
- ldr r0, _08008D24
- ldrb r1, [r0, 0xE]
- adds r7, r0, 0
- cmp r1, 0x1
- bne _08008D30
- ldr r1, _08008D28
- ldr r2, _08008D2C
- b _08008D34
- .align 2, 0
-_08008D20: .4byte 0x0000ffff
-_08008D24: .4byte 0x03003070
-_08008D28: .4byte 0x0400012a
-_08008D2C: .4byte 0x00008fff
-_08008D30:
- ldr r1, _08008D88
- ldr r2, _08008D8C
-_08008D34:
- adds r0, r2, 0
- strh r0, [r1]
- ldr r2, _08008D90
- ldr r3, _08008D94
- ldr r0, [r3]
- ldr r1, [r3, 0x4]
- str r0, [r2]
- str r1, [r2, 0x4]
- movs r0, 0
- movs r1, 0
- str r0, [r3]
- str r1, [r3, 0x4]
- strb r0, [r2, 0xA]
- movs r4, 0
- ldr r0, _08008D98
- mov r9, r0
- mov r8, r2
- ldr r2, _08008D9C
- ldr r1, _08008DA0
- mov r12, r1
-_08008D5C:
- lsls r0, r4, 1
- add r0, r8
- ldrh r3, [r0]
- movs r0, 0x4
- negs r0, r0
- ands r0, r3
- ldr r1, _08008D8C
- cmp r0, r1
- beq _08008D74
- adds r0, r3, 0
- cmp r0, r2
- bne _08008DA4
-_08008D74:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r0, r3, 0
- cmp r6, r0
- bls _08008DAC
- cmp r0, 0
- beq _08008DAC
- adds r6, r3, 0
- b _08008DAC
- .align 2, 0
-_08008D88: .4byte 0x0400012a
-_08008D8C: .4byte 0x0000b9a0
-_08008D90: .4byte 0x03003074
-_08008D94: .4byte 0x04000120
-_08008D98: .4byte 0x03000457
-_08008D9C: .4byte 0x00008fff
-_08008DA0: .4byte 0x0000ffff
-_08008DA4:
- cmp r0, r12
- beq _08008DB6
- movs r5, 0
- b _08008DB6
-_08008DAC:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _08008D5C
-_08008DB6:
- strb r5, [r7, 0x3]
- adds r0, r5, 0
- cmp r0, 0x1
- bls _08008DE6
- mov r2, r9
- ldrb r2, [r2]
- cmp r0, r2
- bne _08008DD8
- ldrh r1, [r7, 0x4]
- ldr r0, _08008DD4
- cmp r1, r0
- bne _08008DD8
- movs r0, 0x1
- b _08008DF2
- .align 2, 0
-_08008DD4: .4byte 0x00008fff
-_08008DD8:
- ldrb r0, [r7, 0x3]
- cmp r0, 0x1
- bls _08008DE6
- movs r0, 0x3
- ands r6, r0
- adds r0, r6, 0x1
- b _08008DE8
-_08008DE6:
- movs r0, 0
-_08008DE8:
- strb r0, [r7, 0xF]
- ldrb r0, [r7, 0x3]
- mov r1, r9
- strb r0, [r1]
- movs r0, 0
-_08008DF2:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8008D04
-
- thumb_func_start sub_8008E00
-sub_8008E00: @ 8008E00
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x8
- ldr r0, _08008E58
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r0, _08008E5C
- ldrb r1, [r0, 0x16]
- adds r6, r0, 0
- cmp r1, 0
- bne _08008E64
- movs r4, 0
- ldr r7, _08008E60
- ldrb r0, [r6, 0x3]
- cmp r4, r0
- bcs _08008E4E
- adds r5, r6, 0
- ldrh r1, [r6, 0x14]
- adds r3, r7, 0
- adds r2, r6, 0
-_08008E2E:
- lsls r0, r4, 1
- add r0, sp
- ldrh r0, [r0]
- cmp r1, r0
- beq _08008E42
- ldrb r0, [r3]
- cmp r0, 0
- beq _08008E42
- movs r0, 0x1
- strb r0, [r5, 0x11]
-_08008E42:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r0, [r2, 0x3]
- cmp r4, r0
- bcc _08008E2E
-_08008E4E:
- movs r0, 0
- strh r0, [r6, 0x14]
- movs r0, 0x1
- strb r0, [r7]
- b _08008F04
- .align 2, 0
-_08008E58: .4byte 0x04000120
-_08008E5C: .4byte 0x03003070
-_08008E60: .4byte 0x03000456
-_08008E64:
- ldr r2, _08008ED4
- adds r1, r6, r2
- adds r2, 0x1
- adds r0, r6, r2
- ldrb r2, [r0]
- ldrb r1, [r1]
- adds r0, r2, r1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _08008E80
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
-_08008E80:
- cmp r2, 0x31
- bhi _08008EDC
- movs r4, 0
- ldrb r1, [r6, 0x3]
- cmp r4, r1
- bcs _08008EE0
- adds r5, r6, 0
- ldr r7, _08008ED8
- lsls r0, 1
- mov r12, r0
- movs r2, 0xCF
- lsls r2, 2
- adds r2, r6
- mov r8, r2
-_08008E9C:
- lsls r1, r4, 1
- mov r2, sp
- adds r0, r2, r1
- ldrh r3, [r0]
- ldrh r2, [r5, 0x14]
- adds r0, r3, r2
- strh r0, [r5, 0x14]
- ldrh r0, [r7]
- orrs r0, r3
- strh r0, [r7]
- ldrb r2, [r5, 0x17]
- movs r0, 0x64
- muls r0, r2
- add r0, r12
- adds r1, r4
- lsls r1, 3
- adds r1, r4
- lsls r1, 5
- adds r0, r1
- add r0, r8
- strh r3, [r0]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r0, [r5, 0x3]
- cmp r4, r0
- bcc _08008E9C
- b _08008EE0
- .align 2, 0
-_08008ED4: .4byte 0x00000fbc
-_08008ED8: .4byte 0x03000454
-_08008EDC:
- movs r0, 0x2
- strb r0, [r6, 0x12]
-_08008EE0:
- ldrb r0, [r6, 0x17]
- adds r0, 0x1
- strb r0, [r6, 0x17]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x8
- bne _08008F04
- ldr r2, _08008F10
- ldrh r0, [r2]
- cmp r0, 0
- beq _08008F04
- ldr r1, _08008F14
- adds r0, r6, r1
- ldrb r1, [r0]
- adds r1, 0x1
- strb r1, [r0]
- movs r0, 0
- strh r0, [r2]
-_08008F04:
- add sp, 0x8
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08008F10: .4byte 0x03000454
-_08008F14: .4byte 0x00000fbd
- thumb_func_end sub_8008E00
-
- thumb_func_start sub_8008F18
-sub_8008F18: @ 8008F18
- push {r4,lr}
- ldr r0, _08008F54
- ldrb r1, [r0, 0x16]
- adds r4, r0, 0
- cmp r1, 0x8
- bne _08008F6A
- ldr r1, _08008F58
- ldrh r0, [r4, 0x14]
- strh r0, [r1]
- ldr r1, _08008F5C
- ldrb r2, [r1]
- cmp r2, 0
- bne _08008F64
- ldr r0, _08008F60
- adds r1, r4, r0
- ldrb r0, [r1]
- subs r0, 0x1
- strb r0, [r1]
- movs r0, 0xCE
- lsls r0, 2
- adds r1, r4, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _08008FC0
- strb r2, [r1]
- b _08008FC0
- .align 2, 0
-_08008F54: .4byte 0x03003070
-_08008F58: .4byte 0x0400012a
-_08008F5C: .4byte 0x03000451
-_08008F60: .4byte 0x00000339
-_08008F64:
- movs r0, 0
- strb r0, [r1]
- b _08008FC0
-_08008F6A:
- ldr r1, _08008F90
- ldrb r0, [r1]
- cmp r0, 0
- bne _08008F86
- ldr r2, _08008F94
- adds r0, r4, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _08008F80
- movs r0, 0x1
- strb r0, [r1]
-_08008F80:
- ldrb r0, [r1]
- cmp r0, 0
- beq _08008F9C
-_08008F86:
- ldr r1, _08008F98
- movs r0, 0
- strh r0, [r1]
- b _08008FBA
- .align 2, 0
-_08008F90: .4byte 0x03000451
-_08008F94: .4byte 0x00000339
-_08008F98: .4byte 0x0400012a
-_08008F9C:
- ldr r3, _08008FC8
- movs r1, 0xCE
- lsls r1, 2
- adds r0, r4, r1
- ldrb r0, [r0]
- lsls r0, 1
- ldrb r2, [r4, 0x16]
- movs r1, 0x64
- muls r1, r2
- adds r0, r1
- adds r1, r4, 0
- adds r1, 0x18
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r3]
-_08008FBA:
- ldrb r0, [r4, 0x16]
- adds r0, 0x1
- strb r0, [r4, 0x16]
-_08008FC0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08008FC8: .4byte 0x0400012a
- thumb_func_end sub_8008F18
-
- thumb_func_start sub_8008FCC
-sub_8008FCC: @ 8008FCC
- push {lr}
- ldr r0, _08008FEC
- ldrb r0, [r0]
- cmp r0, 0
- beq _08008FE8
- ldr r2, _08008FF0
- ldrh r1, [r2]
- ldr r0, _08008FF4
- ands r0, r1
- strh r0, [r2]
- ldr r1, _08008FF8
- ldr r2, _08008FFC
- adds r0, r2, 0
- strh r0, [r1]
-_08008FE8:
- pop {r0}
- bx r0
- .align 2, 0
-_08008FEC: .4byte 0x03003070
-_08008FF0: .4byte 0x0400010e
-_08008FF4: .4byte 0x0000ff7f
-_08008FF8: .4byte 0x0400010c
-_08008FFC: .4byte 0x0000ff3b
- thumb_func_end sub_8008FCC
-
- thumb_func_start sub_8009000
-sub_8009000: @ 8009000
- push {lr}
- ldr r1, _08009014
- ldrb r0, [r1, 0x17]
- cmp r0, 0x8
- bne _08009018
- movs r0, 0
- strb r0, [r1, 0x16]
- strb r0, [r1, 0x17]
- b _08009028
- .align 2, 0
-_08009014: .4byte 0x03003070
-_08009018:
- ldrb r0, [r1]
- cmp r0, 0
- beq _08009028
- ldr r0, _0800902C
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
-_08009028:
- pop {r0}
- bx r0
- .align 2, 0
-_0800902C: .4byte 0x0400010e
- thumb_func_end sub_8009000
-
- thumb_func_start sub_8009030
-sub_8009030: @ 8009030
- push {r4-r6,lr}
- ldr r1, _08009078
- ldr r2, _0800907C
- adds r0, r1, r2
- movs r2, 0
- strb r2, [r0]
- movs r3, 0xCE
- lsls r3, 2
- adds r0, r1, r3
- strb r2, [r0]
- movs r0, 0
- movs r6, 0x64
- adds r5, r1, 0
- adds r5, 0x18
- ldr r4, _08009080
-_0800904E:
- movs r2, 0
- adds r1, r0, 0x1
- adds r3, r0, 0
- muls r3, r6
-_08009056:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r5
- strh r4, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x31
- bls _08009056
- lsls r0, r1, 24
- lsrs r0, 24
- cmp r0, 0x7
- bls _0800904E
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08009078: .4byte 0x03003070
-_0800907C: .4byte 0x00000339
-_08009080: .4byte 0x0000efff
- thumb_func_end sub_8009030
-
- thumb_func_start sub_8009084
-sub_8009084: @ 8009084
- push {r4-r7,lr}
- ldr r1, _080090E4
- ldr r2, _080090E8
- adds r0, r1, r2
- movs r2, 0
- strb r2, [r0]
- ldr r3, _080090EC
- adds r0, r1, r3
- strb r2, [r0]
- movs r0, 0x64
- mov r12, r0
- movs r3, 0xCF
- lsls r3, 2
- adds r7, r1, r3
- ldr r6, _080090F0
-_080090A2:
- movs r3, 0
- lsls r0, r2, 1
- adds r5, r2, 0x1
- adds r0, r2
- lsls r0, 3
- adds r0, r2
- lsls r4, r0, 5
-_080090B0:
- movs r2, 0
- adds r1, r3, 0x1
- mov r0, r12
- muls r0, r3
- adds r3, r0, 0
-_080090BA:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r4
- adds r0, r7
- strh r6, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x31
- bls _080090BA
- lsls r0, r1, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _080090B0
- lsls r0, r5, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _080090A2
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080090E4: .4byte 0x03003070
-_080090E8: .4byte 0x00000fbd
-_080090EC: .4byte 0x00000fbc
-_080090F0: .4byte 0x0000efff
- thumb_func_end sub_8009084
diff --git a/asm/rom3.s b/asm/rom3.s
index 325b2f91b..58ddfa908 100644
--- a/asm/rom3.s
+++ b/asm/rom3.s
@@ -4249,7 +4249,7 @@ sub_800B858: @ 800B858
ands r0, r1
cmp r0, 0
beq _0800B876
- bl sub_8007378
+ bl OpenLink
ldr r0, _0800B880
movs r1, 0
bl CreateTask
@@ -4619,7 +4619,7 @@ _0800BB84: .4byte 0x02024a72
_0800BB88: .4byte sub_8037510
_0800BB8C: .4byte 0x02024a68
_0800BB90:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r5, r0, 24
ldrh r1, [r6]
@@ -5462,8 +5462,8 @@ _0800C21A:
adds r0, 0x1
b _0800C352
_0800C220:
- bl sub_8008300
- bl sub_8008310
+ bl GetLinkPlayerCount_2
+ bl IsLinkMaster
lsls r0, 24
cmp r0, 0
beq _0800C248
@@ -5544,7 +5544,7 @@ _0800C28C:
adds r5, r2
adds r1, r5
adds r2, r6, 0
- bl sub_8007E88
+ bl SendBlock
ldrh r0, [r4, 0x1E]
adds r0, 0x1
strh r0, [r4, 0x1E]
@@ -5649,7 +5649,7 @@ _0800C394: .4byte 0x03002970
_0800C398: .4byte 0x00002211
_0800C39C: .4byte 0x03002b80
_0800C3A0:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
ldr r2, _0800C468
@@ -5662,7 +5662,7 @@ _0800C3A0:
cmp r0, 0
beq _0800C446
adds r0, r4, 0
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
lsls r0, r4, 8
mov r2, r10
adds r3, r0, r2
@@ -5738,7 +5738,7 @@ _0800C446:
lsls r0, r1, 24
lsrs r4, r0, 24
_0800C44C:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -10871,7 +10871,7 @@ sub_800EC9C: @ 800EC9C
bl RunTasks
bl AnimateSprites
bl BuildOamBuffer
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r4, r0, 24
ldr r0, _0800ECD4
@@ -10939,7 +10939,7 @@ _0800ED2E:
lsrs r0, 24
adds r1, r4, 0
movs r2, 0x20
- bl sub_8007E88
+ bl SendBlock
ldr r0, _0800ED60
strb r5, [r0]
b _0800F008
@@ -10960,14 +10960,14 @@ _0800ED64:
.align 2, 0
_0800ED78: .4byte 0x02024d1e
_0800ED7C:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0x3
ands r1, r0
cmp r1, 0x3
beq _0800ED8A
b _0800F008
_0800ED8A:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r3, 0
ldr r0, _0800EDA8
ldrh r1, [r0]
@@ -11108,19 +11108,19 @@ _0800EE94:
lsrs r0, 24
ldr r1, _0800EEA8
movs r2, 0xC8
- bl sub_8007E88
+ bl SendBlock
b _0800EF96
.align 2, 0
_0800EEA8: .4byte 0x03004360
_0800EEAC:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0x3
ands r1, r0
cmp r1, 0x3
beq _0800EEBA
b _0800F008
_0800EEBA:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _0800EED0
lsls r1, r5, 8
ldr r2, _0800EED4
@@ -11143,19 +11143,19 @@ _0800EEE4:
lsrs r0, 24
ldr r1, _0800EEF8
movs r2, 0xC8
- bl sub_8007E88
+ bl SendBlock
b _0800EF96
.align 2, 0
_0800EEF8: .4byte 0x03004428
_0800EEFC:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0x3
ands r1, r0
cmp r1, 0x3
beq _0800EF0A
b _0800F008
_0800EF0A:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _0800EF20
lsls r1, r5, 8
ldr r2, _0800EF24
@@ -11176,17 +11176,17 @@ _0800EF28:
lsrs r0, 24
ldr r1, _0800EF44
movs r2, 0xC8
- bl sub_8007E88
+ bl SendBlock
b _0800EF96
.align 2, 0
_0800EF44: .4byte 0x030044f0
_0800EF48:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0x3
ands r1, r0
cmp r1, 0x3
bne _0800F008
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r4, _0800EFA0
lsls r1, r5, 8
ldr r0, _0800EFA4
@@ -11383,7 +11383,7 @@ sub_800F104: @ 800F104
mov r7, r9
mov r6, r8
push {r6,r7}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r6, r0, 24
ldr r4, _0800F148
@@ -11441,7 +11441,7 @@ _0800F17E:
lsrs r0, 24
adds r1, r4, 0
movs r2, 0x60
- bl sub_8007E88
+ bl SendBlock
ldrb r0, [r5]
adds r0, 0x1
strb r0, [r5]
@@ -11449,12 +11449,12 @@ _0800F17E:
.align 2, 0
_0800F19C: .4byte 0x03002fa4
_0800F1A0:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0xF
ands r1, r0
cmp r1, 0xF
bne _0800F27A
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r4, 0
lsls r0, r6, 3
subs r0, r6
@@ -11571,7 +11571,7 @@ sub_800F298: @ 800F298
push {r4-r7,lr}
mov r7, r8
push {r7}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r6, r0, 24
ldr r0, _0800F2D0
@@ -11631,20 +11631,20 @@ _0800F316:
lsrs r0, 24
adds r1, r4, 0
movs r2, 0x20
- bl sub_8007E88
+ bl SendBlock
b _0800F770
.align 2, 0
_0800F338: .4byte 0x03002fa4
_0800F33C: .4byte 0x02000000
_0800F340:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0xF
ands r1, r0
cmp r1, 0xF
beq _0800F34E
b _0800F7E0
_0800F34E:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r4, 0
ldr r0, _0800F36C
ldrh r1, [r0]
@@ -11864,20 +11864,20 @@ _0800F4EA:
lsrs r0, 24
ldr r1, _0800F500
movs r2, 0xC8
- bl sub_8007E88
+ bl SendBlock
b _0800F770
.align 2, 0
_0800F4FC: .4byte 0x02024d1e
_0800F500: .4byte 0x0201d000
_0800F504:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0xF
ands r1, r0
cmp r1, 0xF
beq _0800F512
b _0800F7E0
_0800F512:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r4, 0
lsls r0, r6, 3
subs r0, r6
@@ -12014,19 +12014,19 @@ _0800F604:
lsrs r0, 24
ldr r1, _0800F618
movs r2, 0x64
- bl sub_8007E88
+ bl SendBlock
b _0800F770
.align 2, 0
_0800F618: .4byte 0x0201d0c8
_0800F61C:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
movs r1, 0xF
ands r1, r0
cmp r1, 0xF
beq _0800F62A
b _0800F7E0
_0800F62A:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r4, 0
lsls r0, r6, 3
subs r0, r6
@@ -23791,7 +23791,7 @@ _080155C0:
str r0, [r5]
adds r4, 0x1
_080155CE:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -68499,7 +68499,7 @@ dp01_tbl1_exec_completed: @ 802BF9C
ands r0, r1
cmp r0, 0
beq _0802BFF0
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
mov r1, sp
strb r0, [r1]
movs r0, 0x2
@@ -92136,7 +92136,7 @@ dp01_tbl4_exec_completed: @ 8038004
ands r0, r1
cmp r0, 0
beq _08038058
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
mov r1, sp
strb r0, [r1]
movs r0, 0x2
@@ -94857,7 +94857,7 @@ _08039710: .4byte 0x03002970
_08039714:
movs r5, 0
ldr r4, _0803986C
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
movs r1, 0x1
eors r0, r1
lsls r0, 24
@@ -101911,7 +101911,7 @@ _0803CE42:
strb r0, [r1]
adds r0, r7, 0
adds r1, r3, 0
- bl SetStringCharset
+ bl ConvertInternationalString
_0803CE50:
adds r0, r7, 0
bl StringLength
@@ -107816,7 +107816,7 @@ sub_803FBBC: @ 803FBBC
push {r4,r5,lr}
movs r5, 0
ldr r4, _0803FBE4
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 3
@@ -110106,7 +110106,7 @@ _08040D04: .4byte 0x0000ffff
thumb_func_start sub_8040D08
sub_8040D08: @ 8040D08
push {r4,lr}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
ldr r4, _08040D38
@@ -113036,7 +113036,7 @@ sub_80422C4: @ 80422C4
bl PokemonGetEncryptedField
adds r0, r5, 0
adds r1, r4, 0
- bl SetStringCharset
+ bl ConvertInternationalString
_080422FC:
adds r4, r6, 0
adds r4, 0x50
@@ -124512,7 +124512,7 @@ sub_8047CE8: @ 8047CE8
adds r0, r6, 0
movs r3, 0xC
bl sub_804AFB8
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
ldr r1, [r5, 0xC]
movs r3, 0x80
@@ -124598,7 +124598,7 @@ _08047D86:
adds r5, 0x1
cmp r5, 0x2
ble _08047D86
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
movs r1, 0x80
lsls r1, 17
@@ -124888,7 +124888,7 @@ _08048048:
ldr r3, _0804809C
adds r0, r3, 0
strh r0, [r1]
- bl sub_8007378
+ bl OpenLink
movs r6, 0
movs r4, 0
_08048058:
@@ -124954,7 +124954,7 @@ _080480CE:
_080480D8: .4byte 0x03004824
_080480DC: .4byte 0x0000043c
_080480E0:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
adds r4, r0, 0
bl sub_800820C
lsls r4, 24
@@ -124963,7 +124963,7 @@ _080480E0:
bcs _080480F4
b _080484C6
_080480F4:
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
cmp r0, 0
beq _08048120
@@ -124998,7 +124998,7 @@ _08048130:
beq _0804813A
b _080484C6
_0804813A:
- bl sub_8007C48
+ bl IsLinkPlayerDataExchangeComplete
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -126420,7 +126420,7 @@ _08048D3E:
sub_8048D44: @ 8048D44
push {r4-r7,lr}
sub sp, 0xC
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r7, r0, 24
ldr r6, _08048D90
@@ -126440,7 +126440,7 @@ sub_8048D44: @ 8048D44
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
- bl sub_8008184
+ bl SetLinkDebugValues
ldr r0, [r6]
adds r0, 0x75
ldrb r0, [r0]
@@ -126494,7 +126494,7 @@ _08048DF8:
bne _08048E04
b _0804907C
_08048E04:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
cmp r0, 0
bne _08048E18
@@ -126504,7 +126504,7 @@ _08048E04:
.align 2, 0
_08048E14: .4byte 0x03004824
_08048E18:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _08048E24
ldr r1, [r0]
b _08049006
@@ -126522,7 +126522,7 @@ _08048E32:
.align 2, 0
_08048E38: .4byte 0x03004824
_08048E3C:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -126538,7 +126538,7 @@ _08048E4A:
adds r1, r2
movs r2, 0xC8
bl sub_8048D24
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _08048E70
ldr r1, [r0]
b _08049006
@@ -126570,7 +126570,7 @@ _08048E9A:
.align 2, 0
_08048EA0: .4byte 0x03004824
_08048EA4:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -126586,7 +126586,7 @@ _08048EB2:
adds r1, r2
movs r2, 0xC8
bl sub_8048D24
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _08048ED8
ldr r1, [r0]
b _08049006
@@ -126618,7 +126618,7 @@ _08048F02:
.align 2, 0
_08048F08: .4byte 0x03004824
_08048F0C:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -126634,7 +126634,7 @@ _08048F1A:
adds r1, r2
movs r2, 0xC8
bl sub_8048D24
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _08048F40
ldr r1, [r0]
b _08049006
@@ -126666,7 +126666,7 @@ _08048F6A:
.align 2, 0
_08048F70: .4byte 0x03004824
_08048F74:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -126682,7 +126682,7 @@ _08048F82:
adds r1, r2
movs r2, 0xD8
bl sub_8048D24
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r0, _08048FA8
ldr r1, [r0]
b _08049006
@@ -126714,7 +126714,7 @@ _08048FD2:
.align 2, 0
_08048FD8: .4byte 0x03004824
_08048FDC:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -126730,7 +126730,7 @@ _08048FDC:
adds r1, r2
movs r2, 0xB
bl sub_8048D24
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r1, [r4]
_08049006:
adds r1, 0x75
@@ -126889,7 +126889,7 @@ _0804913E:
strb r1, [r0]
_08049142:
movs r0, 0
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_08049148:
movs r2, 0x2
adds r0, r4, 0
@@ -126963,7 +126963,7 @@ _080491D2:
strb r2, [r0]
_080491D4:
movs r0, 0x1
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_080491DA:
pop {r4}
pop {r0}
@@ -127079,14 +127079,14 @@ _080492B6:
strb r1, [r0]
_080492B8:
movs r0, 0
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_080492BE:
movs r0, 0x2
ands r0, r5
cmp r0, 0
beq _080492CC
movs r0, 0x1
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_080492CC:
add sp, 0x4
pop {r4,r5}
@@ -127350,10 +127350,10 @@ _080494D4: .4byte 0x0000ddee
thumb_func_start sub_80494D8
sub_80494D8: @ 80494D8
push {r4,lr}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r4, r0, 24
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r1, r0, 24
cmp r1, 0
@@ -127367,7 +127367,7 @@ _080494FA:
adds r0, r4, 0
bl sub_80491E4
_08049500:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
_08049504:
cmp r4, 0
bne _0804950C
@@ -127528,7 +127528,7 @@ sub_8049620: @ 8049620
adds r0, 0x7B
movs r1, 0x5
strb r1, [r0]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -127549,7 +127549,7 @@ sub_8049620: @ 8049620
ldr r1, [r4]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
b _08049678
.align 2, 0
_08049668: .4byte 0x03004824
@@ -127735,7 +127735,7 @@ _080497C8:
ldr r1, [r1]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
_080497EC:
add sp, 0x8
pop {r4}
@@ -128092,7 +128092,7 @@ _08049A88:
ldr r1, [r5]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
_08049AB4:
add sp, 0xC
pop {r4,r5}
@@ -128169,7 +128169,7 @@ _08049B28:
ldr r1, [r4]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
_08049B56:
ldr r0, _08049B5C
ldr r0, [r0]
@@ -128207,7 +128207,7 @@ _08049B8C:
ldr r1, [r4]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
ldr r0, [r4]
_08049BAA:
adds r0, 0x7B
@@ -128322,7 +128322,7 @@ _08049C84:
thumb_func_start sub_8049C8C
sub_8049C8C: @ 8049C8C
push {r4,lr}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _08049CAE
@@ -130249,7 +130249,7 @@ _0804AB98:
ldr r1, [r1]
adds r1, 0x8C
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
b _0804ABD2
.align 2, 0
_0804ABB0: .4byte 0x03004824
@@ -131201,7 +131201,7 @@ sub_804B2B0: @ 804B2B0
.align 2, 0
_0804B2C0: .4byte 0x03002fa4
_0804B2C4:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
_0804B2CC:
@@ -131408,7 +131408,7 @@ _0804B47C:
movs r0, 0
strh r0, [r1]
bl ResetTasks
- bl AllocZeroed
+ bl CloseLink
ldr r6, _0804B570
ldr r5, _0804B574
str r5, [r6]
@@ -131527,7 +131527,7 @@ _0804B5A0: .4byte 0x040000d4
_0804B5A4: .4byte 0x80000280
_0804B5A8: .4byte gUnknown_08D004E0
_0804B5AC:
- bl sub_8007378
+ bl OpenLink
ldr r1, _0804B5C8
ldr r2, _0804B5CC
adds r1, r2
@@ -131565,13 +131565,13 @@ _0804B5E8:
_0804B5F4: .4byte 0x03004828
_0804B5F8: .4byte 0x0000043c
_0804B5FC:
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
cmp r0, 0
bne _0804B608
b _0804B746
_0804B608:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
adds r4, r0, 0
bl sub_800820C
lsls r4, 24
@@ -131607,7 +131607,7 @@ _0804B648:
beq _0804B656
b _0804B76E
_0804B656:
- bl sub_8007C48
+ bl IsLinkPlayerDataExchangeComplete
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -132060,7 +132060,7 @@ _0804BA60: .4byte 0x03004360
thumb_func_start sub_804BA64
sub_804BA64: @ 804BA64
push {lr}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
ldr r2, _0804BA90
movs r1, 0x80
@@ -132214,7 +132214,7 @@ _0804BB90:
ldr r1, [r4]
adds r1, 0x9E
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
ldr r1, [r4]
adds r1, 0xBD
ldrb r0, [r1]
@@ -132929,7 +132929,7 @@ sub_804C1A8: @ 804C1A8
ldrb r0, [r0]
cmp r0, 0
beq _0804C23C
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
ldr r3, _0804C220
movs r2, 0x80
@@ -135210,7 +135210,7 @@ _0804D60E:
_0804D612:
strb r0, [r1]
_0804D614:
- bl sub_8008710
+ bl HasLinkErrorOccurred
lsls r0, 24
cmp r0, 0
bne _0804D622
@@ -135232,7 +135232,7 @@ _0804D638: .4byte 0x020297d8
sub_804D63C: @ 804D63C
push {r4-r6,lr}
bl sub_804B2B0
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r5, r0, 24
movs r6, 0x1
@@ -135258,7 +135258,7 @@ _0804D664:
strb r6, [r0]
_0804D674:
movs r0, 0
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_0804D67A:
movs r0, 0x2
ands r0, r5
@@ -135279,7 +135279,7 @@ _0804D67A:
strb r1, [r0]
_0804D69C:
movs r0, 0x1
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
_0804D6A2:
pop {r4-r6}
pop {r0}
@@ -135979,7 +135979,7 @@ sub_804DC18: @ 804DC18
ldr r1, [r4]
adds r1, 0x9E
movs r2, 0x14
- bl sub_8007E88
+ bl SendBlock
ldr r0, [r4]
adds r0, 0x9C
movs r1, 0x2
@@ -136460,7 +136460,7 @@ _0804E10C:
ldr r0, _0804E140
bl SetMainCallback2
_0804E11A:
- bl sub_8008710
+ bl HasLinkErrorOccurred
lsls r0, 24
cmp r0, 0
bne _0804E128
@@ -137883,8 +137883,8 @@ _0804ED94:
bne _0804EDA0
b _0804F0CE
_0804EDA0:
- bl sub_8007F18
- bl link_get_multiplayer_id
+ bl ResetBlockReceivedFlags
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
beq _0804EDB0
@@ -137907,7 +137907,7 @@ _0804EDB8:
b _0804F0CE
_0804EDCE:
bl sub_8071EF4
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
adds r4, r0, 0
bl sub_8008198
lsls r4, 24
@@ -137942,12 +137942,12 @@ _0804EDF0:
strh r0, [r1]
adds r5, 0x1
_0804EE18:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
blt _0804EDF0
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
b _0804F0AA
.align 2, 0
_0804EE2C: .4byte 0x03002b80
@@ -137963,7 +137963,7 @@ _0804EE30:
bl sub_804E7C0
b _0804EE7A
_0804EE46:
- bl sub_8007B78
+ bl GetLinkPlayerCount
ldr r2, _0804EE98
ldr r1, [r2]
adds r1, 0x88
@@ -138576,7 +138576,7 @@ _0804F2B6:
lsls r1, r6, 24
lsrs r1, 24
bl StartSpriteAnim
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
ldr r1, [r7]
adds r1, 0x9A
@@ -140271,7 +140271,7 @@ sub_80500A8: @ 80500A8
movs r6, 0
ldr r5, _080500EC
ldr r4, [r5]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 23
adds r4, 0xA2
@@ -140337,7 +140337,7 @@ _0805010A:
ldr r0, [r4]
adds r0, 0x54
ldrh r4, [r0]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
adds r1, r0, 0
lsls r1, 24
lsrs r1, 24
@@ -140453,7 +140453,7 @@ _08050218:
lsls r5, 1
adds r1, r5
ldrh r1, [r1]
- bl sub_8008184
+ bl SetLinkDebugValues
bl sub_804FE70
ldr r0, [r4]
adds r0, r5
@@ -141437,7 +141437,7 @@ _08050950: .4byte gUnknown_0842D2C5
sub_8050954: @ 8050954
push {r4-r7,lr}
bl sub_8051474
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
ldr r0, _08050978
ldr r0, [r0]
adds r0, 0x6F
@@ -141471,7 +141471,7 @@ _08050980:
.4byte _08050C64
.4byte _08050C98
_080509B4:
- bl sub_8007B60
+ bl ClearLinkCallback
ldr r0, _080509C8
movs r1, 0x80
lsls r1, 1
@@ -141544,7 +141544,7 @@ _08050A40:
.align 2, 0
_08050A48: .4byte 0x03007400
_08050A4C:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
beq _08050A58
@@ -141574,13 +141574,13 @@ _08050A64:
strh r2, [r0]
movs r0, 0
movs r2, 0x28
- bl sub_8007E88
+ bl SendBlock
ldr r1, [r4]
b _08050C86
.align 2, 0
_08050A90: .4byte 0x03004854
_08050A94:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
cmp r0, 0
bne _08050AA0
@@ -141603,7 +141603,7 @@ _08050AA0:
ldrb r0, [r1]
adds r0, 0x1
strb r0, [r1]
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
b _08050CB6
.align 2, 0
_08050AC8: .4byte 0x03002b80
@@ -142582,7 +142582,7 @@ _080512B8:
_080512C4:
strh r1, [r0]
_080512C6:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
beq _080512D2
@@ -142651,7 +142651,7 @@ _08051348:
lsls r0, 24
lsrs r4, r0, 24
_0805134E:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -142666,7 +142666,7 @@ _08051368:
lsls r0, 24
lsrs r4, r0, 24
_0805136E:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -142680,7 +142680,7 @@ _0805136E:
cmp r0, 0
bne _08051368
_0805138A:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -142696,7 +142696,7 @@ _080513A4:
lsls r0, 24
lsrs r4, r0, 24
_080513AA:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -142714,7 +142714,7 @@ _080513C6:
movs r6, 0
ldr r0, _080513E8
strh r0, [r5]
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@@ -143154,7 +143154,7 @@ sub_80516F8: @ 80516F8
ldrb r0, [r6]
cmp r0, 0
beq _0805180C
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r1, r0, 24
cmp r1, 0
@@ -144021,7 +144021,7 @@ _08051D56:
adds r0, r4, r1
ldrb r1, [r0, 0x1A]
adds r0, r7, 0
- bl SetStringCharset
+ bl ConvertInternationalString
adds r0, r7, 0
ldr r1, _08051F20
bl StringAppend
diff --git a/asm/rom5.s b/asm/rom5.s
index 74f58fab3..8b06e032a 100644
--- a/asm/rom5.s
+++ b/asm/rom5.s
@@ -12738,7 +12738,7 @@ _08081078:
beq _080810B4
b _080810CC
_0808107E:
- bl sub_8007B6C
+ bl ClearLinkCallback_2
movs r0, 0x1
movs r1, 0
bl fade_screen
@@ -16562,7 +16562,7 @@ sub_8082D9C: @ 8082D9C
lsrs r4, r0, 24
lsls r1, 24
lsrs r5, r1, 24
- bl sub_8007BA4
+ bl GetLinkPlayerDataExchangeStatusTimed
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2
@@ -16577,7 +16577,7 @@ _08082DBC:
beq _08082DE8
b _08082DEC
_08082DC2:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r1, r0, 24
cmp r4, r1
@@ -16611,7 +16611,7 @@ sub_8082DF4: @ 8082DF4
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
- bl sub_8008710
+ bl HasLinkErrorOccurred
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -16647,7 +16647,7 @@ sub_8082E28: @ 8082E28
ands r0, r1
cmp r0, 0
beq _08082E64
- bl sub_80086F4
+ bl IsLinkConnectionEstablished
lsls r0, 24
cmp r0, 0
bne _08082E64
@@ -16677,12 +16677,12 @@ sub_8082E6C: @ 8082E6C
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
- bl sub_80086F4
+ bl IsLinkConnectionEstablished
lsls r0, 24
cmp r0, 0
beq _08082E82
movs r0, 0x1
- bl sub_8008704
+ bl SetSuppressLinkErrorMessage
_08082E82:
ldr r0, _08082E94
ldrh r1, [r0, 0x2E]
@@ -16717,7 +16717,7 @@ sub_8082EB8: @ 8082EB8
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
- bl sub_80086BC
+ bl GetSioMultiSI
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -16785,9 +16785,9 @@ sub_8082F20: @ 8082F20
ldrsh r2, [r4, r3]
cmp r2, 0
bne _08082F4C
- bl sub_8007B88
+ bl OpenLinkTimed
bl sub_80082EC
- bl sub_8007CC8
+ bl ResetLinkPlayers
b _08082F58
.align 2, 0
_08082F48: .4byte 0x03004b28
@@ -16814,7 +16814,7 @@ sub_8082F68: @ 8082F68
push {r4,r5,lr}
lsls r0, 24
lsrs r4, r0, 24
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r5, r0, 24
adds r0, r4, 0
@@ -16828,7 +16828,7 @@ sub_8082F68: @ 8082F68
cmp r5, 0x1
bls _08082FDC
movs r0, 0x1
- bl sub_8008704
+ bl SetSuppressLinkErrorMessage
ldr r1, _08082FC0
lsls r0, r4, 2
adds r0, r4
@@ -16836,7 +16836,7 @@ sub_8082F68: @ 8082F68
adds r4, r0, r1
movs r0, 0
strh r0, [r4, 0xE]
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -16923,7 +16923,7 @@ sub_808303C: @ 808303C
mov r9, r0
mov r7, r8
add r7, r9
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r5, r0, 24
adds r0, r4, 0
@@ -17006,7 +17006,7 @@ sub_80830E4: @ 80830E4
bne _08083178
bl sub_800820C
adds r4, r0, 0
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -17079,7 +17079,7 @@ sub_8083188: @ 8083188
lsrs r0, 24
cmp r0, 0x1
beq _080831EA
- bl sub_8008300
+ bl GetLinkPlayerCount_2
adds r4, r0, 0
bl sub_800820C
lsls r4, 24
@@ -17152,10 +17152,10 @@ _08083244: .4byte 0x03004b20
_08083248: .4byte 0x0202e8dc
_0808324C: .4byte sub_80833C4
_08083250:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
ldr r4, _08083278
strb r0, [r4]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
ldr r1, _0808327C
strb r0, [r1]
ldrb r0, [r4]
@@ -17205,10 +17205,10 @@ _080832BC: .4byte 0x0202e8dc
_080832C0: .4byte 0x03004b20
_080832C4: .4byte sub_80833C4
_080832C8:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
ldr r4, _08083300
strb r0, [r4]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
ldr r1, _08083304
strb r0, [r1]
ldrb r0, [r4]
@@ -17245,7 +17245,7 @@ sub_8083314: @ 8083314
bl sub_8082DF4
cmp r0, 0x1
beq _080833B6
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
adds r4, r0, 0
bl sub_8008198
lsls r4, 24
@@ -17271,14 +17271,14 @@ _08083340:
lsls r0, 24
lsrs r4, r0, 24
_0808335A:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
bcc _08083340
movs r0, 0
- bl sub_8008704
- bl sub_8007F18
+ bl SetSuppressLinkErrorMessage
+ bl ResetBlockReceivedFlags
bl textbox_close
ldr r0, _08083398
ldrh r0, [r0]
@@ -17536,7 +17536,7 @@ _08083560:
ldrh r0, [r0]
cmp r0, 0x1
bne _08083586
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
movs r1, 0
@@ -17759,8 +17759,8 @@ sub_8083710: @ 8083710
ldrsh r2, [r4, r3]
cmp r2, 0
bne _08083744
- bl sub_8007378
- bl sub_8007CC8
+ bl OpenLink
+ bl ResetLinkPlayers
ldr r0, _08083740
movs r1, 0x50
bl CreateTask
@@ -17792,12 +17792,12 @@ sub_8083760: @ 8083760
lsls r0, 24
lsrs r4, r0, 24
adds r5, r4, 0
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
bls _080837A6
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -17837,7 +17837,7 @@ sub_80837B4: @ 80837B4
lsrs r5, r0, 24
bl sub_800820C
adds r4, r0, 0
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -17868,7 +17868,7 @@ sub_80837EC: @ 80837EC
ldrb r0, [r0]
cmp r0, 0x1
bne _08083814
- bl sub_8007C48
+ bl IsLinkPlayerDataExchangeComplete
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -17933,7 +17933,7 @@ _08083870:
ldr r2, _0808388C
adds r0, r2, 0
strh r0, [r1]
- bl sub_8007B6C
+ bl ClearLinkCallback_2
b _080838BE
.align 2, 0
_08083888: .4byte 0x03002b74
@@ -18240,7 +18240,7 @@ _08083ADE:
movs r0, 0x1
movs r1, 0
bl fade_screen
- bl sub_8007B6C
+ bl ClearLinkCallback_2
b _08083B14
_08083AF0:
ldr r0, _08083B00
@@ -18445,7 +18445,7 @@ sub_8083C50: @ 8083C50
lsls r0, 17
cmp r1, r0
ble _08083C82
- bl AllocZeroed
+ bl CloseLink
ldr r0, _08083C9C
bl SetMainCallback2
adds r0, r4, 0
@@ -18463,7 +18463,7 @@ _08083C90:
bx r0
.align 2, 0
_08083C98: .4byte 0x03004b20
-_08083C9C: .4byte sub_80085BC
+_08083C9C: .4byte CB2_LinkError
_08083CA0: .4byte 0x03002fa4
thumb_func_end sub_8083C50
@@ -51607,7 +51607,7 @@ sub_8094140: @ 8094140
bl StringCopy
ldrb r1, [r5, 0x8]
adds r0, r4, 0
- bl SetStringCharset
+ bl ConvertInternationalString
adds r0, r4, 0
movs r1, 0x7
movs r2, 0x5
@@ -51812,7 +51812,7 @@ sub_80942F8: @ 80942F8
bl StringCopy
ldrb r1, [r5, 0x8]
adds r0, r4, 0
- bl SetStringCharset
+ bl ConvertInternationalString
ldr r1, _08094330
adds r0, r4, 0
bl StringAppend
@@ -75411,7 +75411,7 @@ _0809FD1C:
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
- bl SetStringCharset
+ bl ConvertInternationalString
ldr r5, _0809FD68
adds r0, r5, 0
movs r1, 0xD
@@ -76528,7 +76528,7 @@ sub_80A0664: @ 80A0664
ldr r0, _080A06A4
cmp r1, r0
bne _080A06B0
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
movs r1, 0x1
eors r0, r1
lsls r0, 24
@@ -96228,7 +96228,7 @@ sub_80A9E3C: @ 80A9E3C
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
- bl sub_8007378
+ bl OpenLink
movs r1, 0
ldr r3, _080A9E74
movs r2, 0xFF
@@ -96280,14 +96280,14 @@ sub_80A9E80: @ 80A9E80
.align 2, 0
_080A9EA0: .4byte 0x03004b20
_080A9EA4:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
bls _080A9ECC
movs r0, 0
strh r0, [r4, 0x8]
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
cmp r0, 0
beq _080A9EC8
@@ -96347,10 +96347,10 @@ sub_80A9F10: @ 80A9F10
ldrb r0, [r0]
cmp r0, 0
beq _080A9F3E
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
ldr r1, _080A9F48
strb r0, [r1]
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@@ -99307,7 +99307,7 @@ sub_80AB6B4: @ 80AB6B4
lsls r1, 16
cmp r1, 0
bgt _080AB6F2
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
adds r0, r4, 0
bl DestroyTask
ldr r0, _080AB6FC
@@ -127938,7 +127938,7 @@ sub_80B92AC: @ 80B92AC
ldr r1, [r1]
movs r2, 0xA4
bl memcpy
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080B935C
@@ -128300,7 +128300,7 @@ _080B9650:
movs r0, 0xC8
lsls r0, 1
strh r0, [r5, 0x8]
- bl sub_8007B6C
+ bl ClearLinkCallback_2
b _080B97D6
.align 2, 0
_080B9674: .4byte gUnknown_0842C89A
@@ -128319,10 +128319,10 @@ _080B9688:
movs r0, 0x65
b _080B97D4
_080B9690:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r4, r0, 24
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -128351,7 +128351,7 @@ _080B96CC: .4byte 0x0000012d
_080B96D0:
bl sub_800820C
adds r4, r0, 0
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -128361,7 +128361,7 @@ _080B96D0:
strh r4, [r5, 0x20]
lsls r4, 16
asrs r4, 16
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r0, 24
lsls r1, r0, 4
@@ -128375,7 +128375,7 @@ _080B96D0:
_080B9706:
bl sub_800820C
adds r4, r0, 0
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -128415,7 +128415,7 @@ _080B9734:
_080B9758: .4byte 0x03002fa4
_080B975C: .4byte 0x020231cc
_080B9760:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r0, 24
movs r1, 0
@@ -128521,7 +128521,7 @@ _080B981C:
.align 2, 0
_080B983C: .4byte 0x03002a70
_080B9840:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080B9860
@@ -128583,7 +128583,7 @@ sub_80B9890: @ 80B9890
ldr r1, _080B98D0
adds r0, r1
mov r10, r0
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x4]
@@ -128651,7 +128651,7 @@ _080B9934:
bl memcpy
_080B993C:
mov r0, r9
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
mov r2, r8
lsls r1, r2, 1
adds r1, r5, r1
@@ -128673,7 +128673,7 @@ _080B9960:
lsrs r0, 24
_080B9966:
mov r9, r0
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r9, r0
@@ -128690,7 +128690,7 @@ _080B9966:
adds r1, 0x1
strh r1, [r0, 0x8]
_080B998A:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
ldr r1, [sp, 0x8]
@@ -128810,7 +128810,7 @@ sub_80B9A50: @ 80B9A50
thumb_func_start sub_80B9A58
sub_80B9A58: @ 80B9A58
push {lr}
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
pop {r1}
@@ -128843,7 +128843,7 @@ _080B9A84: .4byte 0x00001230
sub_80B9A88: @ 80B9A88
push {r4,lr}
adds r4, r0, 0
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -128873,7 +128873,7 @@ _080B9AAC:
_080B9ABC: .4byte gUnknown_083D0288
_080B9AC0:
movs r0, 0
- bl sub_8007CB0
+ bl GetLinkPlayerTrainerId
adds r3, r0, 0
movs r0, 0x1
ands r3, r0
@@ -128895,7 +128895,7 @@ _080B9AD6:
_080B9AE8: .4byte gUnknown_083D028A
_080B9AEC:
movs r0, 0
- bl sub_8007CB0
+ bl GetLinkPlayerTrainerId
movs r1, 0x9
bl __umodsi3
adds r3, r0, 0
@@ -129117,7 +129117,7 @@ sub_80B9C6C: @ 80B9C6C
ldr r0, _080B9DA8
ldrh r0, [r0, 0x4]
bl SeedRng
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
mov r8, r0
@@ -136497,7 +136497,7 @@ sub_80BD674: @ 80BD674
bne _080BD68C
b _080BD790
_080BD68C:
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2
@@ -141675,7 +141675,7 @@ sub_80BFE24: @ 80BFE24
str r0, [sp, 0x8]
add r0, sp, 0x1C
str r0, [sp, 0xC]
- bl sub_8007B78
+ bl GetLinkPlayerCount
ldr r1, _080BFEA0
strb r0, [r1]
_080BFE50:
@@ -141943,7 +141943,7 @@ sub_80C004C: @ 80C004C
adds r4, r1, 0
lsls r0, r2, 24
lsrs r0, 24
- bl sub_8007CB0
+ bl GetLinkPlayerTrainerId
adds r5, r0, 0
movs r2, 0xFF
ands r0, r2
@@ -141999,7 +141999,7 @@ sub_80C00B4: @ 80C00B4
adds r4, r1, 0
lsls r0, r2, 24
lsrs r0, 24
- bl sub_8007CB0
+ bl GetLinkPlayerTrainerId
adds r2, r0, 0
movs r3, 0xFF
ands r0, r3
@@ -142069,7 +142069,7 @@ sub_80C0134: @ 80C0134
adds r4, r1, 0
lsls r0, r2, 24
lsrs r0, 24
- bl sub_8007CB0
+ bl GetLinkPlayerTrainerId
adds r5, r0, 0
movs r2, 0xFF
ands r0, r2
@@ -142666,7 +142666,7 @@ sub_80C05C4: @ 80C05C4
str r0, [sp, 0x8]
add r0, sp, 0x1C
str r0, [sp, 0xC]
- bl sub_8007B78
+ bl GetLinkPlayerCount
ldr r1, _080C0600
strb r0, [r1]
movs r0, 0
@@ -143054,7 +143054,7 @@ sub_80C08FC: @ 80C08FC
bhi _080C0914
adds r0, r5, 0
movs r1, 0x1
- bl SetStringCharset
+ bl ConvertInternationalString
_080C0914:
pop {r4,r5}
pop {r0}
@@ -146216,7 +146216,7 @@ sub_80C255C: @ 80C255C
ldrb r0, [r0]
cmp r0, 0
beq _080C258C
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@@ -150457,7 +150457,7 @@ sub_80C4674: @ 80C4674
bne _080C4690
adds r0, r4, 0
movs r1, 0x1
- bl SetStringCharset
+ bl ConvertInternationalString
_080C4690:
pop {r4}
pop {r0}
@@ -150495,7 +150495,7 @@ sub_80C4698: @ 80C4698
lsls r1, 24
lsrs r1, 24
adds r0, r5, 0
- bl SetStringCharset
+ bl ConvertInternationalString
_080C46DA:
pop {r4,r5}
pop {r0}
@@ -152003,7 +152003,7 @@ sub_80C5228: @ 80C5228
cmp r0, 0
beq _080C524C
ldr r4, _080C5248
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
strh r0, [r4]
@@ -158659,7 +158659,7 @@ sub_80C857C: @ 80C857C
lsrs r0, 24
adds r1, r5, 0
adds r2, r4, 0
- bl sub_8007E88
+ bl SendBlock
pop {r4,r5}
pop {r0}
bx r0
@@ -158676,13 +158676,13 @@ sub_80C85AC: @ 80C85AC
lsls r1, 17
lsls r1, r0
lsrs r4, r1, 24
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
adds r1, r4, 0
ands r1, r0
cmp r1, 0
beq _080C85D0
adds r0, r4, 0
- bl sub_8007F30
+ bl ResetBlockReceivedFlag
movs r0, 0x1
b _080C85D2
_080C85D0:
@@ -158698,7 +158698,7 @@ sub_80C85D8: @ 80C85D8
push {r4,lr}
movs r4, 0
_080C85DC:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
lsrs r0, 24
asrs r0, r4
@@ -158712,7 +158712,7 @@ _080C85F2:
adds r4, 0x1
cmp r4, 0x3
ble _080C85DC
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
movs r0, 0x1
_080C85FE:
pop {r4}
@@ -158781,10 +158781,10 @@ sub_80C8660: @ 80C8660
ldrb r0, [r0]
cmp r0, 0
beq _080C868E
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
ldr r1, _080C8698
strb r0, [r1]
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@@ -158916,7 +158916,7 @@ sub_80C8734: @ 80C8734
.align 2, 0
_080C8768: .4byte 0x03004b20
_080C876C:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080C87A8
@@ -158990,7 +158990,7 @@ _080C87EA:
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
- bl SetStringCharset
+ bl ConvertInternationalString
b _080C883E
.align 2, 0
_080C8818: .4byte 0x02038570
@@ -159003,7 +159003,7 @@ _080C8828:
bne _080C8838
adds r0, r4, 0
movs r1, 0x1
- bl SetStringCharset
+ bl ConvertInternationalString
b _080C883E
_080C8838:
strb r0, [r4, 0x5]
@@ -159092,7 +159092,7 @@ sub_80C88AC: @ 80C88AC
.align 2, 0
_080C88D4: .4byte 0x03004b20
_080C88D8:
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080C891E
@@ -159166,7 +159166,7 @@ _080C896C:
ldr r1, _080C8994
ldrh r0, [r4, 0x1A]
strb r0, [r1]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080C898C
@@ -159765,7 +159765,7 @@ _080C8E50:
ldr r1, _080C8E78
movs r0, 0x64
strb r0, [r1]
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
cmp r0, 0
bne _080C8E70
@@ -261633,7 +261633,7 @@ sub_80FA4E4: @ 80FA4E4
sub sp, 0x4
adds r6, r0, 0
adds r5, r1, 0
- bl sub_8007B78
+ bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
mov r8, r0
@@ -306954,7 +306954,7 @@ _0810FED0:
bne _0810FEF2
adds r0, r4, 0
movs r1, 0x1
- bl SetStringCharset
+ bl ConvertInternationalString
_0810FEF2:
pop {r4}
pop {r0}
@@ -335630,7 +335630,7 @@ dp01_tbl3_exec_completed: @ 811E314
ands r0, r1
cmp r0, 0
beq _0811E368
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
mov r1, sp
strb r0, [r1]
movs r0, 0x2
@@ -338474,7 +338474,7 @@ _0811FB20: .4byte 0x03002970
_0811FB24:
movs r5, 0
ldr r4, _0811FC08
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
movs r1, 0x1
eors r0, r1
lsls r0, 24
@@ -341124,7 +341124,7 @@ sub_8120FFC: @ 8120FFC
mov r8, r1
movs r6, 0
movs r4, 0
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
lsls r0, 24
lsrs r7, r0, 24
mov r0, r9
@@ -363132,7 +363132,7 @@ dp01_tbl6_exec_completed: @ 812B7C0
ands r0, r1
cmp r0, 0
beq _0812B814
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
mov r1, sp
strb r0, [r1]
movs r0, 0x2
@@ -387949,7 +387949,7 @@ dp01_tbl5_exec_completed: @ 813796C
ands r0, r1
cmp r0, 0
beq _081379C0
- bl link_get_multiplayer_id
+ bl GetMultiplayerId
mov r1, sp
strb r0, [r1]
movs r0, 0x2
@@ -395915,7 +395915,7 @@ _0813BA2E:
movs r0, 0
b _0813BA3A
.align 2, 0
-_0813BA34: .4byte sub_8008C6C
+_0813BA34: .4byte SerialCB
_0813BA38:
movs r0, 0x1
_0813BA3A:
@@ -396208,7 +396208,7 @@ task_intro_2: @ 813BC8C
movs r0, 0xCF
lsls r0, 1
bl m4aSongNumStart
- bl sub_8008838
+ bl ResetSerial
add sp, 0x4
pop {r4,r5}
pop {r0}
@@ -418178,7 +418178,7 @@ _08146AA8:
ldr r2, _08146AD0
adds r0, r2, 0
strh r0, [r1]
- bl sub_8007378
+ bl OpenLink
b _08146DA4
.align 2, 0
_08146AC4: .4byte 0x03001770
@@ -418225,7 +418225,7 @@ _08146B18:
_08146B24:
b _08146D7C
_08146B26:
- bl sub_8008300
+ bl GetLinkPlayerCount_2
lsls r0, 24
lsrs r2, r0, 24
cmp r2, 0x2
@@ -418264,14 +418264,14 @@ _08146B70:
_08146B7A:
movs r0, 0x5
bl audio_play
- bl AllocZeroed
+ bl CloseLink
ldr r0, _08146B8C
adds r1, r4, r0
b _08146C54
.align 2, 0
_08146B8C: .4byte 0x0000043c
_08146B90:
- bl sub_80086F4
+ bl IsLinkConnectionEstablished
lsls r0, 24
cmp r0, 0
beq _08146C38
@@ -418281,7 +418281,7 @@ _08146B90:
bne _08146BA4
b _08146DA4
_08146BA4:
- bl sub_8007BA4
+ bl GetLinkPlayerDataExchangeStatusTimed
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@@ -418318,7 +418318,7 @@ _08146BE8:
.align 2, 0
_08146BFC: .4byte gUnknown_0842C535
_08146C00:
- bl AllocZeroed
+ bl CloseLink
movs r0, 0x6
movs r1, 0x5
movs r2, 0x17
@@ -418353,7 +418353,7 @@ _08146C38:
_08146C46:
movs r0, 0x5
bl audio_play
- bl AllocZeroed
+ bl CloseLink
ldr r2, _08146C60
adds r1, r4, r2
_08146C54:
@@ -418372,13 +418372,13 @@ _08146C64:
_08146C70:
b _08146D7C
_08146C72:
- bl sub_8007EE4
+ bl GetBlockRecievedStatus
lsls r0, 24
cmp r0, 0
bne _08146C7E
b _08146DA4
_08146C7E:
- bl sub_8007F18
+ bl ResetBlockReceivedFlags
ldr r1, _08146C8C
ldr r2, _08146C90
adds r1, r2
@@ -418515,11 +418515,11 @@ _08146DA4:
ands r0, r1
cmp r0, 0
beq _08146DE4
- bl sub_8008310
+ bl IsLinkMaster
lsls r0, 24
cmp r0, 0
bne _08146DE4
- bl AllocZeroed
+ bl CloseLink
movs r0, 0x6
movs r1, 0x5
movs r2, 0x17
@@ -425426,7 +425426,7 @@ sub_814A568: @ 814A568
bhi _0814A582
adds r0, r4, 0
movs r1, 0x1
- bl SetStringCharset
+ bl ConvertInternationalString
b _0814A588
_0814A582:
adds r0, r4, 0
diff --git a/charmap.txt b/charmap.txt
index f8708e10a..4993f8d9d 100644
--- a/charmap.txt
+++ b/charmap.txt
@@ -313,6 +313,7 @@ TALL_PLUS = FC 0C FB
'ッ' = A0
@ Japanese punctuation
+' ' = 00
'ー' = AE
'·' = AF
'‥' = B0
diff --git a/data/data2.s b/data/data2.s
index ec59eb6ee..1b6f49224 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -5,22 +5,6 @@
.section .rodata
- .global gUnknown_081E7330
-gUnknown_081E7330: @ 81E7330
- .incbin "baserom.gba", 0x001e7330, 0x20
-
- .global gUnknown_081E7350
-gUnknown_081E7350: @ 81E7350
- .incbin "baserom.gba", 0x001e7350, 0x27c
-
- .global gUnknown_081E75CC
-gUnknown_081E75CC: @ 81E75CC
- .incbin "baserom.gba", 0x001e75cc, 0x30
-
- .global gUnknown_081E75FC
-gUnknown_081E75FC: @ 81E75FC
- .incbin "baserom.gba", 0x001e75fc, 0x14
-
@ 81E7610
.include "data/rtc.s"
diff --git a/ewram_syms.txt b/ewram_syms.txt
index 148eade7b..ef93c424c 100644
--- a/ewram_syms.txt
+++ b/ewram_syms.txt
@@ -1,7 +1,12 @@
+unk_2000000 = 0x2000000;
+unk_2004000 = 0x2004000;
+
gUnknown_020239F8 = 0x20239F8;
+gSaveBlock2 = 0x2024EA4;
+
+word_203855E = 0x203855E;
+
gUnknown_0203869A = 0x203869A;
gTileBuffer = 0x2039360;
-
-gSaveBlock2 = 0x2024EA4;
diff --git a/generated.mk b/generated.mk
index c72daf2ac..70d50e8f8 100644
--- a/generated.mk
+++ b/generated.mk
@@ -10,7 +10,9 @@ include/fonts/down_arrow_tiles.h \
include/fonts/unknown_palette_81E6692.h \
include/fonts/default_palette.h
-generated: $(GEN_FONT_HEADERS)
+LINK_HEADERS := include/link/digit_tiles.h include/link/digit_palette.h
+
+generated: $(GEN_FONT_HEADERS) $(LINK_HEADERS)
include/fonts/font0_lat_glyphs.h: graphics/fonts/font0_lat.1bpp
$(BIN2C) $< sFont0LatinGlyphs >$@ -static -col 8 -pad 4
@@ -35,3 +37,9 @@ include/fonts/unknown_palette_81E6692.h: graphics/fonts/unknown_81E6692.gbapal
include/fonts/default_palette.h: graphics/fonts/default.gbapal
$(BIN2C) $< gFontDefaultPalette >$@ -size 2 -pad 6
+
+include/link/digit_tiles.h: graphics/interface/link_test_digits.4bpp
+ $(BIN2C) $< sLinkTestDigitTiles >$@ -static -size 4 -pad 10
+
+include/link/digit_palette.h: graphics/interface/link_test_digits.gbapal
+ $(BIN2C) $< sLinkTestDigitPalette >$@ -static -size 2 -pad 6
diff --git a/graphics/interface/link_test_digits.pal b/graphics/interface/link_test_digits.pal
new file mode 100644
index 000000000..5362e8d6d
--- /dev/null
+++ b/graphics/interface/link_test_digits.pal
@@ -0,0 +1,19 @@
+JASC-PAL
+0100
+16
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 255 255
diff --git a/graphics/interface/link_test_digits.png b/graphics/interface/link_test_digits.png
new file mode 100644
index 000000000..fe71d3387
--- /dev/null
+++ b/graphics/interface/link_test_digits.png
Binary files differ
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 87c167ab6..3c30c494e 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -350,6 +350,7 @@
#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS)
#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS)
#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS)
+#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA)
#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)
#define REG_NR10 (*(vu8 *)REG_ADDR_NR10)
@@ -433,9 +434,21 @@
#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L)
#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H)
+#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT)
+#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8)
+#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
+#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
+#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
+#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
+#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
+#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
+#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3)
+
#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT)
#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
+#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
+
#define REG_IME (*(vu16 *)REG_ADDR_IME)
#define REG_IE (*(vu16 *)REG_ADDR_IE)
#define REG_IF (*(vu16 *)REG_ADDR_IF)
@@ -526,6 +539,31 @@
#define TIMER_INTR_ENABLE 0x40
#define TIMER_ENABLE 0x80
+// serial
+#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
+#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
+#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
+#define SIO_UART_MODE 0x3000 // UART communication mode
+
+#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
+#define SIO_38400_BPS 0x0001 // 38400 bps
+#define SIO_57600_BPS 0x0002 // 57600 bps
+#define SIO_115200_BPS 0x0003 // 115200 bps
+
+#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
+#define SIO_MULTI_SD 0x0008 // SD terminal
+
+#define SIO_ERROR 0x0040 // Detect error
+#define SIO_START 0x0080 // Start transfer
+#define SIO_ENABLE 0x0080 // Enable SIO
+
+#define SIO_INTR_ENABLE 0x4000
+
+#define SIO_MULTI_SI_SHIFT 2
+#define SIO_MULTI_SI_MASK 0x1
+#define SIO_MULTI_DI_SHIFT 3
+#define SIO_MULTI_DI_MASK 0x1
+
// keys
#define A_BUTTON 0x0001
#define B_BUTTON 0x0002
diff --git a/include/gba/types.h b/include/gba/types.h
index 4e1ab3003..1274d4f0d 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -1,19 +1,23 @@
#ifndef GUARD_GBA_TYPES_H
#define GUARD_GBA_TYPES_H
-typedef unsigned char u8;
-typedef unsigned short u16;
-typedef unsigned int u32;
-typedef signed char s8;
-typedef signed short s16;
-typedef signed int s32;
-
-typedef volatile u8 vu8;
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+typedef signed char s8;
+typedef signed short s16;
+typedef signed int s32;
+typedef signed long long s64;
+
+typedef volatile u8 vu8;
typedef volatile u16 vu16;
typedef volatile u32 vu32;
-typedef volatile s8 vs8;
+typedef volatile u64 vu64;
+typedef volatile s8 vs8;
typedef volatile s16 vs16;
typedef volatile s32 vs32;
+typedef volatile s64 vs64;
typedef float f32;
typedef double f64;
@@ -67,4 +71,28 @@ struct ObjAffineSrcData
u16 rotation;
};
+// Multi-player SIO Control Structure
+struct SioMultiCnt
+{
+ u16 baudRate:2; // baud rate
+ u16 si:1; // SI terminal
+ u16 sd:1; // SD terminal
+ u16 id:2; // ID
+ u16 error:1; // error flag
+ u16 enable:1; // SIO enable
+ u16 unused_11_8:4;
+ u16 mode:2; // communication mode (should equal 2)
+ u16 intrEnable:1; // IRQ enable
+ u16 unused_15:1;
+ u16 data; // data
+};
+
+#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
+
+// baud rate
+#define ST_SIO_9600_BPS 0 // 9600 bps
+#define ST_SIO_38400_BPS 1 // 38400 bps
+#define ST_SIO_57600_BPS 2 // 57600 bps
+#define ST_SIO_115200_BPS 3 // 115200 bps
+
#endif // GUARD_GBA_TYPES_H
diff --git a/include/global.h b/include/global.h
index 21b1e41af..5e6bd5bd4 100644
--- a/include/global.h
+++ b/include/global.h
@@ -10,6 +10,8 @@
// Prevent cross-jump optimization.
#define BLOCK_CROSS_JUMP asm("");
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
+
extern u8 gStringVar1[];
extern u8 gStringVar2[];
extern u8 gStringVar3[];
@@ -38,8 +40,8 @@ struct SaveBlock2
{
u8 playerName[8];
u8 playerGender;
- u16 playerTrainerId;
- u16 playerSecretId;
+ u8 sb2_field_9;
+ u8 playerTrainerId[4];
u16 playTimeHours;
u8 playTimeMinutes;
u8 playTimeSeconds;
diff --git a/include/link.h b/include/link.h
new file mode 100644
index 000000000..ba6bcd6f9
--- /dev/null
+++ b/include/link.h
@@ -0,0 +1,182 @@
+#ifndef GUARD_LINK_H
+#define GUARD_LINK_H
+
+#include "global.h"
+
+#define MAX_LINK_PLAYERS 4
+#define CMD_LENGTH 8
+#define QUEUE_CAPACITY 50
+#define BLOCK_BUFFER_SIZE 0x100
+
+#define LINK_STAT_LOCAL_ID 0x00000003
+#define LINK_STAT_PLAYER_COUNT 0x0000001C
+#define LINK_STAT_PLAYER_COUNT_SHIFT 2
+#define LINK_STAT_MASTER 0x00000020
+#define LINK_STAT_MASTER_SHIFT 5
+#define LINK_STAT_CONN_ESTABLISHED 0x00000040
+#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6
+#define LINK_STAT_RECEIVED_NOTHING 0x00000100
+#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
+#define LINK_STAT_ERRORS 0x0007F000
+
+#define EXTRACT_PLAYER_COUNT(status) \
+(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)
+#define EXTRACT_MASTER(status) \
+(((status) >> LINK_STAT_MASTER_SHIFT) & 1)
+#define EXTRACT_CONN_ESTABLISHED(status) \
+(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)
+#define EXTRACT_RECEIVED_NOTHING(status) \
+(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)
+
+#define MASTER_HANDSHAKE 0x8FFF
+#define SLAVE_HANDSHAKE 0xB9A0
+
+enum
+{
+ LINK_STATE_START0,
+ LINK_STATE_START1,
+ LINK_STATE_HANDSHAKE,
+ LINK_STATE_INIT_TIMER,
+ LINK_STATE_CONN_ESTABLISHED,
+};
+
+enum
+{
+ EXCHANGE_NOT_STARTED,
+ EXCHANGE_COMPLETE,
+ EXCHANGE_TIMED_OUT,
+ EXCHANGE_IN_PROGRESS,
+};
+
+enum
+{
+ QUEUE_FULL_NONE,
+ QUEUE_FULL_SEND,
+ QUEUE_FULL_RECV,
+};
+
+enum
+{
+ LAG_NONE,
+ LAG_MASTER,
+ LAG_SLAVE,
+};
+
+struct LinkPlayer
+{
+ u16 version;
+ u16 lp_field_2;
+ u32 trainerId;
+ u8 name[11];
+ u8 gender;
+ u32 linkType;
+ u16 lp_field_18;
+ u16 language;
+};
+
+struct LinkPlayerBlock
+{
+ u8 magic1[16];
+ struct LinkPlayer linkPlayer;
+ u8 magic2[16];
+};
+
+// circular queues
+
+struct SendQueue
+{
+ u16 data[CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct RecvQueue
+{
+ u16 data[MAX_LINK_PLAYERS][CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct Link
+{
+ u8 isMaster; // 0: slave, 8: master
+ u8 state;
+ u8 localId; // local multi-player ID
+ u8 playerCount;
+ u16 tempRecvBuffer[4];
+ bool8 receivedNothing;
+ s8 serialIntrCounter;
+ bool8 handshakeAsMaster;
+ u8 link_field_F;
+
+ // error conditions
+ bool8 hardwareError; // hardware reported an error
+ bool8 badChecksum; // checksum didn't match between devices
+ u8 queueFull; // send or recv queue out of space
+ u8 lag; // connection is lagging
+
+ u16 checksum;
+
+ u8 sendCmdIndex;
+ u8 recvCmdIndex;
+
+ struct SendQueue sendQueue;
+ struct RecvQueue recvQueue;
+};
+
+extern struct Link gLink;
+extern u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS];
+extern u32 gLinkStatus;
+extern u16 gSendCmd[CMD_LENGTH];
+extern u8 gShouldAdvanceLinkState;
+
+void Task_DestroySelf(u8);
+void sub_8007270(u8);
+void OpenLink(void);
+void CloseLink(void);
+u16 LinkMain2(u16 *);
+void sub_8007B14(void);
+bool32 sub_8007B24(void);
+void ClearLinkCallback(void);
+void ClearLinkCallback_2(void);
+u8 GetLinkPlayerCount(void);
+void OpenLinkTimed(void);
+u8 GetLinkPlayerDataExchangeStatusTimed(void);
+bool8 IsLinkPlayerDataExchangeComplete(void);
+u32 GetLinkPlayerTrainerId(u8);
+void ResetLinkPlayers(void);
+void sub_8007E24(void);
+void sub_8007E4C(void);
+u8 GetMultiplayerId(void);
+u8 bitmask_all_link_players_but_self(void);
+bool8 SendBlock(u8, void *, u16);
+bool8 sub_8007E9C(u8);
+bool8 sub_8007ECC(void);
+u8 GetBlockRecievedStatus(void);
+void ResetBlockReceivedFlags(void);
+void ResetBlockReceivedFlag(u8);
+void sub_8007F4C(void);
+void SetLinkDebugValues(u32, u32);
+u8 sub_8008198(void);
+void sub_80081C8(u8);
+u8 sub_800820C(void);
+u8 sub_8008218(void);
+void sub_800826C(void);
+void sub_80082EC(void);
+u8 GetLinkPlayerCount_2(void);
+bool8 IsLinkMaster(void);
+void sub_800832C(void);
+void sub_8008480(void);
+void sub_80084A4(void);
+void CB2_LinkError(void);
+u8 GetSioMultiSI(void);
+bool8 IsLinkConnectionEstablished(void);
+void SetSuppressLinkErrorMessage(bool8);
+bool8 HasLinkErrorOccurred(void);
+void ResetSerial(void);
+u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+void LinkVSync(void);
+void Timer3Intr(void);
+void SerialCB(void);
+
+#endif // GUARD_LINK_H
diff --git a/include/link/.gitignore b/include/link/.gitignore
new file mode 100644
index 000000000..266afbe6e
--- /dev/null
+++ b/include/link/.gitignore
@@ -0,0 +1,2 @@
+digit_tiles.h
+digit_palette.h
diff --git a/include/main.h b/include/main.h
index 2f6671967..dda18889a 100644
--- a/include/main.h
+++ b/include/main.h
@@ -42,6 +42,12 @@ struct Main
u8 oamLoadDisabled:1;
};
+extern u8 gUnknown_3001764;
extern struct Main gMain;
+extern u8 gUnknown_3001BB4;
+extern bool8 gLinkVSyncDisabled;
+
+extern const u8 gGameVersion;
+extern const u8 gGameLanguage;
#endif // GUARD_MAIN_H
diff --git a/include/task.h b/include/task.h
index cb01efbef..a536bcab5 100644
--- a/include/task.h
+++ b/include/task.h
@@ -10,9 +10,11 @@ struct Task
u8 prev;
u8 next;
u8 priority;
- u16 data[16];
+ s16 data[16];
};
+extern struct Task gTasks[];
+
void ResetTasks();
u8 CreateTask(TaskFunc func, u8 priority);
void DestroyTask(u8 taskId);
diff --git a/include/text.h b/include/text.h
index a1de98166..030d51188 100644
--- a/include/text.h
+++ b/include/text.h
@@ -76,5 +76,6 @@ extern const struct WindowConfig gWindowConfig_81E7278;
extern const struct WindowConfig gWindowConfig_81E7294;
u8 GetExtCtrlCodeLength(u8 code);
+void ConvertInternationalString(u8 *s, u8 language);
#endif // GUARD_TEXT_H
diff --git a/iwram_syms.txt b/iwram_syms.txt
index ffca22f9c..1d2b918c7 100644
--- a/iwram_syms.txt
+++ b/iwram_syms.txt
@@ -23,6 +23,8 @@ gLocalTime = 0x3004038;
gUnknown_3004820 = 0x3004820;
+word_3004858 = 0x3004858;
+
gTasks = 0x3004B20;
gMPlayMemAccArea = 0x3007440;
diff --git a/ld_script.txt b/ld_script.txt
index a414567a0..21b1e9a2f 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -12,6 +12,9 @@ SECTIONS {
src/main.o(ewram_data);
src/sprite.o(ewram_data);
src/text.o(ewram_data);
+ src/string_util.o(ewram_data);
+ . += 0x2E8; /* big gap */
+ src/link.o(ewram_data);
}
. = 0x3000000;
@@ -19,18 +22,26 @@ SECTIONS {
iwram (NOLOAD) :
ALIGN(4)
{
+ src/main.o(.bss);
src/sprite.o(.bss);
src/text.o(.bss);
+ src/string_util.o(.bss);
+ src/link.o(.bss);
. = 0xF28;
src/agb_flash.o(.bss);
. = 0xF36;
src/siirtc.o(.bss);
tools/agbcc/lib/libgcc.a:dp-bit.o(.bss);
tools/agbcc/lib/libgcc.a:fp-bit.o(.bss);
+
src/m4a_2.o(.bss.code);
+
src/main.o(iwram_data);
src/sprite.o(iwram_data);
src/text.o(iwram_data);
+ src/string_util.o(iwram_data);
+ src/link.o(iwram_data);
+
. = 0x5FD0;
src/m4a_2.o(iwram_data);
}
@@ -45,7 +56,7 @@ SECTIONS {
src/sprite.o(.text);
src/text.o(.text);
src/string_util.o(.text);
- asm/rom2.o(.text);
+ src/link.o(.text);
src/rtc.o(.text);
asm/rom3.o(.text);
src/play_time.o(.text);
@@ -98,6 +109,7 @@ SECTIONS {
. += 0x8; /* Why the gap? */
src/text.o(.rodata);
src/string_util.o(.rodata);
+ src/link.o(.rodata);
data/data2.o(.rodata);
src/m4a_tables.o(.rodata);
data/sound_data.o(.rodata);
diff --git a/src/link.c b/src/link.c
new file mode 100644
index 000000000..64e33fdfc
--- /dev/null
+++ b/src/link.c
@@ -0,0 +1,1810 @@
+#include "global.h"
+#include "main.h"
+#include "task.h"
+#include "text.h"
+#include "sprite.h"
+#include "songs.h"
+#include "link.h"
+
+#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
+
+struct BlockTransfer
+{
+ u16 pos;
+ u16 size;
+ void *src;
+ bool8 active;
+ u8 multiplayerId;
+};
+
+struct LinkTestBGInfo
+{
+ u32 screenBaseBlock;
+ u32 paletteNum;
+ u32 dummy_8;
+ u32 dummy_C;
+};
+
+extern void gpu_pal_apply(const u16 *, u16, u32);
+extern void sub_8071C4C(const struct WindowConfig *);
+extern u16 Random(void);
+extern void SeedRng(u16);
+extern s32 fade_and_return_progress_probably(void);
+extern void copy_pal_bg_faded_to_pal_ram(void);
+extern void sub_80516C4(u8, u16);
+
+extern u8 unk_2000000[];
+extern u8 unk_2004000[];
+extern u16 gUnknown_020239F8;
+extern u16 word_203855E;
+
+extern u16 word_3004858;
+
+extern u8 gUnknown_0842C34C[];
+
+static void InitLinkTestBG(u8, u8, u8, u8);
+static void InitLinkTestBG_Unused(u8, u8, u8, u8);
+static void LinkTestScreen();
+static void InitLocalLinkPlayer(void);
+static void VBlankCB_LinkTest(void);
+static void InitLink(void);
+static void Task_TriggerHandshake(u8);
+static void TestBlockTransfer(u32, u32, u32);
+static void LinkTestProcessKeyInput(void);
+static void CB2_LinkTest(void);
+static void HandleReceiveRemoteLinkPlayer(u8);
+static void ProcessRecvCmds(u8);
+static void BuildSendCmd(u16);
+static void sub_8007B44(void);
+static void ResetBlockSend(void);
+static bool8 InitBlockSend(void *, u32);
+static void LinkCB_BlockSendBegin(void);
+static void LinkCB_BlockSend(void);
+static void LinkCB_BlockSendEnd(void);
+static void sub_8007E04(void);
+static u32 sub_8007E40(void);
+static void SetBlockReceivedFlag(u8);
+static u16 LinkTestCalcBlockChecksum(void *, u16);
+static void PrintHexDigit(u8, u8, u8);
+static void PrintHex(u32, u8, u8, u8);
+static void LinkCB_RequestPlayerDataExchange(void);
+static void Task_PrintTestData(u8);
+static bool8 sub_8008224(void);
+static u8 GetDummy2(void);
+static void sub_8008350(void);
+static void sub_800837C(void);
+static void sub_80083E0(void);
+static void sub_8008454(void);
+static void sub_80084C8(void);
+static void sub_80084F4(void);
+static void CheckErrorStatus(void);
+static void CB2_PrintErrorMessage(void);
+static u8 IsSioMultiMaster(void);
+static void DisableSerial(void);
+static void EnableSerial(void);
+static void CheckMasterOrSlave(void);
+static void InitTimer(void);
+static void EnqueueSendCmd(u16 *);
+static void DequeueRecvCmds(u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+static void StartTransfer(void);
+static bool8 DoHandshake(void);
+static void DoRecv(void);
+static void DoSend(void);
+static void StopTimer(void);
+static void SendRecvDone(void);
+static void ResetSendBuffer(void);
+static void ResetRecvBuffer(void);
+
+static struct BlockTransfer sBlockSend;
+static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
+static u32 sBlockSendDelayCounter;
+static u32 sDummy1;
+static u8 sDummy2;
+static u32 sPlayerDataExchangeStatus;
+static u32 sErrorLinkStatus;
+static u32 sErrorLastRecvQueueCount;
+static u32 sErrorLastSendQueueCount;
+static u32 sDummy3;
+static u8 sLinkTestLastBlockSendPos;
+static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
+static u8 sNumVBlanksWithoutSerialIntr;
+static bool8 sSendBufferEmpty;
+static u16 sSendNonzeroCheck;
+static u16 sRecvNonzeroCheck;
+static u8 sChecksumAvailable;
+static u8 sHandshakePlayerCount;
+
+COMM_3(u16 word_3002910[MAX_LINK_PLAYERS])
+COMM_2(u32 gLinkDebugValue1)
+COMM_4(struct LinkPlayerBlock localLinkPlayerBlock)
+COMM_2(bool8 gLinkErrorOccurred)
+COMM_2(u32 gFiller_3002960)
+COMM_2(u32 gLinkDebugValue2)
+COMM_2(u32 gFiller_3002968)
+COMM_2(bool8 gLinkPlayerPending[MAX_LINK_PLAYERS])
+COMM_4(struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS])
+COMM_2(bool8 gBlockReceived[MAX_LINK_PLAYERS])
+COMM_2(u32 gFiller_30029E4)
+COMM_2(u16 gLinkHeldKeys)
+COMM_2(u16 gLinkTimeOutCounter)
+COMM_2(u32 gFiller_30029F0)
+COMM_4(struct LinkPlayer localLinkPlayer)
+COMM_4(u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS])
+COMM_2(u32 gLinkStatus)
+COMM_2(bool8 gLinkDummyBool)
+COMM_2(u8 byte_3002A68)
+COMM_4(u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE])
+COMM_2(bool8 u8_array_3002B70[MAX_LINK_PLAYERS])
+COMM_2(u16 gLinkType)
+COMM_2(bool8 u8_array_3002B78[MAX_LINK_PLAYERS])
+COMM_4(u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2])
+COMM_2(bool8 gSuppressLinkErrorMessage)
+COMM_2(u8 gSavedLinkPlayerCount)
+COMM_4(u16 gSendCmd[CMD_LENGTH])
+COMM_2(u8 gSavedMultiplayerId)
+COMM_2(bool8 gReceivedRemoteLinkPlayers)
+COMM_4(struct LinkTestBGInfo gLinkTestBGInfo)
+COMM_2(void (*gLinkCallback)(void))
+COMM_4(struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS])
+COMM_2(u8 gShouldAdvanceLinkState)
+COMM_3(u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS])
+COMM_2(u32 gFiller_3003050)
+COMM_2(u8 gBlockRequestType)
+COMM_2(u32 gFiller_3003058)
+COMM_2(u32 gFiller_300305C)
+COMM_2(u8 gLastSendQueueCount)
+COMM_4(struct Link gLink)
+COMM_2(u8 gLastRecvQueueCount)
+COMM_2(u16 gLinkSavedIme)
+
+EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0};
+EWRAM_DATA bool8 gLinkTestDummyBool = {0};
+EWRAM_DATA u32 gFiller_20238B8 = {0};
+EWRAM_DATA u32 dword_20238BC = {0};
+EWRAM_DATA bool8 gLinkOpen = {0};
+
+#include "link/digit_palette.h"
+#include "link/digit_tiles.h"
+
+static const u8 sDebugMessages[7][12] =
+{
+ _"せつぞく ちゅうです",
+ _"せつぞく できません",
+ _"かくにん ちゅうです",
+ _"かくにん できました",
+ _"かくにん できません",
+ _"かくにん を かくにん",
+ _"かくにん は しっぱい",
+};
+
+static const u8 sColorCodes[] = _"{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}";
+
+static const u32 sBlockRequestLookupTable[5 * 2] =
+{
+ (u32)gBlockSendBuffer, 200,
+ (u32)gBlockSendBuffer, 200,
+ (u32)gBlockSendBuffer, 100,
+ (u32)gBlockSendBuffer, 220,
+ (u32)gBlockSendBuffer, 40,
+};
+
+static const u8 sTestString[] = _"テストな";
+
+ALIGNED(4) static const u8 sMagic[] = "GameFreak inc.";
+
+ALIGNED(4) static const u8 sEmptyString[] = _"";
+
+void Task_DestroySelf(u8 taskId)
+{
+ DestroyTask(taskId);
+}
+
+static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
+{
+ gpu_pal_apply(sLinkTestDigitPalette, 16 * paletteNum, 32);
+ DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220);
+
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+
+ switch (bgNum)
+ {
+ case 1:
+ REG_BG1CNT = 1 | (screenBaseBlock << 8) | (charBaseBlock << 2);
+ break;
+ case 2:
+ REG_BG2CNT = 1 | (screenBaseBlock << 8) | (charBaseBlock << 2);
+ break;
+ case 3:
+ REG_BG3CNT = 1 | (screenBaseBlock << 8) | (charBaseBlock << 2);
+ break;
+ }
+}
+
+static void InitLinkTestBG_Unused(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
+{
+ gpu_pal_apply(sLinkTestDigitPalette, 16 * paletteNum, 32);
+ DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220);
+
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+
+ *gBGControlRegs[bgNum] = (screenBaseBlock << 8) | (charBaseBlock << 2);
+}
+
+static void LinkTestScreen(void)
+{
+ s32 i;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB_LinkTest);
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ sub_8071C4C(&gWindowConfig_81E6CE4);
+ ResetBlockSend();
+ gLinkType = 0x1111;
+ OpenLink();
+ SeedRng(gMain.vblankCounter1);
+
+ for (i = 0; i < 4; i++)
+ {
+ // Very weird code, but nothing else seems to match.
+ // The following would have the same effect:
+ // gSaveBlock2.playerTrainerId[i] = Random();
+ u8 *trainerId = gSaveBlock2.playerTrainerId;
+ s32 r;
+ s32 mask = 0xFF;
+ trainerId[i] = (r = Random()) & mask;
+ }
+
+ InitLinkTestBG(0, 2, 4, 0);
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP;
+ CreateTask(Task_DestroySelf, 0);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ fade_and_return_progress_probably();
+ sDummy3 = 0;
+ InitLocalLinkPlayer();
+ CreateTask(Task_PrintTestData, 0);
+ SetMainCallback2(CB2_LinkTest);
+}
+
+void sub_8007270(u8 a1)
+{
+ localLinkPlayer.lp_field_18 = a1;
+}
+
+static void InitLocalLinkPlayer(void)
+{
+ s32 i;
+
+ localLinkPlayer.trainerId = gSaveBlock2.playerTrainerId[0]
+ | (gSaveBlock2.playerTrainerId[1] << 8)
+ | (gSaveBlock2.playerTrainerId[2] << 16)
+ | (gSaveBlock2.playerTrainerId[3] << 24);
+
+ for (i = 0; i < (s32)sizeof(localLinkPlayer.name); i++)
+ localLinkPlayer.name[i] = gSaveBlock2.playerName[i]; // UB: reads past the end of "playerName" array
+
+ localLinkPlayer.gender = gSaveBlock2.playerGender;
+ localLinkPlayer.linkType = gLinkType;
+ localLinkPlayer.language = gGameLanguage;
+ localLinkPlayer.version = gGameVersion + 0x4000;
+ localLinkPlayer.lp_field_2 = 0;
+}
+
+static void VBlankCB_LinkTest(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ copy_pal_bg_faded_to_pal_ram();
+}
+
+static void InitLink(void)
+{
+ s32 i;
+
+ for (i = 0; i < CMD_LENGTH; i++)
+ gSendCmd[i] = 0xEFFF;
+
+ gLinkOpen = TRUE;
+ EnableSerial();
+}
+
+static void Task_TriggerHandshake(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+
+ if (gTasks[taskId].data[0] == 5)
+ {
+ gShouldAdvanceLinkState = 1;
+ DestroyTask(taskId);
+ }
+}
+
+void OpenLink(void)
+{
+ s32 i;
+
+ ResetSerial();
+ InitLink();
+
+ gLinkCallback = LinkCB_RequestPlayerDataExchange;
+ gLinkVSyncDisabled = FALSE;
+ gLinkErrorOccurred = FALSE;
+ gSuppressLinkErrorMessage = FALSE;
+
+ ResetBlockReceivedFlags();
+
+ sDummy1 = 0;
+ byte_3002A68 = 0;
+ gLinkDummyBool = FALSE;
+ gReceivedRemoteLinkPlayers = FALSE;
+
+ for (i = 0; i < 4; i++)
+ {
+ gLinkPlayerPending[i] = TRUE;
+ u8_array_3002B78[i] = 0;
+ u8_array_3002B70[i] = 0;
+ }
+
+ CreateTask(Task_TriggerHandshake, 2);
+}
+
+void CloseLink(void)
+{
+ gReceivedRemoteLinkPlayers = FALSE;
+ gLinkOpen = FALSE;
+ DisableSerial();
+}
+
+static void TestBlockTransfer(u32 a1, u32 a2, u32 a3)
+{
+ u8 i;
+ u8 val;
+
+ if (sLinkTestLastBlockSendPos != sBlockSend.pos)
+ {
+ PrintHex(sBlockSend.pos, 2, 3, 2);
+ sLinkTestLastBlockSendPos = sBlockSend.pos;
+ }
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos)
+ {
+ PrintHex(sBlockRecv[i].pos, 2, i + 4, 2);
+ sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos;
+ }
+ }
+
+ val = GetBlockRecievedStatus();
+
+ if (val == 0xF)
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if ((val >> i) & 1)
+ {
+ gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(&gBlockRecvBuffer[i], sBlockRecv[i].size);
+ ResetBlockReceivedFlag(i);
+ if (gLinkTestBlockChecksums[i] != 834)
+ {
+ gLinkTestDebugValuesEnabled = FALSE;
+ gLinkTestDummyBool = FALSE;
+ }
+ }
+ }
+ }
+}
+
+static void LinkTestProcessKeyInput(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ gShouldAdvanceLinkState = 1;
+ if (gMain.heldKeys & B_BUTTON)
+ InitBlockSend(unk_2004000, 0x2004);
+ if (gMain.newKeys & L_BUTTON)
+ pal_fade_maybe(-1, 0, 0x10, 0, 2);
+ if (gMain.newKeys & START_BUTTON)
+ SetSuppressLinkErrorMessage(TRUE);
+ if (gMain.newKeys & R_BUTTON)
+ sub_8125D44(1);
+ if (gMain.newKeys & SELECT_BUTTON)
+ sub_800832C();
+ if (gLinkTestDebugValuesEnabled)
+ {
+ u32 vblankCounter1 = gMain.vblankCounter1;
+ u8 val = gLinkVSyncDisabled;
+ if (!gLinkCallback)
+ val = gLinkVSyncDisabled | 0x10;
+ SetLinkDebugValues(vblankCounter1, val);
+ }
+}
+
+static void CB2_LinkTest(void)
+{
+ LinkTestProcessKeyInput();
+ TestBlockTransfer(1, 1, 0);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ fade_and_return_progress_probably();
+}
+
+u16 LinkMain2(u16 *heldKeys)
+{
+ u8 i;
+
+ if (!gLinkOpen)
+ return 0;
+
+ for (i = 0; i < CMD_LENGTH; i++)
+ gSendCmd[i] = 0;
+
+ gLinkHeldKeys = *heldKeys;
+
+ if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED)
+ {
+ ProcessRecvCmds(SIO_MULTI_CNT->id);
+ if (gLinkCallback)
+ gLinkCallback();
+ CheckErrorStatus();
+ }
+
+ return gLinkStatus;
+}
+
+static void HandleReceiveRemoteLinkPlayer(u8 multiplayerId)
+{
+ u32 pendingLinkPlayerCount = 0;
+ s32 i;
+
+ gLinkPlayerPending[multiplayerId] = FALSE;
+
+ for (i = 0; i < GetLinkPlayerCount_2(); i++)
+ pendingLinkPlayerCount += gLinkPlayerPending[i];
+
+ if (pendingLinkPlayerCount == 0 && !gReceivedRemoteLinkPlayers)
+ gReceivedRemoteLinkPlayers = TRUE;
+}
+
+static void ProcessRecvCmds(u8 a1)
+{
+ u16 i;
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ word_3002910[i] = 0;
+ if (!gRecvCmds[0][i])
+ continue;
+ switch (gRecvCmds[0][i])
+ {
+ case 0x2222:
+ InitLocalLinkPlayer();
+ localLinkPlayerBlock.linkPlayer = localLinkPlayer;
+ memcpy(localLinkPlayerBlock.magic1, sMagic, 15);
+ memcpy(localLinkPlayerBlock.magic2, sMagic, 15);
+ InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock));
+ break;
+ case 0x5555:
+ byte_3002A68 = 1;
+ break;
+ case 0x5566:
+ byte_3002A68 = 1;
+ break;
+ case 0xBBBB:
+ {
+ struct BlockTransfer *blockRecv = &sBlockRecv[i];
+ blockRecv->pos = 0;
+ blockRecv->size = gRecvCmds[1][i];
+ blockRecv->multiplayerId = gRecvCmds[2][i];
+ break;
+ }
+ case 0x8888:
+ if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE)
+ {
+ u16 *buffer = (u16 *)unk_2000000;
+ u16 j;
+ for (j = 0; j < CMD_LENGTH - 1; j++)
+ buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i];
+ }
+ else
+ {
+ u16 j;
+ for (j = 0; j < CMD_LENGTH - 1; j++)
+ gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i];
+ }
+
+ sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2;
+
+ if (sBlockRecv[i].pos >= sBlockRecv[i].size)
+ {
+ if (gLinkPlayerPending[i] == TRUE)
+ {
+ struct LinkPlayerBlock *block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i];
+ struct LinkPlayer *linkPlayer = &gLinkPlayers[i];
+ *linkPlayer = block->linkPlayer;
+
+ if (strcmp(block->magic1, sMagic)
+ || strcmp(block->magic2, sMagic))
+ {
+ SetMainCallback2(CB2_LinkError);
+ }
+ else
+ {
+ HandleReceiveRemoteLinkPlayer(i);
+ }
+
+ ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language);
+ }
+ else
+ {
+ SetBlockReceivedFlag(i);
+ }
+ }
+ break;
+ case 0x5FFF:
+ u8_array_3002B78[i] = 1;
+ break;
+ case 0x2FFE:
+ u8_array_3002B70[i] = 1;
+ break;
+ case 0xAAAA:
+ sub_8007E24();
+ break;
+ case 0xAAAB:
+ sub_80516C4(i, gRecvCmds[1][i]);
+ break;
+ case 0xCCCC:
+ {
+ const u32 *addresses;
+ const u32 *sizes;
+ void *data;
+ u16 size;
+
+ addresses = sBlockRequestLookupTable;
+ data = (void *)addresses[gRecvCmds[1][i] * 2];
+
+ sizes = addresses + 1;
+ size = sizes[gRecvCmds[1][i] * 2];
+
+ SendBlock(0, data, size);
+ break;
+ }
+ case 0x4444:
+ word_3002910[i] = gRecvCmds[1][i];
+ break;
+ case 0xCAFE:
+ word_3002910[i] = gRecvCmds[1][i];
+ break;
+ }
+ }
+}
+
+static void BuildSendCmd(u16 code)
+{
+ switch (code)
+ {
+ case 0x2222:
+ gSendCmd[0] = 0x2222;
+ gSendCmd[1] = gLinkType;
+ break;
+ case 0x2FFE:
+ gSendCmd[0] = 0x2FFE;
+ break;
+ case 0x4444:
+ gSendCmd[0] = 0x4444;
+ gSendCmd[1] = gMain.heldKeys;
+ break;
+ case 0x5555:
+ gSendCmd[0] = 0x5555;
+ break;
+ case 0x5566:
+ gSendCmd[0] = 0x5566;
+ break;
+ case 0x6666:
+ gSendCmd[0] = 0x6666;
+ gSendCmd[1] = 0;
+ break;
+ case 0x7777:
+ {
+ u8 i;
+
+ gSendCmd[0] = 0x7777;
+
+ for (i = 0; i < 5; i++)
+ gSendCmd[i + 1] = 0xEE;
+
+ break;
+ }
+ case 0xBBBB:
+ gSendCmd[0] = 0xBBBB;
+ gSendCmd[1] = sBlockSend.size;
+ gSendCmd[2] = sBlockSend.multiplayerId + 128;
+ break;
+ case 0xAAAA:
+ gSendCmd[0] = 0xAAAA;
+ break;
+ case 0xAAAB:
+ gSendCmd[0] = 0xAAAB;
+ gSendCmd[1] = word_203855E;
+ break;
+ case 0xCCCC:
+ gSendCmd[0] = 0xCCCC;
+ gSendCmd[1] = gBlockRequestType;
+ break;
+ case 0x5FFF:
+ gSendCmd[0] = 0x5FFF;
+ break;
+ case 0xCAFE:
+ if (!word_3004858 || gUnknown_3001764)
+ break;
+ gSendCmd[0] = 0xCAFE;
+ gSendCmd[1] = word_3004858;
+ break;
+ }
+}
+
+void sub_8007B14(void)
+{
+ gLinkCallback = sub_8007B44;
+}
+
+bool32 sub_8007B24(void)
+{
+ if (gLinkCallback == sub_8007B44)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_8007B44(void)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ BuildSendCmd(0xCAFE);
+}
+
+void ClearLinkCallback(void)
+{
+ gLinkCallback = NULL;
+}
+
+void ClearLinkCallback_2(void)
+{
+ gLinkCallback = NULL;
+}
+
+u8 GetLinkPlayerCount(void)
+{
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+void OpenLinkTimed(void)
+{
+ sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED;
+ gLinkTimeOutCounter = 0;
+ OpenLink();
+}
+
+u8 GetLinkPlayerDataExchangeStatusTimed(void)
+{
+ s32 i;
+ s32 count = 0;
+ u32 index;
+
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ {
+ if (GetLinkPlayerCount() == 0)
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+
+ i = 0;
+ index = 0;
+
+ while (i < GetLinkPlayerCount())
+ {
+ if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType)
+ ++count;
+ ++index;
+ ++i;
+ }
+
+ if (count == GetLinkPlayerCount())
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ else
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ }
+ else
+ {
+ gLinkTimeOutCounter++;
+ if (gLinkTimeOutCounter > 600)
+ sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT;
+ }
+
+ return sPlayerDataExchangeStatus;
+}
+
+bool8 IsLinkPlayerDataExchangeComplete(void)
+{
+ u8 i;
+ u8 count = 0;
+ u8 isComplete;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType)
+ count++;
+
+ if (count == GetLinkPlayerCount())
+ {
+ isComplete = TRUE;
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ }
+ else
+ {
+ isComplete = FALSE;
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ }
+
+ return isComplete;
+}
+
+u32 GetLinkPlayerTrainerId(u8 multiplayerId)
+{
+ return gLinkPlayers[multiplayerId].trainerId;
+}
+
+void ResetLinkPlayers(void)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ memset(&gLinkPlayers[i], 0, sizeof(struct LinkPlayer));
+}
+
+static void ResetBlockSend(void)
+{
+ sBlockSend.active = FALSE;
+ sBlockSend.pos = 0;
+ sBlockSend.size = 0;
+ sBlockSend.src = NULL;
+}
+
+static bool8 InitBlockSend(void *data, u32 size)
+{
+ if (sBlockSend.active)
+ {
+ return FALSE;
+ }
+ else
+ {
+ sBlockSend.multiplayerId = GetMultiplayerId();
+ sBlockSend.active = TRUE;
+ sBlockSend.size = size;
+ sBlockSend.pos = 0;
+
+ if (size > BLOCK_BUFFER_SIZE)
+ {
+ sBlockSend.src = data;
+ }
+ else
+ {
+ if (data != gBlockSendBuffer)
+ memcpy(gBlockSendBuffer, data, size);
+ sBlockSend.src = gBlockSendBuffer;
+ }
+
+ BuildSendCmd(0xBBBB);
+ gLinkCallback = LinkCB_BlockSendBegin;
+ sBlockSendDelayCounter = 0;
+ return TRUE;
+ }
+}
+
+static void LinkCB_BlockSendBegin(void)
+{
+ sBlockSendDelayCounter++;
+ if (sBlockSendDelayCounter > 2)
+ gLinkCallback = LinkCB_BlockSend;
+}
+
+static void LinkCB_BlockSend(void)
+{
+ s32 i;
+ u8 *buffer = sBlockSend.src;
+
+ gSendCmd[0] = 0x8888;
+
+ for (i = 0; i < CMD_LENGTH - 1; i++)
+ {
+ s32 offset = sBlockSend.pos + 2 * i;
+ gSendCmd[i + 1] = (buffer[offset + 1] << 8) | buffer[offset];
+ }
+
+ sBlockSend.pos += (CMD_LENGTH - 1) * 2;
+
+ if (sBlockSend.size <= sBlockSend.pos)
+ {
+ sBlockSend.active = FALSE;
+ gLinkCallback = LinkCB_BlockSendEnd;
+ }
+}
+
+static void LinkCB_BlockSendEnd(void)
+{
+ gLinkCallback = NULL;
+}
+
+static void sub_8007E04(void)
+{
+ GetMultiplayerId();
+ BuildSendCmd(0x4444);
+ dword_20238BC++;
+}
+
+void sub_8007E24(void)
+{
+ dword_20238BC = 0;
+ gLinkCallback = sub_8007E04;
+}
+
+static u32 sub_8007E40(void)
+{
+ return dword_20238BC;
+}
+
+void sub_8007E4C(void)
+{
+ BuildSendCmd(0xAAAA);
+}
+
+u8 GetMultiplayerId(void)
+{
+ return SIO_MULTI_CNT->id;
+}
+
+u8 bitmask_all_link_players_but_self(void)
+{
+ return ((1 << GetMultiplayerId()) ^ 0xF);
+}
+
+bool8 SendBlock(u8 a1, void *a2, u16 a3)
+{
+ return InitBlockSend(a2, a3);
+}
+
+bool8 sub_8007E9C(u8 a1)
+{
+ if (!gLinkCallback)
+ {
+ gBlockRequestType = a1;
+ BuildSendCmd(0xCCCC);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 sub_8007ECC(void)
+{
+ u8 retVal = FALSE;
+
+ if (!gLinkCallback)
+ retVal = TRUE;
+
+ return retVal;
+}
+
+u8 GetBlockRecievedStatus(void)
+{
+ return (gBlockReceived[3] << 3)
+ | (gBlockReceived[2] << 2)
+ | (gBlockReceived[1] << 1)
+ | gBlockReceived[0];
+}
+
+static void SetBlockReceivedFlag(u8 multiplayerId)
+{
+ gBlockReceived[multiplayerId] = TRUE;
+}
+
+void ResetBlockReceivedFlags(void)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ gBlockReceived[i] = FALSE;
+}
+
+void ResetBlockReceivedFlag(u8 multiplayerId)
+{
+ if (gBlockReceived[multiplayerId])
+ gBlockReceived[multiplayerId] = FALSE;
+}
+
+void sub_8007F4C(void)
+{
+ if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)
+ gShouldAdvanceLinkState = 1;
+}
+
+static u16 LinkTestCalcBlockChecksum(void *data, u16 size)
+{
+ u16 sum = 0;
+ u16 i;
+
+ for (i = 0; i < size / 2; i++)
+ sum += ((u16 *)data)[i];
+
+ return sum;
+}
+
+static void PrintHexDigit(u8 tileNum, u8 x, u8 y)
+{
+ u16 *tilemap = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
+ tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1);
+}
+
+static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
+{
+ u8 buffer[16];
+ s32 i;
+
+ for (i = 0; i < maxDigits; i++)
+ {
+ buffer[i] = num & 0xF;
+ num >>= 4;
+ }
+
+ for (i = maxDigits - 1; i >= 0; i--)
+ {
+ PrintHexDigit(buffer[i], x, y);
+ x++;
+ }
+}
+
+static void LinkCB_RequestPlayerDataExchange(void)
+{
+ // Only one request needs to be sent, so only the master sends it.
+ if (gLinkStatus & LINK_STAT_MASTER)
+ BuildSendCmd(0x2222);
+ gLinkCallback = NULL;
+}
+
+void Task_PrintTestData(u8 taskId)
+{
+ s32 i;
+
+ PrintHex(gShouldAdvanceLinkState, 2, 1, 2);
+ PrintHex(gLinkStatus, 15, 1, 8);
+ PrintHex(gLink.state, 2, 10, 2);
+ PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);
+ PrintHex(GetMultiplayerId(), 15, 12, 2);
+ PrintHex(gLastSendQueueCount, 25, 1, 2);
+ PrintHex(gLastRecvQueueCount, 25, 2, 2);
+ PrintHex(GetBlockRecievedStatus(), 15, 5, 2);
+ PrintHex(gLinkDebugValue1, 2, 12, 8);
+ PrintHex(gLinkDebugValue2, 2, 13, 8);
+ PrintHex(GetSioMultiSI(), 25, 5, 1);
+ PrintHex(IsSioMultiMaster(), 25, 6, 1);
+ PrintHex(IsLinkConnectionEstablished(), 25, 7, 1);
+ PrintHex(HasLinkErrorOccurred(), 25, 8, 1);
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);
+}
+
+void SetLinkDebugValues(u32 value1, u32 value2)
+{
+ gLinkDebugValue1 = value1;
+ gLinkDebugValue2 = value2;
+}
+
+u8 sub_8008198(void)
+{
+ u8 result = 0;
+ s32 i;
+
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ result |= (1 << i);
+
+ return result;
+}
+
+void sub_80081C8(u8 playerCount)
+{
+ s32 i;
+
+ gSavedLinkPlayerCount = playerCount;
+ gSavedMultiplayerId = GetMultiplayerId();
+
+ for (i = 0; i < 4; i++)
+ gSavedLinkPlayers[i] = gLinkPlayers[i];
+}
+
+u8 sub_800820C(void)
+{
+ return gSavedLinkPlayerCount;
+}
+
+u8 sub_8008218(void)
+{
+ return gSavedMultiplayerId;
+}
+
+static bool8 sub_8008224(void)
+{
+ s32 count = 0;
+ s32 i;
+
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
+ count++;
+
+ if (count == gSavedLinkPlayerCount)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_800826C(void)
+{
+ u8 i;
+
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId
+ || StringCompareWithoutExtCtrlCodes(gSavedLinkPlayers[i].name, gLinkPlayers[i].name))
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ }
+ }
+}
+
+void sub_80082EC(void)
+{
+ gSavedLinkPlayerCount = 0;
+ gSavedMultiplayerId = 0;
+}
+
+u8 GetLinkPlayerCount_2(void)
+{
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+bool8 IsLinkMaster(void)
+{
+ return EXTRACT_MASTER(gLinkStatus);
+}
+
+static u8 GetDummy2(void)
+{
+ return sDummy2;
+}
+
+void sub_800832C(void)
+{
+ if (!gLinkCallback)
+ {
+ gLinkCallback = sub_8008350;
+ gLinkDummyBool = FALSE;
+ }
+}
+
+static void sub_8008350(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(0x5FFF);
+ gLinkCallback = sub_800837C;
+ }
+}
+
+static void sub_800837C(void)
+{
+ s32 i;
+ s32 totalCount = GetLinkPlayerCount();
+ s32 count = 0;
+
+ for (i = 0; i < totalCount; i++)
+ if (u8_array_3002B78[i])
+ count++;
+
+ if (count == totalCount)
+ {
+ gUnknown_020239F8 &= 0xFFDF;
+ gLinkVSyncDisabled = TRUE;
+ CloseLink();
+ gLinkCallback = NULL;
+ gLinkDummyBool = TRUE;
+ }
+}
+
+static void sub_80083E0(void)
+{
+ s32 i;
+ s32 totalCount = GetLinkPlayerCount();
+ s32 count = 0;
+
+ for (i = 0; i < totalCount; i++)
+ {
+ if (gLinkPlayers[i].language == 1)
+ count++;
+ else if (u8_array_3002B78[i])
+ count++;
+ }
+
+ if (count == totalCount)
+ {
+ gUnknown_020239F8 &= 0xFFDF;
+ gLinkVSyncDisabled = TRUE;
+ CloseLink();
+ gLinkCallback = 0;
+ gLinkDummyBool = TRUE;
+ }
+}
+
+static void sub_8008454(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(0x5FFF);
+ gLinkCallback = sub_80083E0;
+ }
+}
+
+void sub_8008480(void)
+{
+ if (!gLinkCallback)
+ {
+ gLinkCallback = sub_8008454;
+ gLinkDummyBool = FALSE;
+ }
+}
+
+void sub_80084A4(void)
+{
+ if (!gLinkCallback)
+ gLinkCallback = sub_80084C8;
+ gLinkDummyBool = FALSE;
+}
+
+static void sub_80084C8(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(0x2FFE);
+ gLinkCallback = sub_80084F4;
+ }
+}
+
+static void sub_80084F4(void)
+{
+ u8 totalCount = GetLinkPlayerCount();
+ u8 count = 0;
+
+ while (count < totalCount && u8_array_3002B70[count])
+ count++;
+
+ if (count == totalCount)
+ {
+ u8 i;
+ for (i = 0; i < 4; i++)
+ u8_array_3002B70[i] = 0;
+ gLinkCallback = NULL;
+ }
+}
+
+static void CheckErrorStatus(void)
+{
+ if (gLinkOpen)
+ {
+ if (gLinkStatus & LINK_STAT_ERRORS)
+ {
+ if (!gSuppressLinkErrorMessage)
+ {
+ sErrorLinkStatus = gLinkStatus;
+ sErrorLastRecvQueueCount = gLastRecvQueueCount;
+ sErrorLastSendQueueCount = gLastSendQueueCount;
+ SetMainCallback2(CB2_LinkError);
+ }
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+ }
+}
+
+void CB2_LinkError(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ pal_fade_control_reset_maybe();
+ rboxid_80040B8(0, 0, 2);
+ ResetTasks();
+ SetVBlankCallback(VBlankCB_LinkTest);
+ SetUpWindowConfig(&gWindowConfig_81E7198);
+ sub_8071C4C(&gWindowConfig_81E7198);
+ sub_8071EF4();
+ REG_BLDALPHA = 0;
+ REG_BG0VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_DISPCNT = 320;
+ gUnknown_3001BB4 = 0;
+ CreateTask(Task_DestroySelf, 0);
+ sub_8074D08();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ fade_and_return_progress_probably();
+ SetMainCallback2(CB2_PrintErrorMessage);
+}
+
+static void CB2_PrintErrorMessage(void)
+{
+ u8 array[64]; // unused
+
+ switch (gMain.state)
+ {
+ case 0:
+ sub_80729D8(gUnknown_0842C34C, 20, 56, 1);
+ break;
+ case 30:
+ case 60:
+ audio_play(SE_BOO);
+ break;
+ case 90:
+ audio_play(SE_BOO);
+ break;
+ }
+
+ if (gMain.state != 200)
+ gMain.state++;
+}
+
+u8 GetSioMultiSI(void)
+{
+ return (REG_SIOCNT >> SIO_MULTI_SI_SHIFT) & SIO_MULTI_SI_MASK;
+}
+
+static bool8 IsSioMultiMaster(void)
+{
+ bool8 isMaster = FALSE;
+
+ if ((REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI))
+ isMaster = TRUE;
+
+ return isMaster;
+}
+
+bool8 IsLinkConnectionEstablished(void)
+{
+ return EXTRACT_CONN_ESTABLISHED(gLinkStatus);
+}
+
+void SetSuppressLinkErrorMessage(bool8 value)
+{
+ gSuppressLinkErrorMessage = value;
+}
+
+bool8 HasLinkErrorOccurred(void)
+{
+ return gLinkErrorOccurred;
+}
+
+static void DisableSerial(void)
+{
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_IME = gLinkSavedIme;
+
+ REG_SIOCNT = 0;
+ REG_TM3CNT_H = 0;
+ REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
+
+ CpuFill32(&gLink, 0, sizeof(gLink));
+}
+
+static void EnableSerial(void)
+{
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_IME = gLinkSavedIme;
+
+ REG_RCNT = 0;
+
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_SERIAL;
+ REG_IME = gLinkSavedIme;
+
+ REG_SIOMLT_SEND = 0;
+
+ CpuFill32(&gLink, 0, sizeof(gLink));
+
+ sNumVBlanksWithoutSerialIntr = 0;
+ sSendNonzeroCheck = 0;
+ sRecvNonzeroCheck = 0;
+ sChecksumAvailable = FALSE;
+ sHandshakePlayerCount = 0;
+ gLastSendQueueCount = 0;
+ gLastRecvQueueCount = 0;
+}
+
+void ResetSerial(void)
+{
+ EnableSerial();
+ DisableSerial();
+}
+
+u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS])
+{
+ u32 retVal;
+ u32 retVal2;
+
+ switch (gLink.state)
+ {
+ case LINK_STATE_START0:
+ DisableSerial();
+ gLink.state = LINK_STATE_START1;
+ break;
+ case LINK_STATE_START1:
+ if (*shouldAdvanceLinkState == 1)
+ {
+ EnableSerial();
+ gLink.state = LINK_STATE_HANDSHAKE;
+ }
+ break;
+ case LINK_STATE_HANDSHAKE:
+ switch (*shouldAdvanceLinkState)
+ {
+ case 1:
+ if (gLink.isMaster == 8 && gLink.playerCount > 1)
+ gLink.handshakeAsMaster = TRUE;
+ break;
+ case 2:
+ gLink.state = LINK_STATE_START0;
+ REG_SIOMLT_SEND = 0;
+ break;
+ default:
+ CheckMasterOrSlave();
+ break;
+ }
+ break;
+ case LINK_STATE_INIT_TIMER:
+ InitTimer();
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ case LINK_STATE_CONN_ESTABLISHED:
+ EnqueueSendCmd(sendCmd);
+ DequeueRecvCmds(recvCmds);
+ break;
+ }
+
+ *shouldAdvanceLinkState = 0;
+
+ retVal = gLink.localId;
+ retVal |= (gLink.playerCount << 2);
+
+ if (gLink.isMaster == 8)
+ retVal |= 0x20;
+
+ {
+ u32 receivedNothing = gLink.receivedNothing << 8;
+ u32 link_field_F = gLink.link_field_F << 9;
+ u32 hardwareError = gLink.hardwareError << 12;
+ u32 badChecksum = gLink.badChecksum << 13;
+ u32 queueFull = gLink.queueFull << 14;
+ u32 val;
+
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ {
+ val = 0x40;
+ val |= receivedNothing;
+ val |= retVal;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+ else
+ {
+ val = retVal;
+ val |= receivedNothing;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+
+ retVal = val;
+ }
+
+ if (gLink.lag == LAG_MASTER)
+ retVal |= 0x10000;
+
+ if (gLink.localId > 3)
+ retVal |= 0x20000;
+
+ retVal2 = retVal;
+ if (gLink.lag == LAG_SLAVE)
+ retVal2 |= 0x40000;
+
+ return retVal2;
+}
+
+static void CheckMasterOrSlave(void)
+{
+ u32 terminals = *(u32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI);
+
+ if (terminals == SIO_MULTI_SD && !gLink.localId)
+ gLink.isMaster = 8;
+ else
+ gLink.isMaster = 0;
+}
+
+static void InitTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_L = 65339;
+ REG_TM3CNT_H = TIMER_INTR_ENABLE | TIMER_64CLK;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_TIMER3;
+ REG_IME = gLinkSavedIme;
+ }
+}
+
+static void EnqueueSendCmd(u16 *sendCmd)
+{
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+
+ if (gLink.sendQueue.count < QUEUE_CAPACITY)
+ {
+ u8 i;
+ u8 offset = gLink.sendQueue.pos + gLink.sendQueue.count;
+
+ if (offset >= QUEUE_CAPACITY)
+ offset -= QUEUE_CAPACITY;
+
+ for (i = 0; i < CMD_LENGTH; i++)
+ {
+ sSendNonzeroCheck |= *sendCmd;
+ gLink.sendQueue.data[i][offset] = *sendCmd;
+ *sendCmd = 0;
+ sendCmd++;
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_SEND;
+ }
+
+ if (sSendNonzeroCheck)
+ {
+ gLink.sendQueue.count++;
+ sSendNonzeroCheck = 0;
+ }
+
+ REG_IME = gLinkSavedIme;
+ gLastSendQueueCount = gLink.sendQueue.count;
+}
+
+void DequeueRecvCmds(u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS])
+{
+ u8 i;
+ u8 j;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+
+ if (gLink.recvQueue.count == 0)
+ {
+ for (i = 0; i < CMD_LENGTH; i++)
+ for (j = 0; j < gLink.playerCount; j++)
+ recvCmds[i][j] = 0;
+
+ gLink.receivedNothing = TRUE;
+ }
+ else
+ {
+ for (i = 0; i < CMD_LENGTH; i++)
+ for (j = 0; j < gLink.playerCount; j++)
+ recvCmds[i][j] = gLink.recvQueue.data[j][i][gLink.recvQueue.pos];
+
+ gLink.recvQueue.count--;
+ gLink.recvQueue.pos++;
+
+ if (gLink.recvQueue.pos >= QUEUE_CAPACITY)
+ gLink.recvQueue.pos = 0;
+
+ gLink.receivedNothing = FALSE;
+ }
+
+ REG_IME = gLinkSavedIme;
+}
+
+void LinkVSync(void)
+{
+ if (gLink.isMaster)
+ {
+ switch (gLink.state)
+ {
+ case LINK_STATE_HANDSHAKE:
+ StartTransfer();
+ break;
+ case LINK_STATE_CONN_ESTABLISHED:
+ if (gLink.serialIntrCounter > 8)
+ {
+ if (gLink.lag == LAG_MASTER)
+ return;
+ gLink.serialIntrCounter = 0;
+ }
+ else if (gLink.hardwareError != TRUE)
+ {
+ gLink.lag = LAG_MASTER;
+ return;
+ }
+ StartTransfer();
+ break;
+ }
+ }
+ else if (gLink.state == LINK_STATE_CONN_ESTABLISHED
+ || gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ sNumVBlanksWithoutSerialIntr++;
+
+ if (sNumVBlanksWithoutSerialIntr > 10)
+ {
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ gLink.lag = LAG_SLAVE;
+
+ if (gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ gLink.playerCount = 0;
+ gLink.link_field_F = 0;
+ }
+ }
+ }
+}
+
+void Timer3Intr(void)
+{
+ StopTimer();
+ StartTransfer();
+}
+
+void SerialCB(void)
+{
+ gLink.localId = SIO_MULTI_CNT->id;
+
+ switch (gLink.state)
+ {
+ case LINK_STATE_CONN_ESTABLISHED:
+ gLink.hardwareError = SIO_MULTI_CNT->error;
+ DoRecv();
+ DoSend();
+ SendRecvDone();
+ break;
+ case LINK_STATE_HANDSHAKE:
+ if (DoHandshake())
+ {
+ if (gLink.isMaster)
+ {
+ gLink.state = LINK_STATE_INIT_TIMER;
+ gLink.serialIntrCounter = 8;
+ }
+ else
+ {
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ }
+ }
+ break;
+ }
+
+ gLink.serialIntrCounter++;
+ sNumVBlanksWithoutSerialIntr = 0;
+
+ if (gLink.serialIntrCounter == 8)
+ gLastRecvQueueCount = gLink.recvQueue.count;
+}
+
+static void StartTransfer(void)
+{
+ REG_SIOCNT |= SIO_START;
+}
+
+static bool8 DoHandshake(void)
+{
+ u8 i;
+ u8 playerCount = 0;
+ u16 minRecv = 0xFFFF;
+
+ if (gLink.handshakeAsMaster == TRUE)
+ REG_SIOMLT_SEND = MASTER_HANDSHAKE;
+ else
+ REG_SIOMLT_SEND = SLAVE_HANDSHAKE;
+
+ *(u64 *)&gLink.tempRecvBuffer[0] = REG_SIOMLT_RECV;
+ REG_SIOMLT_RECV = 0;
+
+ gLink.handshakeAsMaster = FALSE;
+
+ for (i = 0; i < 4; i++)
+ {
+ if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE
+ || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE)
+ {
+ playerCount++;
+
+ if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0)
+ minRecv = gLink.tempRecvBuffer[i];
+ }
+ else
+ {
+ if (gLink.tempRecvBuffer[i] != 0xFFFF)
+ playerCount = 0;
+ break;
+ }
+ }
+
+ gLink.playerCount = playerCount;
+
+ // The handshake is successful when:
+ // 1. There are multiple players.
+ // 2. The number of players agrees with the last attempt.
+ // 3. Player no. 0 is identifying as the master.
+ if (gLink.playerCount > 1
+ && gLink.playerCount == sHandshakePlayerCount
+ && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE)
+ return TRUE;
+
+ if (gLink.playerCount > 1)
+ gLink.link_field_F = (minRecv & 3) + 1;
+ else
+ gLink.link_field_F = 0;
+
+ sHandshakePlayerCount = gLink.playerCount;
+
+ return FALSE;
+}
+
+static void DoRecv(void)
+{
+ u16 recvBuffer[4];
+ u8 i;
+
+ *(u64 *)&recvBuffer[0] = REG_SIOMLT_RECV;
+
+ if (gLink.sendCmdIndex == 0)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ if (gLink.checksum != recvBuffer[i] && sChecksumAvailable)
+ gLink.badChecksum = TRUE;
+
+ gLink.checksum = 0;
+ sChecksumAvailable = TRUE;
+ }
+ else
+ {
+ u8 index = gLink.recvQueue.pos + gLink.recvQueue.count;
+
+ if (index >= QUEUE_CAPACITY)
+ index -= QUEUE_CAPACITY;
+
+ if (gLink.recvQueue.count < QUEUE_CAPACITY)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ gLink.checksum += recvBuffer[i];
+ sRecvNonzeroCheck |= recvBuffer[i];
+ gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recvBuffer[i];
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_RECV;
+ }
+
+ gLink.recvCmdIndex++;
+
+ if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck)
+ {
+ gLink.recvQueue.count++;
+ sRecvNonzeroCheck = 0;
+ }
+ }
+}
+
+static void DoSend(void)
+{
+ if (gLink.sendCmdIndex == CMD_LENGTH)
+ {
+ REG_SIOMLT_SEND = gLink.checksum;
+
+ if (!sSendBufferEmpty)
+ {
+ gLink.sendQueue.count--;
+ gLink.sendQueue.pos++;
+
+ if (gLink.sendQueue.pos >= QUEUE_CAPACITY)
+ gLink.sendQueue.pos = 0;
+ }
+ else
+ {
+ sSendBufferEmpty = FALSE;
+ }
+ }
+ else
+ {
+ if (!sSendBufferEmpty && gLink.sendQueue.count == 0)
+ sSendBufferEmpty = TRUE;
+
+ if (sSendBufferEmpty)
+ REG_SIOMLT_SEND = 0;
+ else
+ REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos];
+
+ gLink.sendCmdIndex++;
+ }
+}
+
+static void StopTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_H &= ~TIMER_ENABLE;
+ REG_TM3CNT_L = 65339;
+ }
+}
+
+static void SendRecvDone(void)
+{
+ if (gLink.recvCmdIndex == CMD_LENGTH)
+ {
+ gLink.sendCmdIndex = 0;
+ gLink.recvCmdIndex = 0;
+ }
+ else if (gLink.isMaster)
+ {
+ REG_TM3CNT_H |= TIMER_ENABLE;
+ }
+}
+
+static void ResetSendBuffer(void)
+{
+ u8 i;
+ u8 j;
+
+ gLink.sendQueue.count = 0;
+ gLink.sendQueue.pos = 0;
+
+ for (i = 0; i < CMD_LENGTH; i++)
+ for (j = 0; j < QUEUE_CAPACITY; j++)
+ gLink.sendQueue.data[i][j] = 0xEFFF;
+}
+
+static void ResetRecvBuffer(void)
+{
+ u8 i;
+ u8 j;
+ u8 k;
+
+ gLink.recvQueue.count = 0;
+ gLink.recvQueue.pos = 0;
+
+ for (i = 0; i < 4; i++)
+ for (j = 0; j < CMD_LENGTH; j++)
+ for (k = 0; k < QUEUE_CAPACITY; k++)
+ gLink.recvQueue.data[i][j][k] = 0xEFFF;
+}
diff --git a/src/main.c b/src/main.c
index 0c5055e60..ca04f14c5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,15 +2,11 @@
#include "gba/m4a_internal.h"
#include "gba/flash_internal.h"
#include "siirtc.h"
-#include "rtc.h"
#include "main.h"
+#include "rtc.h"
+#include "link.h"
extern struct SoundInfo gSoundInfo;
-extern u16 gUnknown_3002A20;
-extern u32 gUnknown_3002A60;
-extern u16 gUnknown_3002F90;
-extern u8 gUnknown_3003040;
-extern u8 gUnknown_30033A9[];
extern u32 gUnknown_3004820;
extern u32 IntrMain[];
@@ -53,20 +49,17 @@ COMM_4(struct Main gMain)
COMM_2(u16 gKeyRepeatContinueDelay)
COMM_2(u8 gUnknown_3001BB4)
COMM_4(IntrFunc gIntrTable[INTR_COUNT])
-COMM_2(u8 gUnknown_3001BF8)
+COMM_2(bool8 gLinkVSyncDisabled)
COMM_4(u32 IntrMain_Buffer[0x200])
COMM_2(u8 gPcmDmaCounter)
EWRAM_DATA void (*gFlashTimerIntrFunc)(void) = NULL;
-extern void sub_8008BEC(void);
extern void sub_800C35C(void);
extern u16 Random(void);
extern void SeedRng(u16);
extern void remove_some_task(void);
extern void c2_copyright_1();
-extern u32 sub_8008848(u8 *, u16 *, u16 *);
-extern void sub_80075F0(u16 *);
extern u32 sub_80558AC(void);
extern u32 sub_8055910(void);
extern u32 sub_8055940(void);
@@ -74,7 +67,7 @@ extern void sound_something(void);
extern void CheckForFlashMemory(void);
extern void sound_sources_off(void);
-void CallCallbacksWrapper(void);
+void UpdateLinkAndCallCallbacks(void);
void InitMainCallbacks(void);
void CallCallbacks(void);
void SetMainCallback2(MainCallback callback);
@@ -120,24 +113,24 @@ void AgbMain()
&& (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT)
DoSoftReset();
- if (gUnknown_30033A9[0] > 1 && sub_8055910() == 1)
+ if (gLink.sendQueue.count > 1 && sub_8055910() == 1)
{
gUnknown_3001764 = 1;
- CallCallbacksWrapper();
+ UpdateLinkAndCallCallbacks();
gUnknown_3001764 = 0;
}
else
{
gUnknown_3001764 = 0;
- CallCallbacksWrapper();
+ UpdateLinkAndCallCallbacks();
- if (gUnknown_30033A9[0xC84] > 1)
+ if (gLink.recvQueue.count > 1)
{
if (sub_80558AC() == 1)
{
gMain.newKeys = 0;
gUnknown_3001764 = 1;
- CallCallbacksWrapper();
+ UpdateLinkAndCallCallbacks();
gUnknown_3001764 = 0;
}
}
@@ -149,12 +142,11 @@ void AgbMain()
}
}
-// The conditions seem to be related to serial communication.
-void CallCallbacksWrapper(void)
+void UpdateLinkAndCallCallbacks(void)
{
- gUnknown_3002A60 = sub_8008848(&gUnknown_3003040, &gUnknown_3002F90, &gUnknown_3002A20);
- sub_80075F0(&gMain.heldKeys);
- if (!(gUnknown_3002A60 & 0x100) || sub_8055940() != 1)
+ gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds);
+ LinkMain2(&gMain.heldKeys);
+ if (!(gLinkStatus & LINK_STAT_RECEIVED_NOTHING) || sub_8055940() != 1)
CallCallbacks();
}
@@ -289,8 +281,8 @@ void VBlankIntr(void)
{
u16 savedIme;
- if (gUnknown_3001BF8 == 0)
- sub_8008BEC();
+ if (!gLinkVSyncDisabled)
+ LinkVSync();
savedIme = REG_IME;
REG_IME = 0;
diff --git a/src/string_util.c b/src/string_util.c
index 43195a219..514e7031f 100644
--- a/src/string_util.c
+++ b/src/string_util.c
@@ -19,11 +19,14 @@ static u8 *ExpandPlaceholder_GoodLeader(void);
static u8 *ExpandPlaceholder_EvilLegendary(void);
static u8 *ExpandPlaceholder_GoodLegendary(void);
+COMM_4(u8 gUnknownStringVar[16])
+
const u8 gEmptyString_81E72B0[] = _"";
const u8 gRightPointingTriangleString[] = _"▶";
-const u8 sDigits[] = @"0123456789ABCDEF";
-const s32 sPowersOfTen[] =
+static const u8 sDigits[] = @"0123456789ABCDEF";
+
+static const s32 sPowersOfTen[] =
{
1,
10,
@@ -37,12 +40,12 @@ const s32 sPowersOfTen[] =
1000000000,
};
-const u8 sSetBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
-const u8 sGotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
+static const u8 sSetBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
+static const u8 sGotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
typedef u8 *(*ExpandPlaceholderFunc)(void);
-const ExpandPlaceholderFunc sExpandPlaceholderFuncs[] =
+static const ExpandPlaceholderFunc sExpandPlaceholderFuncs[] =
{
ExpandPlaceholder_UnknownStringVar,
ExpandPlaceholder_PlayerName,
@@ -74,8 +77,6 @@ extern u8 gExpandedPlaceholder_Groudon[];
extern u8 gExpandedPlaceholder_Brendan[];
extern u8 gExpandedPlaceholder_May[];
-extern u8 gUnknownStringVar[];
-
u8 *StringCopy10(u8 *dest, u8 *src)
{
u8 i;
diff --git a/src/text.c b/src/text.c
index 497f50dbb..c6455f1f0 100644
--- a/src/text.c
+++ b/src/text.c
@@ -3720,9 +3720,9 @@ u8 GetStringWidthGivenWindowConfig(struct WindowConfig *winConfig, u8 *s)
return GetStringWidth(&sTempWindow, s);
}
-void SetStringCharset(u8 *s, u8 charset)
+void ConvertInternationalString(u8 *s, u8 language)
{
- if (charset == CHARSET_JAPANESE)
+ if (language == CHARSET_JAPANESE)
{
u8 i;
u8 length;