From 7d555d133c206a49e7d1ec25d714349c203940f3 Mon Sep 17 00:00:00 2001
From: Eebit <eight_bit_hero@yahoo.ca>
Date: Sun, 23 Jun 2024 22:55:14 -0400
Subject: [PATCH 1/3] (sio_uiutils) Decompile

---
 asm/code_sio_8048260.s | 2048 ----------------------------------------
 include/sio.h          |   10 +-
 ldscript.txt           |    1 +
 src/sio_menu.c         |    4 +
 src/sio_teamlist.c     |    3 +
 src/sio_uiutils.c      | 1039 ++++++++++++++++++++
 6 files changed, 1052 insertions(+), 2053 deletions(-)
 create mode 100644 src/sio_uiutils.c

diff --git a/asm/code_sio_8048260.s b/asm/code_sio_8048260.s
index d24a281f..4dbc5536 100644
--- a/asm/code_sio_8048260.s
+++ b/asm/code_sio_8048260.s
@@ -2,2054 +2,6 @@
 
 	.SYNTAX UNIFIED
 
-	THUMB_FUNC_START InitSioBG
-InitSioBG: @ 0x0804C33C
-	push {lr}
-	sub sp, #0x18
-	ldr r1, _0804C394  @ SioDefaultBgConfig
-	mov r0, sp
-	movs r2, #0x18
-	bl memcpy
-	mov r0, sp
-	bl SetupBackgrounds
-	ldr r3, _0804C398  @ gLCDControlBuffer
-	ldrb r2, [r3, #0xc]
-	movs r1, #4
-	negs r1, r1
-	adds r0, r1, #0
-	ands r0, r2
-	strb r0, [r3, #0xc]
-	ldrb r2, [r3, #0x10]
-	adds r0, r1, #0
-	ands r0, r2
-	movs r2, #1
-	orrs r0, r2
-	strb r0, [r3, #0x10]
-	ldrb r0, [r3, #0x14]
-	ands r1, r0
-	movs r0, #2
-	orrs r1, r0
-	strb r1, [r3, #0x14]
-	ldrb r0, [r3, #0x18]
-	movs r1, #3
-	orrs r0, r1
-	strb r0, [r3, #0x18]
-	bl ReadGameSaveCoreGfx
-	ldr r0, _0804C39C  @ Pal_LinkArenaRankIcons
-	movs r1, #0xc0
-	lsls r1, r1, #2
-	movs r2, #0x40
-	bl CopyToPaletteBuffer
-	add sp, #0x18
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C394: .4byte SioDefaultBgConfig
-_0804C398: .4byte gLCDControlBuffer
-_0804C39C: .4byte Pal_LinkArenaRankIcons
-
-	THUMB_FUNC_END InitSioBG
-
-	THUMB_FUNC_START sub_804C3A0
-sub_804C3A0: @ 0x0804C3A0
-	bx lr
-
-	THUMB_FUNC_END sub_804C3A0
-
-	THUMB_FUNC_START sub_804C3A4
-sub_804C3A4: @ 0x0804C3A4
-	bx lr
-
-	THUMB_FUNC_END sub_804C3A4
-
-	THUMB_FUNC_START nullsub_13
-nullsub_13: @ 0x0804C3A8
-	bx lr
-
-	THUMB_FUNC_END nullsub_13
-
-	THUMB_FUNC_START sub_804C3AC
-sub_804C3AC: @ 0x0804C3AC
-	push {r4, r5, r6, r7, lr}
-	mov r7, r8
-	push {r7}
-	adds r6, r0, #0
-	adds r5, r1, #0
-	lsls r2, r2, #5
-	mov r8, r2
-	cmp r3, #0
-	ble _0804C3E2
-	movs r7, #0x80
-	lsls r7, r7, #3
-	adds r4, r3, #0
-_0804C3C4:
-	mov r2, r8
-	cmp r2, #0
-	bge _0804C3CC
-	adds r2, #3
-_0804C3CC:
-	lsls r2, r2, #9
-	lsrs r2, r2, #0xb
-	adds r0, r6, #0
-	adds r1, r5, #0
-	bl CpuFastSet
-	adds r6, r6, r7
-	adds r5, r5, r7
-	subs r4, #1
-	cmp r4, #0
-	bne _0804C3C4
-_0804C3E2:
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804C3AC
-
-	THUMB_FUNC_START sub_804C3EC
-sub_804C3EC: @ 0x0804C3EC
-	push {r4, r5, r6, lr}
-	mov r6, r8
-	push {r6}
-	mov r8, r0
-	ldr r5, [r0, #0x58]
-	adds r0, r5, #0
-	movs r1, #3
-	bl __modsi3
-	lsls r4, r0, #2
-	adds r4, r4, r0
-	lsls r4, r4, #6
-	adds r0, r5, #0
-	movs r1, #3
-	bl __divsi3
-	adds r5, r0, #0
-	lsls r5, r5, #0xb
-	ldr r0, _0804C464  @ gUnknown_085B0DE8
-	mov r2, r8
-	ldr r1, [r2, #0x5c]
-	movs r3, #0xc0
-	lsls r3, r3, #0x13
-	adds r1, r1, r3
-	bl Decompress
-	ldr r0, _0804C468  @ gUnknown_085AAE0C
-	ldr r6, _0804C46C  @ gGenericBuffer
-	adds r1, r6, #0
-	bl Decompress
-	adds r4, r4, r5
-	adds r4, r4, r6
-	ldr r1, _0804C470  @ 0x06014000
-	adds r0, r4, #0
-	movs r2, #0xa
-	movs r3, #2
-	bl sub_804C3AC
-	ldr r0, _0804C474  @ gBG2TilemapBuffer
-	ldr r1, _0804C478  @ gUnknown_085B0F2C
-	mov r4, r8
-	ldr r2, [r4, #0x5c]
-	lsls r2, r2, #0xf
-	lsrs r2, r2, #0x14
-	movs r4, #0x80
-	lsls r4, r4, #5
-	adds r3, r4, #0
-	orrs r2, r3
-	bl CallARM_FillTileRect
-	movs r0, #4
-	bl BG_EnableSyncByMask
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C464: .4byte gUnknown_085B0DE8
-_0804C468: .4byte gUnknown_085AAE0C
-_0804C46C: .4byte gGenericBuffer
-_0804C470: .4byte 0x06014000
-_0804C474: .4byte gBG2TilemapBuffer
-_0804C478: .4byte gUnknown_085B0F2C
-
-	THUMB_FUNC_END sub_804C3EC
-
-	THUMB_FUNC_START sub_804C47C
-sub_804C47C: @ 0x0804C47C
-	push {lr}
-	sub sp, #4
-	ldr r3, _0804C498  @ gUnknown_085AA96C
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0x14
-	movs r2, #8
-	bl PutSpriteExt
-	add sp, #4
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C498: .4byte gUnknown_085AA96C
-
-	THUMB_FUNC_END sub_804C47C
-
-	THUMB_FUNC_START NewProc085AA980
-NewProc085AA980: @ 0x0804C49C
-	push {r4, r5, r6, lr}
-	mov r6, r8
-	push {r6}
-	adds r6, r0, #0
-	mov r8, r1
-	adds r5, r2, #0
-	ldr r4, _0804C4F4  @ ProcScr_085AA980
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r6, #0
-	bl Proc_Start
-	adds r6, r0, #0
-	mov r0, r8
-	str r0, [r6, #0x58]
-	str r5, [r6, #0x5c]
-	cmp r5, #0
-	bne _0804C4CA
-	movs r0, #0xb8
-	lsls r0, r0, #7
-	str r0, [r6, #0x5c]
-_0804C4CA:
-	ldr r4, [r6, #0x58]
-	adds r0, r4, #0
-	movs r1, #3
-	bl __modsi3
-	lsls r1, r0, #2
-	adds r1, r1, r0
-	lsls r1, r1, #6
-	str r1, [r6, #0x2c]
-	adds r0, r4, #0
-	movs r1, #3
-	bl __divsi3
-	lsls r0, r0, #0xb
-	str r0, [r6, #0x30]
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C4F4: .4byte ProcScr_085AA980
-
-	THUMB_FUNC_END NewProc085AA980
-
-	THUMB_FUNC_START sub_804C4F8
-sub_804C4F8: @ 0x0804C4F8
-	push {lr}
-	ldr r0, _0804C504  @ ProcScr_085AA980
-	bl Proc_EndEach
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C504: .4byte ProcScr_085AA980
-
-	THUMB_FUNC_END sub_804C4F8
-
-	THUMB_FUNC_START sub_804C508
-sub_804C508: @ 0x0804C508
-	push {r4, lr}
-	sub sp, #4
-	movs r0, #1
-	movs r1, #0x10
-	movs r2, #4
-	movs r3, #0
-	bl SetBlendConfig
-	movs r4, #0
-	str r4, [sp]
-	movs r0, #0
-	movs r1, #0
-	movs r2, #1
-	movs r3, #0
-	bl SetBlendTargetA
-	str r4, [sp]
-	movs r0, #0
-	movs r1, #0
-	movs r2, #0
-	movs r3, #1
-	bl SetBlendTargetB
-	ldr r2, _0804C554  @ gLCDControlBuffer
-	ldrb r1, [r2, #1]
-	movs r0, #0x21
-	negs r0, r0
-	ands r0, r1
-	movs r1, #0x41
-	negs r1, r1
-	ands r0, r1
-	movs r1, #0x7f
-	ands r0, r1
-	strb r0, [r2, #1]
-	add sp, #4
-	pop {r4}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C554: .4byte gLCDControlBuffer
-
-	THUMB_FUNC_END sub_804C508
-
-	THUMB_FUNC_START sub_804C558
-sub_804C558: @ 0x0804C558
-	push {r4, lr}
-	sub sp, #4
-	movs r0, #1
-	movs r1, #0x10
-	movs r2, #4
-	movs r3, #0
-	bl SetBlendConfig
-	movs r4, #0
-	str r4, [sp]
-	movs r0, #0
-	movs r1, #0
-	movs r2, #1
-	movs r3, #0
-	bl SetBlendTargetA
-	str r4, [sp]
-	movs r0, #0
-	movs r1, #0
-	movs r2, #0
-	movs r3, #1
-	bl SetBlendTargetB
-	add sp, #4
-	pop {r4}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804C558
-
-	THUMB_FUNC_START sub_804C590
-sub_804C590: @ 0x0804C590
-	push {lr}
-	movs r0, #0
-	movs r1, #0
-	movs r2, #0
-	movs r3, #0
-	bl SetBlendConfig
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804C590
-
-	THUMB_FUNC_START sub_804C5A4
-sub_804C5A4: @ 0x0804C5A4
-	push {r4, lr}
-	sub sp, #0x20
-	lsls r0, r0, #0x18
-	lsrs r4, r0, #0x18
-	ldr r1, _0804C5E8  @ gUnknown_080DA0DA
-	mov r0, sp
-	movs r2, #0x20
-	bl memcpy
-	ldr r0, _0804C5EC  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804C5DE
-	mov r1, sp
-	adds r0, r1, r4
-	ldrb r1, [r0]
-	adds r1, #0x10
-	ldr r3, _0804C5F0  @ gPaletteBuffer
-	lsls r0, r1, #0xa
-	lsls r2, r1, #5
-	adds r0, r0, r2
-	adds r0, r0, r1
-	ldr r1, _0804C5F4  @ 0x00000262
-	adds r3, r3, r1
-	strh r0, [r3]
-	bl EnablePaletteSync
-_0804C5DE:
-	add sp, #0x20
-	pop {r4}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C5E8: .4byte gUnknown_080DA0DA
-_0804C5EC: .4byte gUnk_Sio_0203DDDC
-_0804C5F0: .4byte gPaletteBuffer
-_0804C5F4: .4byte 0x00000262
-
-	THUMB_FUNC_END sub_804C5A4
-
-	THUMB_FUNC_START sub_804C5F8
-sub_804C5F8: @ 0x0804C5F8
-	push {r4, r5, r6, r7, lr}
-	mov r7, r8
-	push {r7}
-	sub sp, #4
-	adds r7, r0, #0
-	ldr r0, _0804C73C  @ 0x000082C8
-	mov r8, r0
-	movs r2, #0x2a
-	ldrsh r1, [r7, r2]
-	movs r3, #0x2c
-	ldrsh r2, [r7, r3]
-	ldr r3, _0804C740  @ gUnknown_085AA9A0
-	adds r0, r7, #0
-	adds r0, #0x2f
-	ldrb r0, [r0]
-	lsls r0, r0, #2
-	adds r0, r0, r3
-	ldr r3, [r0]
-	ldr r4, _0804C744  @ gUnknown_080DA09C
-	adds r5, r7, #0
-	adds r5, #0x2e
-	ldrb r0, [r5]
-	lsls r0, r0, #1
-	adds r0, r0, r4
-	ldrh r0, [r0]
-	str r0, [sp]
-	movs r0, #4
-	bl PutSprite
-	ldrb r0, [r5]
-	cmp r0, #2
-	bne _0804C642
-	adds r0, r7, #0
-	adds r0, #0x30
-	ldrb r0, [r0]
-	bl sub_804C5A4
-_0804C642:
-	adds r2, r7, #0
-	adds r2, #0x30
-	ldrb r0, [r2]
-	adds r0, #1
-	movs r1, #0x1f
-	ands r0, r1
-	strb r0, [r2]
-	ldrh r1, [r7, #0x2e]
-	movs r0, #0x81
-	lsls r0, r0, #1
-	cmp r1, r0
-	bne _0804C72E
-	ldrh r1, [r7, #0x3a]
-	ldrh r2, [r7, #0x36]
-	adds r0, r1, r2
-	strh r0, [r7, #0x36]
-	ldrh r2, [r7, #0x3c]
-	ldrh r3, [r7, #0x38]
-	adds r0, r2, r3
-	strh r0, [r7, #0x38]
-	lsls r0, r1, #0x10
-	asrs r0, r0, #0x10
-	cmp r0, #4
-	ble _0804C676
-	subs r0, r1, #1
-	strh r0, [r7, #0x3a]
-_0804C676:
-	lsls r0, r2, #0x10
-	asrs r0, r0, #0x10
-	cmp r0, #4
-	ble _0804C682
-	subs r0, r2, #1
-	strh r0, [r7, #0x3c]
-_0804C682:
-	bl GetGameClock
-	movs r1, #3
-	ands r1, r0
-	cmp r1, #0
-	bne _0804C6AA
-	ldrh r1, [r7, #0x32]
-	movs r2, #0x32
-	ldrsh r0, [r7, r2]
-	cmp r0, #0
-	bge _0804C69C
-	adds r0, r1, #1
-	strh r0, [r7, #0x32]
-_0804C69C:
-	ldrh r1, [r7, #0x34]
-	movs r3, #0x34
-	ldrsh r0, [r7, r3]
-	cmp r0, #0x34
-	ble _0804C6AA
-	subs r0, r1, #1
-	strh r0, [r7, #0x34]
-_0804C6AA:
-	movs r0, #0x2a
-	ldrsh r5, [r7, r0]
-	movs r1, #0x32
-	ldrsh r0, [r7, r1]
-	adds r0, #0x4b
-	adds r5, r5, r0
-	movs r2, #0x2c
-	ldrsh r4, [r7, r2]
-	adds r4, #8
-	ldr r6, _0804C748  @ gObject_8x16
-	ldrh r0, [r7, #0x36]
-	lsrs r0, r0, #5
-	movs r1, #6
-	bl __umodsi3
-	lsls r0, r0, #0x10
-	lsrs r0, r0, #0x10
-	add r0, r8
-	str r0, [sp]
-	movs r0, #0
-	adds r1, r5, #0
-	adds r2, r4, #0
-	adds r3, r6, #0
-	bl PutSprite
-	movs r3, #0x2a
-	ldrsh r5, [r7, r3]
-	movs r1, #0x34
-	ldrsh r0, [r7, r1]
-	adds r0, #0x49
-	adds r5, r5, r0
-	movs r2, #0x2c
-	ldrsh r4, [r7, r2]
-	adds r4, #8
-	ldr r6, _0804C74C  @ gObject_8x16_HFlipped
-	ldrh r0, [r7, #0x38]
-	lsrs r0, r0, #5
-	movs r1, #6
-	bl __umodsi3
-	lsls r0, r0, #0x10
-	lsrs r0, r0, #0x10
-	add r0, r8
-	str r0, [sp]
-	movs r0, #0
-	adds r1, r5, #0
-	adds r2, r4, #0
-	adds r3, r6, #0
-	bl PutSprite
-	movs r3, #0x2a
-	ldrsh r1, [r7, r3]
-	adds r1, #0x50
-	movs r0, #0x2c
-	ldrsh r2, [r7, r0]
-	adds r2, #9
-	ldr r3, _0804C750  @ gUnknown_085AA9B4
-	ldr r0, _0804C754  @ gLinkArenaSt
-	ldrb r0, [r0, #5]
-	lsls r0, r0, #2
-	adds r0, r0, r3
-	ldr r3, [r0]
-	movs r0, #0
-	str r0, [sp]
-	bl PutSpriteExt
-_0804C72E:
-	add sp, #4
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C73C: .4byte 0x000082C8
-_0804C740: .4byte gUnknown_085AA9A0
-_0804C744: .4byte gUnknown_080DA09C
-_0804C748: .4byte gObject_8x16
-_0804C74C: .4byte gObject_8x16_HFlipped
-_0804C750: .4byte gUnknown_085AA9B4
-_0804C754: .4byte gLinkArenaSt
-
-	THUMB_FUNC_END sub_804C5F8
-
-	THUMB_FUNC_START sub_804C758
-sub_804C758: @ 0x0804C758
-	push {r4, r5, r6, lr}
-	mov r6, r8
-	push {r6}
-	sub sp, #4
-	mov r8, r0
-	adds r4, r1, #0
-	adds r5, r2, #0
-	adds r2, r3, #0
-	ldr r6, [sp, #0x18]
-	lsls r4, r4, #0x18
-	lsrs r4, r4, #0x18
-	lsls r5, r5, #0x18
-	lsrs r5, r5, #0x18
-	lsls r2, r2, #0x18
-	lsrs r2, r2, #0x18
-	lsls r6, r6, #0x18
-	lsrs r6, r6, #0x18
-	ldr r0, _0804C7C4  @ gUnknown_085AA9C0
-	mov r1, r8
-	str r2, [sp]
-	bl Proc_Start
-	mov r8, r0
-	movs r3, #0
-	movs r1, #0
-	strh r4, [r0, #0x2a]
-	strh r5, [r0, #0x2c]
-	adds r0, #0x2e
-	strb r6, [r0]
-	adds r0, #1
-	ldr r2, [sp]
-	strb r2, [r0]
-	mov r0, r8
-	strh r1, [r0, #0x32]
-	movs r0, #0x34
-	mov r2, r8
-	strh r0, [r2, #0x34]
-	strh r1, [r2, #0x38]
-	strh r1, [r2, #0x36]
-	movs r0, #4
-	strh r0, [r2, #0x3c]
-	strh r0, [r2, #0x3a]
-	mov r0, r8
-	adds r0, #0x3e
-	strb r3, [r0]
-	subs r0, #0xe
-	strb r3, [r0]
-	mov r0, r8
-	add sp, #4
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6}
-	pop {r1}
-	bx r1
-	.align 2, 0
-_0804C7C4: .4byte gUnknown_085AA9C0
-
-	THUMB_FUNC_END sub_804C758
-
-	THUMB_FUNC_START sub_804C7C8
-sub_804C7C8: @ 0x0804C7C8
-	push {r4, lr}
-	ldr r4, [sp, #8]
-	strh r1, [r0, #0x32]
-	strh r2, [r0, #0x34]
-	strh r3, [r0, #0x3a]
-	strh r4, [r0, #0x3c]
-	pop {r4}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804C7C8
-
-	THUMB_FUNC_START sub_804C7DC
-sub_804C7DC: @ 0x0804C7DC
-	strh r1, [r0, #0x2a]
-	strh r2, [r0, #0x2c]
-	bx lr
-
-	THUMB_FUNC_END sub_804C7DC
-
-	THUMB_FUNC_START sub_804C7E4
-sub_804C7E4: @ 0x0804C7E4
-	push {r4, lr}
-	sub sp, #0x20
-	ldr r4, _0804C82C  @ gUnknown_085ADDE8
-	ldr r1, _0804C830  @ gUnknown_080DA102
-	mov r0, sp
-	movs r2, #0x20
-	bl memcpy
-	ldr r0, _0804C834  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804C824
-	bl GetGameClock
-	movs r1, #0x3f
-	ands r1, r0
-	asrs r1, r1, #1
-	mov r2, sp
-	adds r0, r2, r1
-	ldrb r0, [r0]
-	ldr r1, _0804C838  @ gPaletteBuffer
-	lsls r0, r0, #1
-	adds r0, r0, r4
-	ldrh r0, [r0]
-	movs r2, #0xc7
-	lsls r2, r2, #2
-	adds r1, r1, r2
-	strh r0, [r1]
-	bl EnablePaletteSync
-_0804C824:
-	add sp, #0x20
-	pop {r4}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C82C: .4byte gUnknown_085ADDE8
-_0804C830: .4byte gUnknown_080DA102
-_0804C834: .4byte gUnk_Sio_0203DDDC
-_0804C838: .4byte gPaletteBuffer
-
-	THUMB_FUNC_END sub_804C7E4
-
-	THUMB_FUNC_START sub_804C83C
-sub_804C83C: @ 0x0804C83C
-	push {r4, lr}
-	sub sp, #0x20
-	ldr r4, _0804C884  @ gUnknown_085ADE48
-	ldr r1, _0804C888  @ gUnknown_080DA0DA
-	mov r0, sp
-	movs r2, #0x20
-	bl memcpy
-	ldr r0, _0804C88C  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804C87C
-	bl GetGameClock
-	movs r1, #0x3f
-	ands r1, r0
-	asrs r1, r1, #1
-	mov r2, sp
-	adds r0, r2, r1
-	ldrb r0, [r0]
-	ldr r1, _0804C890  @ gPaletteBuffer
-	lsls r0, r0, #1
-	adds r0, r0, r4
-	ldrh r0, [r0]
-	movs r2, #0x9f
-	lsls r2, r2, #2
-	adds r1, r1, r2
-	strh r0, [r1]
-	bl EnablePaletteSync
-_0804C87C:
-	add sp, #0x20
-	pop {r4}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804C884: .4byte gUnknown_085ADE48
-_0804C888: .4byte gUnknown_080DA0DA
-_0804C88C: .4byte gUnk_Sio_0203DDDC
-_0804C890: .4byte gPaletteBuffer
-
-	THUMB_FUNC_END sub_804C83C
-
-	THUMB_FUNC_START sub_804C894
-sub_804C894: @ 0x0804C894
-	push {r4, r5, r6, r7, lr}
-	mov r7, sl
-	mov r6, r9
-	mov r5, r8
-	push {r5, r6, r7}
-	sub sp, #8
-	adds r7, r0, #0
-	ldr r0, _0804C9E4  @ gLinkArenaSt
-	ldrb r0, [r0]
-	cmp r0, #1
-	beq _0804C8AC
-	b _0804CA08
-_0804C8AC:
-	adds r0, r7, #0
-	adds r0, #0x44
-	movs r1, #0
-	ldrsb r1, [r0, r1]
-	movs r2, #0xc0
-	lsls r2, r2, #4
-	mov r8, r2
-	str r0, [sp, #4]
-	cmp r1, #0
-	beq _0804C8C6
-	movs r0, #0x80
-	lsls r0, r0, #3
-	mov r8, r0
-_0804C8C6:
-	ldr r3, _0804C9E8  @ gUnknown_085AA9D8
-	movs r0, #0
-	str r0, [sp]
-	movs r1, #0x58
-	movs r2, #0x20
-	bl PutSprite
-	movs r6, #0
-	ldr r0, [r7, #0x2c]
-	cmp r6, r0
-	bge _0804C92A
-	movs r5, #0x20
-_0804C8DE:
-	lsls r1, r6, #1
-	adds r0, r7, #0
-	adds r0, #0x30
-	adds r4, r0, r1
-	movs r2, #0
-	ldrsh r1, [r4, r2]
-	adds r1, #6
-	movs r0, #0xf
-	ands r0, r6
-	lsls r0, r0, #0xc
-	add r0, r8
-	str r0, [sp]
-	movs r0, #4
-	adds r2, r5, #0
-	ldr r3, _0804C9EC  @ Sprite_085AAA50
-	bl PutSprite
-	adds r0, r7, #0
-	adds r0, #0x3a
-	adds r0, r0, r6
-	ldrb r0, [r0]
-	cmp r0, #0
-	beq _0804C920
-	movs r0, #0
-	ldrsh r1, [r4, r0]
-	adds r1, #6
-	mov r2, r8
-	str r2, [sp]
-	movs r0, #4
-	adds r2, r5, #0
-	ldr r3, _0804C9F0  @ gUnknown_085AAA5E
-	bl PutSprite
-_0804C920:
-	adds r5, #0x18
-	adds r6, #1
-	ldr r0, [r7, #0x2c]
-	cmp r6, r0
-	blt _0804C8DE
-_0804C92A:
-	ldr r0, [r7, #0x40]
-	cmp r0, #0
-	beq _0804C9DE
-	ldr r0, _0804C9F4  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804C95C
-	bl GetGameClock
-	ldr r2, _0804C9F8  @ gPaletteBuffer
-	movs r1, #0x3f
-	ands r1, r0
-	lsrs r1, r1, #2
-	lsls r1, r1, #1
-	ldr r0, _0804C9FC  @ gUnknown_08A1BD40
-	adds r1, r1, r0
-	ldrh r0, [r1]
-	movs r1, #0xc7
-	lsls r1, r1, #2
-	adds r2, r2, r1
-	strh r0, [r2]
-	bl EnablePaletteSync
-_0804C95C:
-	ldr r0, [r7, #0x40]
-	cmp r0, #0xff
-	bgt _0804C966
-	adds r0, #0x10
-	str r0, [r7, #0x40]
-_0804C966:
-	ldr r4, _0804CA00  @ gSinLookup
-	movs r2, #0x80
-	adds r2, r2, r4
-	mov r9, r2
-	movs r1, #0
-	ldrsh r0, [r2, r1]
-	lsls r0, r0, #4
-	movs r2, #0x80
-	lsls r2, r2, #1
-	mov r8, r2
-	mov r1, r8
-	bl Div
-	adds r6, r0, #0
-	lsls r6, r6, #0x10
-	asrs r6, r6, #0x10
-	movs r1, #0
-	ldrsh r0, [r4, r1]
-	negs r0, r0
-	lsls r0, r0, #4
-	ldr r1, [r7, #0x40]
-	bl Div
-	adds r5, r0, #0
-	lsls r5, r5, #0x10
-	asrs r5, r5, #0x10
-	movs r2, #0
-	ldrsh r0, [r4, r2]
-	lsls r0, r0, #4
-	mov r1, r8
-	bl Div
-	adds r4, r0, #0
-	lsls r4, r4, #0x10
-	asrs r4, r4, #0x10
-	mov r1, r9
-	movs r2, #0
-	ldrsh r0, [r1, r2]
-	lsls r0, r0, #4
-	ldr r1, [r7, #0x40]
-	bl Div
-	lsls r0, r0, #0x10
-	asrs r0, r0, #0x10
-	str r0, [sp]
-	movs r0, #0
-	adds r1, r6, #0
-	adds r2, r5, #0
-	adds r3, r4, #0
-	bl SetObjAffine
-	ldr r3, _0804CA04  @ gUnknown_080DA0FA
-	movs r0, #0x80
-	lsls r0, r0, #8
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0x78
-	movs r2, #0
-	bl PutSprite
-_0804C9DE:
-	bl sub_804C83C
-	b _0804CA96
-	.align 2, 0
-_0804C9E4: .4byte gLinkArenaSt
-_0804C9E8: .4byte gUnknown_085AA9D8
-_0804C9EC: .4byte Sprite_085AAA50
-_0804C9F0: .4byte gUnknown_085AAA5E
-_0804C9F4: .4byte gUnk_Sio_0203DDDC
-_0804C9F8: .4byte gPaletteBuffer
-_0804C9FC: .4byte gUnknown_08A1BD40
-_0804CA00: .4byte gSinLookup
-_0804CA04: .4byte gUnknown_080DA0FA
-_0804CA08:
-	ldr r3, _0804CA70  @ gUnknown_085AA9D8
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #0xb
-	movs r1, #0x58
-	movs r2, #0x20
-	bl PutSprite
-	movs r6, #0
-	ldr r0, [r7, #0x2c]
-	adds r1, r7, #0
-	adds r1, #0x44
-	str r1, [sp, #4]
-	cmp r6, r0
-	bge _0804CA92
-	ldr r2, _0804CA74  @ gUnknown_085AAA48
-	mov sl, r2
-	movs r0, #8
-	negs r0, r0
-	mov r9, r0
-	movs r1, #0x30
-	mov r8, r1
-_0804CA34:
-	lsls r1, r6, #1
-	adds r0, r7, #0
-	adds r0, #0x30
-	adds r5, r0, r1
-	movs r2, #0
-	ldrsh r1, [r5, r2]
-	adds r4, r7, #0
-	adds r4, #0x3a
-	adds r4, r4, r6
-	ldrb r0, [r4]
-	lsls r0, r0, #2
-	add r0, sl
-	ldr r3, [r0]
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #2
-	mov r2, r8
-	bl PutSprite
-	ldrb r0, [r4]
-	cmp r0, #0
-	beq _0804CA78
-	ldrh r1, [r5]
-	movs r2, #0
-	ldrsh r0, [r5, r2]
-	cmp r0, #0
-	bge _0804CA86
-	adds r0, r1, #1
-	b _0804CA84
-	.align 2, 0
-_0804CA70: .4byte gUnknown_085AA9D8
-_0804CA74: .4byte gUnknown_085AAA48
-_0804CA78:
-	ldrh r1, [r5]
-	movs r2, #0
-	ldrsh r0, [r5, r2]
-	cmp r0, r9
-	ble _0804CA86
-	subs r0, r1, #1
-_0804CA84:
-	strh r0, [r5]
-_0804CA86:
-	movs r0, #0x10
-	add r8, r0
-	adds r6, #1
-	ldr r0, [r7, #0x2c]
-	cmp r6, r0
-	blt _0804CA34
-_0804CA92:
-	bl sub_804C7E4
-_0804CA96:
-	ldr r0, _0804CAE4  @ gLinkArenaSt
-	ldrb r0, [r0]
-	movs r1, #0x80
-	lsls r1, r1, #4
-	mov r8, r1
-	cmp r0, #1
-	bne _0804CAAA
-	movs r2, #0x80
-	lsls r2, r2, #3
-	mov r8, r2
-_0804CAAA:
-	ldr r1, [sp, #4]
-	movs r0, #0
-	ldrsb r0, [r1, r0]
-	cmp r0, #0
-	beq _0804CABC
-	movs r0, #0xc0
-	movs r1, #0x10
-	bl PutLinkArenaButtonSpriteAt
-_0804CABC:
-	ldr r0, [r7, #0x48]
-	cmp r0, #0
-	blt _0804CAD4
-	adds r2, r0, #0
-	adds r2, #8
-	ldr r3, _0804CAE8  @ gUnknown_085AAA0E
-	mov r0, r8
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0x50
-	bl PutSprite
-_0804CAD4:
-	add sp, #8
-	pop {r3, r4, r5}
-	mov r8, r3
-	mov r9, r4
-	mov sl, r5
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CAE4: .4byte gLinkArenaSt
-_0804CAE8: .4byte gUnknown_085AAA0E
-
-	THUMB_FUNC_END sub_804C894
-
-	THUMB_FUNC_START sub_804CAEC
-sub_804CAEC: @ 0x0804CAEC
-	push {r4, r5, r6, r7, lr}
-	mov r7, r8
-	push {r7}
-	sub sp, #8
-	adds r6, r0, #0
-	adds r5, r1, #0
-	mov r8, r2
-	ldr r4, _0804CB8C  @ gUnknown_085AAA78
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r6, #0
-	bl Proc_Start
-	adds r4, r0, #0
-	str r5, [r4, #0x2c]
-	adds r1, r4, #0
-	adds r1, #0x44
-	movs r2, #0
-	movs r0, #1
-	strb r0, [r1]
-	str r2, [r4, #0x40]
-	subs r0, #2
-	str r0, [r4, #0x48]
-	movs r3, #0
-	adds r5, r4, #0
-	adds r5, #0x3a
-	ldr r0, _0804CB90  @ 0x0000FFF8
-	mov ip, r0
-	adds r2, r4, #0
-	adds r2, #0x30
-_0804CB2C:
-	adds r0, r5, r3
-	mov r7, r8
-	adds r1, r7, r3
-	ldrb r1, [r1]
-	strb r1, [r0]
-	mov r0, ip
-	strh r0, [r2]
-	adds r2, #2
-	adds r3, #1
-	cmp r3, #4
-	ble _0804CB2C
-	ldr r2, [r6, #0x38]
-	lsls r2, r2, #0x18
-	lsrs r2, r2, #0x18
-	adds r0, r6, #0
-	adds r0, #0x4a
-	ldrb r0, [r0]
-	adds r0, #0x28
-	lsls r0, r0, #0x18
-	lsrs r0, r0, #0x18
-	str r0, [sp]
-	str r4, [sp, #4]
-	movs r0, #0xe1
-	movs r1, #0x28
-	movs r3, #6
-	bl sub_804D1E0
-	adds r0, r6, #0
-	adds r0, #0x48
-	ldrb r0, [r0]
-	lsls r0, r0, #4
-	movs r1, #0x28
-	subs r1, r1, r0
-	ldr r0, [r6, #0x38]
-	str r0, [sp]
-	str r4, [sp, #4]
-	movs r0, #0x98
-	movs r2, #0x88
-	movs r3, #0x27
-	bl sub_804CC14
-	adds r0, r4, #0
-	add sp, #8
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6, r7}
-	pop {r1}
-	bx r1
-	.align 2, 0
-_0804CB8C: .4byte gUnknown_085AAA78
-_0804CB90: .4byte 0x0000FFF8
-
-	THUMB_FUNC_END sub_804CAEC
-
-	THUMB_FUNC_START sub_804CB94
-sub_804CB94: @ 0x0804CB94
-	push {r4, r5, r6, r7, lr}
-	mov r7, sl
-	mov r6, r9
-	mov r5, r8
-	push {r5, r6, r7}
-	sub sp, #4
-	adds r4, r0, #0
-	movs r0, #0
-	mov r8, r0
-	b _0804CBFC
-_0804CBA8:
-	mov r1, r8
-	lsls r0, r1, #4
-	ldr r1, [r4, #0x30]
-	adds r5, r1, r0
-	ldr r0, [r4, #0x38]
-	movs r1, #1
-	add r1, r8
-	mov sl, r1
-	cmp r5, r0
-	bge _0804CBFA
-	ldr r0, [r4, #0x34]
-	cmp r5, r0
-	ble _0804CBFA
-	movs r6, #0
-	mov r0, r8
-	lsls r0, r0, #2
-	mov r9, r0
-	movs r7, #0
-_0804CBCC:
-	mov r0, r9
-	add r0, r8
-	adds r0, r0, r6
-	adds r0, #1
-	bl GetUnit
-	adds r2, r0, #0
-	ldr r0, [r2]
-	cmp r0, #0
-	beq _0804CBF2
-	ldr r1, [r4, #0x2c]
-	adds r1, r1, r7
-	str r2, [sp]
-	movs r0, #4
-	adds r2, r5, #0
-	movs r3, #0x80
-	lsls r3, r3, #3
-	bl sub_8027E4C
-_0804CBF2:
-	adds r7, #0xe
-	adds r6, #1
-	cmp r6, #4
-	ble _0804CBCC
-_0804CBFA:
-	mov r8, sl
-_0804CBFC:
-	ldr r0, [r4, #0x3c]
-	cmp r8, r0
-	blt _0804CBA8
-	add sp, #4
-	pop {r3, r4, r5}
-	mov r8, r3
-	mov r9, r4
-	mov sl, r5
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804CB94
-
-	THUMB_FUNC_START sub_804CC14
-sub_804CC14: @ 0x0804CC14
-	push {r4, r5, r6, r7, lr}
-	mov r7, sl
-	mov r6, r9
-	mov r5, r8
-	push {r5, r6, r7}
-	mov r9, r0
-	mov sl, r1
-	adds r7, r2, #0
-	mov r8, r3
-	ldr r6, [sp, #0x20]
-	ldr r5, [sp, #0x24]
-	ldr r4, _0804CC58  @ gUnknown_085AAA90
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r5, #0
-	bl Proc_Start
-	str r6, [r0, #0x3c]
-	mov r1, r9
-	str r1, [r0, #0x2c]
-	mov r1, sl
-	str r1, [r0, #0x30]
-	mov r1, r8
-	str r1, [r0, #0x34]
-	str r7, [r0, #0x38]
-	pop {r3, r4, r5}
-	mov r8, r3
-	mov r9, r4
-	mov sl, r5
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CC58: .4byte gUnknown_085AAA90
-
-	THUMB_FUNC_END sub_804CC14
-
-	THUMB_FUNC_START sub_804CC5C
-sub_804CC5C: @ 0x0804CC5C
-	push {r4, lr}
-	adds r4, r0, #0
-	ldr r0, _0804CC74  @ gUnknown_085AAA90
-	bl Proc_Find
-	ldr r1, [r0, #0x30]
-	adds r1, r1, r4
-	str r1, [r0, #0x30]
-	pop {r4}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CC74: .4byte gUnknown_085AAA90
-
-	THUMB_FUNC_END sub_804CC5C
-
-	THUMB_FUNC_START sub_804CC78
-sub_804CC78: @ 0x0804CC78
-	push {r4, r5, r6, lr}
-	ldr r5, _0804CCBC  @ gUnknown_085ADE28
-	ldr r0, _0804CCC0  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804CCB6
-	bl GetGameClock
-	adds r2, r0, #0
-	movs r0, #0x1f
-	ands r2, r0
-	asrs r2, r2, #1
-	movs r1, #0
-	ldr r0, _0804CCC4  @ gPaletteBuffer
-	movs r4, #0xf
-	ldr r6, _0804CCC8  @ 0x00000336
-	adds r3, r0, r6
-_0804CC9E:
-	adds r0, r2, r1
-	ands r0, r4
-	lsls r0, r0, #1
-	adds r0, r0, r5
-	ldrh r0, [r0]
-	strh r0, [r3]
-	adds r3, #2
-	adds r1, #1
-	cmp r1, #4
-	ble _0804CC9E
-	bl EnablePaletteSync
-_0804CCB6:
-	pop {r4, r5, r6}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CCBC: .4byte gUnknown_085ADE28
-_0804CCC0: .4byte gUnk_Sio_0203DDDC
-_0804CCC4: .4byte gPaletteBuffer
-_0804CCC8: .4byte 0x00000336
-
-	THUMB_FUNC_END sub_804CC78
-
-	THUMB_FUNC_START sub_804CCCC
-sub_804CCCC: @ 0x0804CCCC
-	push {r4, r5, r6, r7, lr}
-	sub sp, #4
-	adds r7, r0, #0
-	ldr r1, [r7, #0x34]
-	ldr r0, [r7, #0x2c]
-	adds r1, r1, r0
-	asrs r1, r1, #1
-	ldr r2, [r7, #0x38]
-	ldr r0, [r7, #0x30]
-	adds r2, r2, r0
-	asrs r2, r2, #1
-	str r1, [r7, #0x2c]
-	str r2, [r7, #0x30]
-	ldr r3, _0804CD54  @ gUnknown_085AAAA8
-	ldr r0, [r7, #0x3c]
-	lsls r0, r0, #2
-	adds r0, r0, r3
-	ldr r3, [r0]
-	movs r4, #0
-	str r4, [sp]
-	movs r0, #2
-	bl PutSprite
-	ldr r1, [r7, #0x40]
-	adds r1, #0x60
-	ldr r3, _0804CD58  @ gUnknown_080DA132
-	str r4, [sp]
-	movs r0, #2
-	movs r2, #0x30
-	bl PutSprite
-	ldr r3, _0804CD5C  @ gUnknown_085AA9D8
-	str r4, [sp]
-	movs r0, #2
-	movs r1, #0x60
-	movs r2, #0x20
-	bl PutSprite
-	ldr r3, _0804CD60  @ Sprite_085AAA50
-	movs r0, #0x80
-	lsls r0, r0, #4
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0x50
-	movs r2, #0x20
-	bl PutSprite
-	movs r4, #3
-	ldr r0, _0804CD64  @ gUnknown_085AAAB0
-	adds r6, r0, #0
-	adds r6, #0xc
-	movs r5, #0x78
-_0804CD34:
-	ldr r0, [r7, #0x44]
-	cmp r0, r4
-	bne _0804CD68
-	cmp r4, #2
-	bgt _0804CD68
-	ldr r3, [r6]
-	movs r0, #0x80
-	lsls r0, r0, #7
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0xc4
-	adds r2, r5, #0
-	bl PutSprite
-	b _0804CD7A
-	.align 2, 0
-_0804CD54: .4byte gUnknown_085AAAA8
-_0804CD58: .4byte gUnknown_080DA132
-_0804CD5C: .4byte gUnknown_085AA9D8
-_0804CD60: .4byte Sprite_085AAA50
-_0804CD64: .4byte gUnknown_085AAAB0
-_0804CD68:
-	ldr r3, [r6]
-	movs r0, #0x80
-	lsls r0, r0, #8
-	str r0, [sp]
-	movs r0, #4
-	movs r1, #0xc4
-	adds r2, r5, #0
-	bl PutSprite
-_0804CD7A:
-	adds r6, #4
-	adds r5, #0x10
-	adds r4, #1
-	cmp r4, #4
-	ble _0804CD34
-	bl sub_804CC78
-	add sp, #4
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804CCCC
-
-	THUMB_FUNC_START NewProc_085AAAC4
-NewProc_085AAAC4: @ 0x0804CD90
-	push {r4, r5, r6, lr}
-	mov r6, r8
-	push {r6}
-	adds r6, r0, #0
-	adds r5, r1, #0
-	mov r8, r2
-	ldr r4, _0804CDCC  @ Proc_085AAAC4
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r6, #0
-	bl Proc_Start
-	str r5, [r0, #0x34]
-	str r5, [r0, #0x2c]
-	mov r1, r8
-	str r1, [r0, #0x38]
-	str r1, [r0, #0x30]
-	movs r1, #0
-	str r1, [r0, #0x3c]
-	str r1, [r0, #0x40]
-	movs r1, #1
-	str r1, [r0, #0x44]
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6}
-	pop {r1}
-	bx r1
-	.align 2, 0
-_0804CDCC: .4byte Proc_085AAAC4
-
-	THUMB_FUNC_END NewProc_085AAAC4
-
-	THUMB_FUNC_START sub_804CDD0
-sub_804CDD0: @ 0x0804CDD0
-	push {r4, r5, lr}
-	ldr r4, [sp, #0xc]
-	ldr r5, [sp, #0x10]
-	str r1, [r0, #0x34]
-	str r2, [r0, #0x38]
-	str r4, [r0, #0x3c]
-	str r3, [r0, #0x40]
-	str r5, [r0, #0x44]
-	pop {r4, r5}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804CDD0
-
-	THUMB_FUNC_START sub_804CDE8
-sub_804CDE8: @ 0x0804CDE8
-	push {r4, r5, r6, r7, lr}
-	mov r7, r8
-	push {r7}
-	sub sp, #4
-	adds r5, r0, #0
-	movs r0, #0x2c
-	ldrsh r1, [r5, r0]
-	movs r2, #0x2a
-	ldrsh r0, [r5, r2]
-	adds r1, r1, r0
-	lsls r0, r1, #1
-	adds r0, r0, r1
-	lsls r7, r0, #2
-	ldrh r0, [r5, #0x2c]
-	strh r0, [r5, #0x2a]
-	ldr r0, _0804CE58  @ gUnknown_085AAADC
-	mov r8, r0
-	movs r6, #0x30
-	movs r4, #2
-_0804CE0E:
-	mov r1, r8
-	adds r1, #4
-	mov r8, r1
-	subs r1, #4
-	ldm r1!, {r3}
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #2
-	movs r1, #0x20
-	adds r2, r6, #0
-	bl PutSprite
-	adds r6, #0x18
-	subs r4, #1
-	cmp r4, #0
-	bge _0804CE0E
-	adds r1, r7, #0
-	adds r1, #0x30
-	movs r0, #0x20
-	bl DisplayFrozenUiHand
-	movs r2, #0x2e
-	ldrsh r0, [r5, r2]
-	movs r2, #0x30
-	ldrsh r1, [r5, r2]
-	bl DisplayUiHand
-	movs r0, #0xc0
-	movs r1, #0x10
-	bl PutLinkArenaButtonSpriteAt
-	add sp, #4
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CE58: .4byte gUnknown_085AAADC
-
-	THUMB_FUNC_END sub_804CDE8
-
-	THUMB_FUNC_START sub_804CE5C
-sub_804CE5C: @ 0x0804CE5C
-	push {r4, r5, r6, lr}
-	sub sp, #4
-	ldr r6, _0804CE88  @ gUnknown_085AAADC
-	movs r5, #0x30
-	movs r4, #2
-_0804CE66:
-	ldm r6!, {r3}
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #2
-	movs r1, #0x20
-	adds r2, r5, #0
-	bl PutSprite
-	adds r5, #0x18
-	subs r4, #1
-	cmp r4, #0
-	bge _0804CE66
-	add sp, #4
-	pop {r4, r5, r6}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CE88: .4byte gUnknown_085AAADC
-
-	THUMB_FUNC_END sub_804CE5C
-
-	THUMB_FUNC_START sub_804CE8C
-sub_804CE8C: @ 0x0804CE8C
-	push {r4, r5, lr}
-	adds r5, r0, #0
-	ldr r4, _0804CEAC  @ gUnknown_085AAAE8
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r5, #0
-	bl Proc_Start
-	movs r1, #0
-	strh r1, [r0, #0x2a]
-	pop {r4, r5}
-	pop {r1}
-	bx r1
-	.align 2, 0
-_0804CEAC: .4byte gUnknown_085AAAE8
-
-	THUMB_FUNC_END sub_804CE8C
-
-	THUMB_FUNC_START sub_804CEB0
-sub_804CEB0: @ 0x0804CEB0
-	push {lr}
-	ldr r0, _0804CEC0  @ gUnknown_085AAB00
-	movs r1, #3
-	bl Proc_Start
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CEC0: .4byte gUnknown_085AAB00
-
-	THUMB_FUNC_END sub_804CEB0
-
-	THUMB_FUNC_START sub_804CEC4
-sub_804CEC4: @ 0x0804CEC4
-	strh r1, [r0, #0x2c]
-	strh r2, [r0, #0x2e]
-	strh r3, [r0, #0x30]
-	bx lr
-
-	THUMB_FUNC_END sub_804CEC4
-
-	THUMB_FUNC_START sub_804CECC
-sub_804CECC: @ 0x0804CECC
-	push {lr}
-	adds r1, r0, #0
-	ldr r2, _0804CEF8  @ gUnknown_085ADE28
-	ldr r0, _0804CEFC  @ gUnk_Sio_0203DDDC
-	ldrb r0, [r0]
-	lsls r0, r0, #0x18
-	asrs r0, r0, #0x18
-	cmp r0, #0
-	bne _0804CEF2
-	ldr r0, _0804CF00  @ gPaletteBuffer
-	lsls r1, r1, #1
-	adds r1, r1, r2
-	ldrh r1, [r1]
-	movs r2, #0xb7
-	lsls r2, r2, #2
-	adds r0, r0, r2
-	strh r1, [r0]
-	bl EnablePaletteSync
-_0804CEF2:
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CEF8: .4byte gUnknown_085ADE28
-_0804CEFC: .4byte gUnk_Sio_0203DDDC
-_0804CF00: .4byte gPaletteBuffer
-
-	THUMB_FUNC_END sub_804CECC
-
-	THUMB_FUNC_START sub_804CF04
-sub_804CF04: @ 0x0804CF04
-	push {r4, r5, r6, r7, lr}
-	mov r7, r8
-	push {r7}
-	sub sp, #4
-	adds r7, r0, #0
-	movs r0, #0x4c
-	adds r0, r0, r7
-	mov r8, r0
-	movs r1, #0
-	ldrsh r5, [r0, r1]
-	lsls r4, r5, #1
-	adds r0, r5, #0
-	bl sub_804CECC
-	ldr r0, _0804CFA4  @ gUnknown_080DA1CA
-	adds r4, #1
-	lsls r4, r4, #1
-	adds r4, r4, r0
-	movs r1, #0
-	ldrsh r6, [r4, r1]
-	ldr r1, [r7, #0x2c]
-	subs r1, r1, r6
-	lsls r5, r5, #2
-	adds r5, r5, r0
-	movs r0, #0
-	ldrsh r5, [r5, r0]
-	ldr r2, [r7, #0x30]
-	subs r2, r2, r5
-	ldr r3, _0804CFA8  @ gUnknown_080DA17A
-	movs r4, #0
-	str r4, [sp]
-	movs r0, #2
-	bl PutSprite
-	ldr r1, [r7, #0x2c]
-	adds r1, r1, r6
-	adds r1, #0x10
-	ldr r2, [r7, #0x30]
-	subs r2, r2, r5
-	ldr r3, _0804CFAC  @ gUnknown_080DA18E
-	str r4, [sp]
-	movs r0, #2
-	bl PutSprite
-	ldr r1, [r7, #0x2c]
-	subs r1, r1, r6
-	ldr r2, [r7, #0x30]
-	adds r2, r2, r5
-	ldr r3, _0804CFB0  @ gUnknown_080DA1A2
-	str r4, [sp]
-	movs r0, #2
-	bl PutSprite
-	ldr r1, [r7, #0x2c]
-	adds r1, r1, r6
-	adds r1, #0x10
-	ldr r2, [r7, #0x30]
-	adds r2, r2, r5
-	ldr r3, _0804CFB4  @ gUnknown_080DA1B6
-	str r4, [sp]
-	movs r0, #2
-	bl PutSprite
-	mov r1, r8
-	ldrh r0, [r1]
-	adds r0, #1
-	strh r0, [r1]
-	lsls r0, r0, #0x10
-	asrs r0, r0, #0x10
-	cmp r0, #0xf
-	bne _0804CF98
-	adds r0, r7, #0
-	bl Proc_Break
-_0804CF98:
-	add sp, #4
-	pop {r3}
-	mov r8, r3
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804CFA4: .4byte gUnknown_080DA1CA
-_0804CFA8: .4byte gUnknown_080DA17A
-_0804CFAC: .4byte gUnknown_080DA18E
-_0804CFB0: .4byte gUnknown_080DA1A2
-_0804CFB4: .4byte gUnknown_080DA1B6
-
-	THUMB_FUNC_END sub_804CF04
-
-	THUMB_FUNC_START sub_804CFB8
-sub_804CFB8: @ 0x0804CFB8
-	push {r4, r5, lr}
-	adds r3, r0, #0
-	adds r4, r1, #0
-	adds r5, r2, #0
-	ldr r0, _0804CFDC  @ gUnknown_085AAB18
-	adds r1, r3, #0
-	bl Proc_Start
-	adds r1, r0, #0
-	str r4, [r1, #0x2c]
-	str r5, [r1, #0x30]
-	adds r1, #0x4c
-	movs r2, #0
-	strh r2, [r1]
-	pop {r4, r5}
-	pop {r1}
-	bx r1
-	.align 2, 0
-_0804CFDC: .4byte gUnknown_085AAB18
-
-	THUMB_FUNC_END sub_804CFB8
-
-	THUMB_FUNC_START sub_804CFE0
-sub_804CFE0: @ 0x0804CFE0
-	push {r4, r5, r6, lr}
-	adds r6, r0, #0
-	adds r0, #0x45
-	movs r1, #0
-	strb r1, [r0]
-	subs r0, #1
-	strb r1, [r0]
-	subs r0, #7
-	ldrb r0, [r0]
-	ldr r4, [r6, #0x34]
-	muls r0, r4, r0
-	lsls r0, r0, #3
-	adds r5, r6, #0
-	adds r5, #0x3c
-	ldrb r1, [r5]
-	bl __divsi3
-	str r0, [r6, #0x38]
-	lsls r4, r4, #0xb
-	ldrb r1, [r5]
-	lsls r1, r1, #4
-	adds r0, r4, #0
-	bl __divsi3
-	adds r1, r6, #0
-	adds r1, #0x42
-	strh r0, [r1]
-	pop {r4, r5, r6}
-	pop {r0}
-	bx r0
-
-	THUMB_FUNC_END sub_804CFE0
-
-	THUMB_FUNC_START sub_804D01C
-sub_804D01C: @ 0x0804D01C
-	push {r4, r5, r6, r7, lr}
-	mov r7, sl
-	mov r6, r9
-	mov r5, r8
-	push {r5, r6, r7}
-	sub sp, #0x30
-	adds r7, r0, #0
-	ldr r0, [r7, #0x2c]
-	mov r8, r0
-	ldr r1, [r7, #0x30]
-	str r1, [sp, #0xc]
-	adds r1, #8
-	mov sl, r1
-	ldr r0, [r7, #0x38]
-	asrs r2, r0, #3
-	str r2, [sp, #0x10]
-	movs r1, #7
-	ands r0, r1
-	movs r1, #8
-	subs r0, r1, r0
-	str r0, [sp, #0x14]
-	movs r3, #0x3e
-	ldrsh r1, [r7, r3]
-	adds r0, r7, #0
-	adds r0, #0x42
-	ldrh r0, [r0]
-	muls r0, r1, r0
-	asrs r0, r0, #8
-	str r0, [sp, #0x18]
-	movs r0, #0x3c
-	adds r0, r0, r7
-	mov ip, r0
-	movs r1, #0x3d
-	adds r1, r1, r7
-	mov r9, r1
-	ldrb r0, [r0]
-	ldrb r2, [r1]
-	cmp r0, r2
-	bhi _0804D06C
-	b _0804D1C4
-_0804D06C:
-	adds r5, r7, #0
-	adds r5, #0x44
-	ldrb r0, [r5]
-	adds r0, #1
-	strb r0, [r5]
-	adds r4, r7, #0
-	adds r4, #0x45
-	ldrb r0, [r4]
-	adds r0, #1
-	strb r0, [r4]
-	adds r0, r7, #0
-	adds r0, #0x40
-	movs r3, #0x3e
-	ldrsh r2, [r7, r3]
-	movs r3, #0
-	ldrsh r1, [r0, r3]
-	adds r3, r5, #0
-	str r0, [sp, #0x2c]
-	cmp r2, r1
-	bge _0804D09A
-	ldrb r0, [r3]
-	adds r0, #2
-	strb r0, [r3]
-_0804D09A:
-	movs r0, #0x3e
-	ldrsh r1, [r7, r0]
-	ldr r2, [sp, #0x2c]
-	movs r3, #0
-	ldrsh r0, [r2, r3]
-	cmp r1, r0
-	ble _0804D0AE
-	ldrb r0, [r4]
-	adds r0, #2
-	strb r0, [r4]
-_0804D0AE:
-	movs r6, #0
-	mov r0, ip
-	str r0, [sp, #0x28]
-	ldr r1, [sp, #0x18]
-	add r1, sl
-	str r1, [sp, #0x1c]
-	ldr r2, [sp, #0x10]
-	lsls r2, r2, #3
-	str r2, [sp, #0x24]
-	ldr r3, [sp, #0xc]
-	str r3, [sp, #0x20]
-_0804D0C4:
-	ldrb r0, [r5]
-	cmp r0, #0x30
-	bls _0804D0CE
-	movs r0, #0
-	strb r0, [r5]
-_0804D0CE:
-	lsls r4, r6, #2
-	add r4, sp
-	adds r4, #4
-	ldrb r0, [r5]
-	lsrs r0, r0, #3
-	movs r1, #6
-	bl __umodsi3
-	lsls r0, r0, #0x18
-	lsrs r0, r0, #0x18
-	str r0, [r4]
-	adds r5, #1
-	adds r6, #1
-	cmp r6, #1
-	ble _0804D0C4
-	movs r1, #0x3e
-	ldrsh r0, [r7, r1]
-	cmp r0, #0
-	beq _0804D106
-	mov r2, sl
-	subs r2, #9
-	ldr r3, _0804D1D4  @ gUnknown_085AAB38
-	ldr r0, [sp, #4]
-	str r0, [sp]
-	movs r0, #3
-	mov r1, r8
-	bl PutSprite
-_0804D106:
-	movs r2, #0x3e
-	ldrsh r0, [r7, r2]
-	cmp r0, #0
-	bge _0804D110
-	adds r0, #0xf
-_0804D110:
-	asrs r0, r0, #4
-	mov r3, r9
-	ldrb r3, [r3]
-	adds r0, r0, r3
-	ldr r1, [sp, #0x28]
-	ldrb r1, [r1]
-	cmp r0, r1
-	bge _0804D136
-	ldr r2, [r7, #0x34]
-	lsls r2, r2, #3
-	add r2, sl
-	adds r2, #1
-	ldr r3, _0804D1D8  @ gUnknown_085AAB30
-	ldr r0, [sp, #8]
-	str r0, [sp]
-	movs r0, #3
-	mov r1, r8
-	bl PutSprite
-_0804D136:
-	movs r6, #0
-	ldr r0, [r7, #0x34]
-	cmp r6, r0
-	bge _0804D15A
-	mov r4, sl
-	movs r5, #1
-_0804D142:
-	str r5, [sp]
-	movs r0, #2
-	mov r1, r8
-	adds r2, r4, #0
-	ldr r3, _0804D1DC  @ gUnknown_085AAB40
-	bl PutSprite
-	adds r4, #8
-	adds r6, #1
-	ldr r0, [r7, #0x34]
-	cmp r6, r0
-	blt _0804D142
-_0804D15A:
-	ldr r2, [sp, #0x10]
-	cmp r2, #0
-	ble _0804D17C
-	ldr r4, [sp, #0x1c]
-	movs r5, #0
-	adds r6, r2, #0
-_0804D166:
-	str r5, [sp]
-	movs r0, #2
-	mov r1, r8
-	adds r2, r4, #0
-	ldr r3, _0804D1DC  @ gUnknown_085AAB40
-	bl PutSprite
-	adds r4, #8
-	subs r6, #1
-	cmp r6, #0
-	bne _0804D166
-_0804D17C:
-	ldr r3, [sp, #0x1c]
-	ldr r0, [sp, #0x24]
-	adds r2, r3, r0
-	ldr r1, [sp, #0x14]
-	subs r2, r2, r1
-	ldr r4, _0804D1DC  @ gUnknown_085AAB40
-	movs r0, #0
-	str r0, [sp]
-	movs r0, #2
-	mov r1, r8
-	adds r3, r4, #0
-	bl PutSprite
-	movs r5, #2
-	str r5, [sp]
-	movs r0, #2
-	mov r1, r8
-	ldr r2, [sp, #0x20]
-	adds r3, r4, #0
-	bl PutSprite
-	movs r1, #0x80
-	lsls r1, r1, #6
-	add r1, r8
-	ldr r2, [r7, #0x34]
-	lsls r2, r2, #3
-	add r2, sl
-	subs r2, #7
-	str r5, [sp]
-	movs r0, #2
-	adds r3, r4, #0
-	bl PutSprite
-	ldrh r0, [r7, #0x3e]
-	ldr r2, [sp, #0x2c]
-	strh r0, [r2]
-_0804D1C4:
-	add sp, #0x30
-	pop {r3, r4, r5}
-	mov r8, r3
-	mov r9, r4
-	mov sl, r5
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804D1D4: .4byte gUnknown_085AAB38
-_0804D1D8: .4byte gUnknown_085AAB30
-_0804D1DC: .4byte gUnknown_085AAB40
-
-	THUMB_FUNC_END sub_804D01C
-
-	THUMB_FUNC_START sub_804D1E0
-sub_804D1E0: @ 0x0804D1E0
-	push {r4, r5, r6, r7, lr}
-	mov r7, sl
-	mov r6, r9
-	mov r5, r8
-	push {r5, r6, r7}
-	mov r9, r0
-	mov sl, r1
-	mov r8, r2
-	adds r5, r3, #0
-	ldr r6, [sp, #0x20]
-	ldr r7, [sp, #0x24]
-	mov r0, r8
-	lsls r0, r0, #0x18
-	lsrs r0, r0, #0x18
-	mov r8, r0
-	lsls r5, r5, #0x18
-	lsrs r5, r5, #0x18
-	lsls r6, r6, #0x18
-	lsrs r6, r6, #0x18
-	ldr r4, _0804D248  @ gUnknown_085AAB48
-	adds r0, r4, #0
-	bl Proc_EndEach
-	adds r0, r4, #0
-	adds r1, r7, #0
-	bl Proc_Start
-	adds r1, r0, #0
-	mov r2, r9
-	str r2, [r1, #0x2c]
-	mov r0, sl
-	str r0, [r1, #0x30]
-	lsls r0, r5, #1
-	subs r0, #2
-	str r0, [r1, #0x34]
-	adds r0, r1, #0
-	adds r0, #0x3c
-	mov r2, r8
-	strb r2, [r0]
-	adds r0, #1
-	strb r5, [r0]
-	strh r6, [r1, #0x3e]
-	adds r0, #3
-	strh r6, [r0]
-	pop {r3, r4, r5}
-	mov r8, r3
-	mov r9, r4
-	mov sl, r5
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804D248: .4byte gUnknown_085AAB48
-
-	THUMB_FUNC_END sub_804D1E0
-
-	THUMB_FUNC_START sub_804D24C
-sub_804D24C: @ 0x0804D24C
-	push {r4, r5, r6, r7, lr}
-	lsls r0, r0, #0x18
-	lsrs r7, r0, #0x18
-	lsls r1, r1, #0x10
-	lsrs r4, r1, #0x10
-	ldr r0, _0804D2A0  @ gUnknown_085AAB48
-	bl Proc_Find
-	adds r6, r0, #0
-	cmp r6, #0
-	beq _0804D298
-	adds r5, r6, #0
-	adds r5, #0x3c
-	strb r7, [r5]
-	lsls r0, r4, #0x10
-	asrs r0, r0, #0x10
-	movs r1, #0xff
-	ands r0, r1
-	strh r0, [r6, #0x3e]
-	adds r0, r6, #0
-	adds r0, #0x3d
-	ldrb r0, [r0]
-	ldr r4, [r6, #0x34]
-	muls r0, r4, r0
-	lsls r0, r0, #3
-	ldrb r1, [r5]
-	bl __divsi3
-	str r0, [r6, #0x38]
-	lsls r4, r4, #0xb
-	ldrb r1, [r5]
-	lsls r1, r1, #4
-	adds r0, r4, #0
-	bl __divsi3
-	adds r1, r6, #0
-	adds r1, #0x42
-	strh r0, [r1]
-_0804D298:
-	pop {r4, r5, r6, r7}
-	pop {r0}
-	bx r0
-	.align 2, 0
-_0804D2A0: .4byte gUnknown_085AAB48
-
-	THUMB_FUNC_END sub_804D24C
-
 	THUMB_FUNC_START sub_804D2A4
 sub_804D2A4: @ 0x0804D2A4
 	push {r4, r5, r6, lr}
diff --git a/include/sio.h b/include/sio.h
index 80f30885..218f331a 100644
--- a/include/sio.h
+++ b/include/sio.h
@@ -462,12 +462,12 @@ void sub_804C558(void);
 // ??? sub_804C5A4(???);
 // ??? sub_804C5F8(???);
 ProcPtr sub_804C758(ProcPtr, u8, u8, u8, u8);
-void sub_804C7C8(ProcPtr, int, int, int, int);
-void sub_804C7DC(ProcPtr, s16, s16);
+// void sub_804C7C8(ProcPtr, int, int, int, int); TODO
+// void sub_804C7DC(ProcPtr, s16, s16); TODO
 // ??? sub_804C7E4(???);
 // ??? sub_804C83C(???);
 // ??? sub_804C894(???);
-ProcPtr sub_804CAEC(ProcPtr, int, u8 *);
+// ProcPtr sub_804CAEC(ProcPtr, int, u8 *); TODO
 // ??? sub_804CB94(???);
 // ??? sub_804CC14(???);
 void sub_804CC5C(int);;
@@ -482,10 +482,10 @@ ProcPtr sub_804CE8C(ProcPtr);
 void sub_804CEC4(ProcPtr, s16, s16, s16);
 // ??? sub_804CECC(???);
 // ??? sub_804CF04(???);
-void sub_804CFB8(ProcPtr, s16, s16);
+ProcPtr sub_804CFB8(ProcPtr, int, int);
 // ??? sub_804CFE0(???);
 // ??? sub_804D01C(???);
-void sub_804D1E0(int, int, int, int, u8, ProcPtr);
+void sub_804D1E0(int, int, u8, u8, u8, ProcPtr);
 void sub_804D24C(u8, s16);
 // ??? sub_804D2A4(???);
 // ??? sub_804D37C(???);
diff --git a/ldscript.txt b/ldscript.txt
index f4586b77..96af4275 100644
--- a/ldscript.txt
+++ b/ldscript.txt
@@ -397,6 +397,7 @@ SECTIONS
         src/sio_battlemap.o(.text);
         src/sio_804B920.o(.text);
         src/sio_mu.o(.text);
+        src/sio_uiutils.o(.text);
         asm/code_sio_8048260.o(.text);
         src/uiutils.o(.text);
         src/uimenu.o(.text);
diff --git a/src/sio_menu.c b/src/sio_menu.c
index 491145bc..e340bb00 100644
--- a/src/sio_menu.c
+++ b/src/sio_menu.c
@@ -14,6 +14,10 @@
 
 #include "constants/faces.h"
 
+// FIXME
+void sub_804C7C8(ProcPtr, int, int, int, int);
+void sub_804C7DC(ProcPtr, s16, s16);
+
 //! FE8U = 0x08047A54
 int sub_8047A54(struct SioMenuProc * proc, int lineNum)
 {
diff --git a/src/sio_teamlist.c b/src/sio_teamlist.c
index 2c1bee16..b7f91bbf 100644
--- a/src/sio_teamlist.c
+++ b/src/sio_teamlist.c
@@ -15,6 +15,9 @@
 #include "sio_core.h"
 #include "sio.h"
 
+// FIXME
+ProcPtr sub_804CAEC(ProcPtr, int, u8 *);
+
 struct SioProc85AAA78
 {
     /* 00 */ PROC_HEADER;
diff --git a/src/sio_uiutils.c b/src/sio_uiutils.c
new file mode 100644
index 00000000..81ae3fd9
--- /dev/null
+++ b/src/sio_uiutils.c
@@ -0,0 +1,1039 @@
+#include "global.h"
+
+#include "hardware.h"
+#include "bm.h"
+#include "bmlib.h"
+#include "ctc.h"
+#include "bmunit.h"
+#include "bmudisp.h"
+#include "uiutils.h"
+
+#include "sio_core.h"
+#include "sio.h"
+
+/**
+ * Contains various sprite/palette utility procs used in
+ * the Link Arena menus.
+ */
+
+extern const u16 SioDefaultBgConfig[];
+
+//! FE8U = 0x0804C33C
+void InitSioBG(void)
+{
+    u16 hack[12];
+    memcpy(hack, SioDefaultBgConfig, 0x18);
+
+    SetupBackgrounds(hack);
+
+    gLCDControlBuffer.bg0cnt.priority = 0;
+    gLCDControlBuffer.bg1cnt.priority = 1;
+    gLCDControlBuffer.bg2cnt.priority = 2;
+    gLCDControlBuffer.bg3cnt.priority = 3;
+
+    ReadGameSaveCoreGfx();
+
+    CopyToPaletteBuffer(Pal_LinkArenaRankIcons, 0x300, 0x40);
+
+    return;
+}
+
+//! FE8U = 0x0804C3A0
+void sub_804C3A0(int unusedA, int unusedB)
+{
+    return;
+}
+
+//! FE8U = 0x0804C3A4
+void sub_804C3A4(int unused)
+{
+    return;
+}
+
+//! FE8U = 0x0804C3A8
+void nullsub_13(void)
+{
+    return;
+}
+
+//! FE8U = 0x0804C3AC
+void sub_804C3AC(u8 * src, u8 * dst, int c, int d)
+{
+    int i;
+
+    int r7 = c << 5;
+
+    for (i = 0; i < d; i++)
+    {
+        CpuFastCopy(src, dst, (r7 * 0x20) / 0x20);
+        src += 0x400;
+        dst += 0x400;
+    }
+
+    return;
+}
+
+struct SioProc85AA980
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ int unk_30;
+    /* 34 */ STRUCT_PAD(0x34, 0x58);
+    /* 58 */ int unk_58;
+    /* 5C */ u32 unk_5c;
+};
+
+extern u8 gUnknown_085B0DE8[];
+extern u8 gUnknown_085AAE0C[];
+
+extern u8 gUnknown_085B0F2C[];
+
+//! FE8U = 0x0804C3EC
+void sub_804C3EC(struct SioProc85AA980 * proc)
+{
+    int a = (proc->unk_58 % 3) * 0x140;
+    int b = (proc->unk_58 / 3) * 0x800;
+
+    Decompress(gUnknown_085B0DE8, (void *)(0x6000000 + proc->unk_5c));
+    Decompress(gUnknown_085AAE0C, gGenericBuffer);
+
+    sub_804C3AC(gGenericBuffer + (a + b), (void *)(0x06014000), 10, 2);
+
+    CallARM_FillTileRect(gBG2TilemapBuffer, gUnknown_085B0F2C, (((u16)(proc->unk_5c >> 1) >> 4)) | 0x1000);
+    BG_EnableSyncByMask(BG2_SYNC_BIT);
+
+    return;
+}
+
+extern u16 gUnknown_085AA96C[];
+
+//! FE8U = 0x0804C47C
+void sub_804C47C(void)
+{
+    PutSpriteExt(4, 20, 8, gUnknown_085AA96C, 0);
+    return;
+}
+
+extern struct ProcCmd ProcScr_085AA980[];
+
+//! FE8U = 0x0804C49C
+void NewProc085AA980(ProcPtr parent, int b, int chr)
+{
+    struct SioProc85AA980 * proc;
+
+    Proc_EndEach(ProcScr_085AA980);
+    proc = Proc_Start(ProcScr_085AA980, parent);
+
+    proc->unk_58 = b;
+    proc->unk_5c = chr;
+
+    if (chr == 0)
+    {
+        proc->unk_5c = 0x5c00;
+    }
+
+    proc->unk_2c = (proc->unk_58 % 3) * 0x140;
+    proc->unk_30 = (proc->unk_58 / 3) * 0x800;
+
+    return;
+}
+
+//! FE8U = 0x0804C4F8
+void sub_804C4F8(void)
+{
+    Proc_EndEach(ProcScr_085AA980);
+    return;
+}
+
+//! FE8U = 0x0804C508
+void sub_804C508(void)
+{
+    SetBlendConfig(1, 0x10, 4, 0);
+
+    SetBlendTargetA(0, 0, 1, 0, 0);
+    SetBlendTargetB(0, 0, 0, 1, 0);
+
+    SetWinEnable(0, 0, 0);
+
+    return;
+}
+
+//! FE8U = 0x0804C558
+void sub_804C558(void)
+{
+    SetBlendConfig(1, 0x10, 4, 0);
+
+    SetBlendTargetA(0, 0, 1, 0, 0);
+    SetBlendTargetB(0, 0, 0, 1, 0);
+
+    return;
+}
+
+//! FE8U = 0x0804C590
+void sub_804C590(void)
+{
+    SetBlendConfig(0, 0, 0, 0);
+    return;
+}
+
+extern s8 gUnk_Sio_0203DDDC;
+
+extern const u8 gUnknown_080DA0DA[];
+
+//! FE8U = 0x0804C5A4
+void sub_804C5A4(u8 idx)
+{
+    u8 hack[0x20];
+    memcpy(hack, gUnknown_080DA0DA, 0x20);
+
+    if (gUnk_Sio_0203DDDC == 0)
+    {
+        int color = hack[idx] + 0x10;
+        gPaletteBuffer[0x131] = ((color) << 10) + ((color) << 5) + (color);
+        EnablePaletteSync();
+    }
+
+    return;
+}
+
+struct SioProc85AA9C0
+{
+    /* 00 */ PROC_HEADER;
+    /* 2A */ s16 unk_2a;
+    /* 2C */ s16 unk_2c;
+    /* 2E */ u8 unk_2e;
+    /* 2F */ u8 unk_2f;
+    /* 30 */ u8 unk_30;
+    /* 32 */ s16 unk_32;
+    /* 34 */ s16 unk_34;
+    /* 36 */ u16 unk_36;
+    /* 38 */ u16 unk_38;
+    /* 3A */ s16 unk_3a;
+    /* 3C */ s16 unk_3c;
+    /* 3E */ u8 unk_3e;
+};
+
+extern u16 * gUnknown_085AA9A0[];
+extern u16 gUnknown_080DA09C[];
+extern u16 * gUnknown_085AA9B4[];
+
+//! FE8U = 0x0804C5F8
+void sub_804C5F8(struct SioProc85AA9C0 * proc)
+{
+    int oam2 = 0x000082C8;
+
+    PutSprite(4, proc->unk_2a, proc->unk_2c, gUnknown_085AA9A0[proc->unk_2f], gUnknown_080DA09C[proc->unk_2e]);
+
+    if (proc->unk_2e == 2)
+    {
+        sub_804C5A4(proc->unk_30);
+    }
+
+    proc->unk_30 = (proc->unk_30 + 1) & 0x1f;
+
+    if (proc->unk_2e == 2 && proc->unk_2f == 1)
+    {
+        proc->unk_36 += proc->unk_3a;
+        proc->unk_38 += proc->unk_3c;
+
+        if (proc->unk_3a > 4)
+        {
+            proc->unk_3a--;
+        }
+
+        if (proc->unk_3c > 4)
+        {
+            proc->unk_3c--;
+        }
+
+        if ((GetGameClock() & 3) == 0)
+        {
+            if (proc->unk_32 < 0)
+            {
+                proc->unk_32++;
+            }
+
+            if (proc->unk_34 > 0x34)
+            {
+                proc->unk_34--;
+            }
+        }
+
+        PutSprite(
+            0, 0x4b + proc->unk_2a + proc->unk_32, proc->unk_2c + 8, gObject_8x16, ((proc->unk_36 >> 5) % 6) + oam2);
+        PutSprite(
+            0, 0x49 + proc->unk_2a + proc->unk_34, proc->unk_2c + 8, gObject_8x16_HFlipped,
+            ((proc->unk_38 >> 5) % 6) + oam2);
+
+        PutSpriteExt(0, 0x50 + proc->unk_2a, proc->unk_2c + 9, gUnknown_085AA9B4[gLinkArenaSt.unk_05], 0);
+    }
+
+    return;
+}
+
+extern struct ProcCmd gUnknown_085AA9C0[];
+
+//! FE8U = 0x0804C758
+ProcPtr sub_804C758(ProcPtr parent, u8 x1, u8 y1, u8 d, u8 e)
+{
+    struct SioProc85AA9C0 * proc = Proc_Start(gUnknown_085AA9C0, parent);
+
+    proc->unk_2a = x1;
+    proc->unk_2c = y1;
+    proc->unk_2e = e;
+    proc->unk_2f = d;
+    proc->unk_32 = 0;
+    proc->unk_34 = 0x34;
+    proc->unk_38 = 0;
+    proc->unk_36 = 0;
+    proc->unk_3c = 4;
+    proc->unk_3a = 4;
+    proc->unk_3e = 0;
+    proc->unk_30 = 0;
+
+    return proc;
+}
+
+//! FE8U = 0x0804C7C8
+void sub_804C7C8(struct SioProc85AA9C0 * proc, int b, int c, int d, int e)
+{
+    proc->unk_32 = b;
+    proc->unk_34 = c;
+    proc->unk_3a = d;
+    proc->unk_3c = e;
+
+    return;
+}
+
+//! FE8U = 0x0804C7DC
+void sub_804C7DC(struct SioProc85AA9C0 * proc, s16 x, s16 y)
+{
+    proc->unk_2a = x;
+    proc->unk_2c = y;
+
+    return;
+}
+
+extern const u8 gUnknown_080DA102[];
+
+extern u16 gUnknown_085ADDE8[];
+
+//! FE8U = 0x0804C7E4
+void sub_804C7E4(void)
+{
+    u8 hack[0x20];
+    u16 * ptr = gUnknown_085ADDE8;
+    memcpy(hack, gUnknown_080DA102, 0x20);
+
+    if (gUnk_Sio_0203DDDC == 0)
+    {
+        int a = (GetGameClock() % 0x40);
+        int idx = hack[a / 2];
+
+        gPaletteBuffer[0x18E] = ptr[idx];
+        EnablePaletteSync();
+    }
+
+    return;
+}
+
+extern const u8 gUnknown_080DA0DA[];
+
+extern u16 gUnknown_085ADE48[];
+
+//! FE8U = 0x0804C83C
+void sub_804C83C(void)
+{
+    u8 hack[0x20];
+    u16 * ptr = gUnknown_085ADE48;
+    memcpy(hack, gUnknown_080DA0DA, 0x20);
+
+    if (gUnk_Sio_0203DDDC == 0)
+    {
+        int a = (GetGameClock() % 0x40);
+        int idx = hack[a / 2];
+
+        gPaletteBuffer[0x13E] = ptr[idx];
+        EnablePaletteSync();
+    }
+
+    return;
+}
+
+struct SioProc85AAA78
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ s16 unk_30[5];
+    /* 3A */ u8 unk_3a[5];
+    /* 40 */ int unk_40;
+    /* 44 */ s8 unk_44;
+    /* 45 */ STRUCT_PAD(0x45, 0x48);
+    /* 48 */ int unk_48;
+};
+
+s8 gUnk_Sio_0203DDDC;
+
+extern u16 gUnknown_085AA9D8[];
+extern u16 gUnknown_085AAA0E[];
+extern u16 Sprite_085AAA50[];
+extern u16 gUnknown_085AAA5E[];
+
+extern u16 gUnknown_080DA0FA[];
+
+extern u16 gUnknown_08A1BD40[];
+
+extern u16 * gUnknown_085AAA48[];
+
+void PutLinkArenaButtonSpriteAt(int, int);
+
+//! FE8U = 0x0804C894
+void sub_804C894(struct SioProc85AAA78 * proc)
+{
+    int i;
+    int oam2;
+
+    if (gLinkArenaSt.unk_00 == 1)
+    {
+        if (proc->unk_44 != 0)
+        {
+            oam2 = 0x400;
+        }
+        else
+        {
+            oam2 = 0xc00;
+        }
+
+        PutSprite(0, 0x58, 0x20, gUnknown_085AA9D8, 0);
+
+        for (i = 0; i < proc->unk_2c; i++)
+        {
+            PutSprite(4, proc->unk_30[i] + 6, 0x20 + i * 0x18, Sprite_085AAA50, (i & 0xf) * 0x1000 + oam2);
+
+            if (proc->unk_3a[i] != 0)
+            {
+                PutSprite(4, proc->unk_30[i] + 6, 0x20 + i * 0x18, gUnknown_085AAA5E, oam2);
+            }
+        }
+
+        if (proc->unk_40 != 0)
+        {
+            if (gUnk_Sio_0203DDDC == 0)
+            {
+                gPaletteBuffer[0x18e] = ((GetGameClock() % 0x40) / 4)[gUnknown_08A1BD40];
+                EnablePaletteSync();
+            }
+
+            if (proc->unk_40 < 0x100)
+            {
+                proc->unk_40 = proc->unk_40 + 0x10;
+            }
+
+            // clang-format off
+            SetObjAffine(
+                0,
+                Div(+COS(0) * 16, 0x100),
+                Div(-SIN(0) * 16, proc->unk_40),
+                Div(+SIN(0) * 16, 0x100),
+                Div(+COS(0) * 16, proc->unk_40)
+            );
+            // clang-format on
+
+            PutSprite(4, 0x78, 0, gUnknown_080DA0FA, 0x8000);
+        }
+        sub_804C83C();
+    }
+    else
+    {
+        PutSprite(0xb, 0x58, 0x20, gUnknown_085AA9D8, 0);
+
+        for (i = 0; i < proc->unk_2c; i++)
+        {
+            PutSprite(2, proc->unk_30[i], 0x30 + i * 0x10, gUnknown_085AAA48[proc->unk_3a[i]], 0);
+
+            if (proc->unk_3a[i] != 0)
+            {
+                if (proc->unk_30[i] < 0)
+                {
+                    proc->unk_30[i]++;
+                }
+            }
+            else if (proc->unk_30[i] > -8)
+            {
+                proc->unk_30[i]--;
+            }
+        }
+
+        sub_804C7E4();
+    }
+
+    if (gLinkArenaSt.unk_00 == 1)
+    {
+        oam2 = 0x400;
+    }
+    else
+    {
+        oam2 = 0x800;
+    }
+
+    if (proc->unk_44 != 0)
+    {
+        PutLinkArenaButtonSpriteAt(0xc0, 0x10);
+    }
+
+    if (proc->unk_48 >= 0)
+    {
+        PutSprite(4, 0x50, proc->unk_48 + 8, gUnknown_085AAA0E, oam2);
+    }
+
+    return;
+}
+
+struct SioTeamListProc
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ struct SioProc85AAA78 * unk_2c;
+    /* 30 */ ProcPtr pSioHoldProc;
+    /* 34 */ int numActiveOptions;
+    /* 38 */ int unk_38;
+    /* 3C */ int optionIdx;
+    /* 40 */ int unk_40;
+    /* 44 */ int unk_44;
+    /* 48 */ u8 unk_48;
+    /* 49 */ STRUCT_PAD(0x49, 0x4A);
+    /* 4A */ u16 yBg1;
+    /* 4C */ s8 unk_4c;
+    /* 4D */ u8 validOptions[5];
+    /* 52 */ u8 selectedOption;
+    /* 53 */ u8 selectedTeam;
+    /* 54 */ u8 unk_54;
+    /* 55 */ u8 unk_55;
+    /* 56 */ STRUCT_PAD(0x56, 0x58);
+    /* 58 */ int unk_58;
+    /* 5C */ s8 unk_5c;
+};
+
+extern struct ProcCmd gUnknown_085AAA78[];
+
+void sub_804CC14(int, int, int, int, int, ProcPtr);
+
+//! FE8U = 0x0804CAEC
+ProcPtr sub_804CAEC(struct SioTeamListProc * parent, int b, u8 * buf)
+{
+    struct SioProc85AAA78 * proc;
+    int i;
+
+    Proc_EndEach(gUnknown_085AAA78);
+    proc = Proc_Start(gUnknown_085AAA78, parent);
+
+    proc->unk_2c = b;
+    proc->unk_44 = 1;
+    proc->unk_40 = 0;
+    proc->unk_48 = -1;
+
+    for (i = 0; i < 5; i++)
+    {
+        proc->unk_3a[i] = buf[i];
+        proc->unk_30[i] = -8;
+    }
+
+    sub_804D1E0(0xe1, 0x28, parent->unk_38, 6, parent->yBg1 + 40, proc);
+    sub_804CC14(0x98, 0x28 - parent->unk_48 * 0x10, 0x88, 0x27, parent->unk_38, proc);
+
+    return proc;
+}
+
+struct SioProc85AAA90
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ int unk_30;
+    /* 34 */ int unk_34;
+    /* 38 */ int unk_38;
+    /* 3C */ int unk_3c;
+};
+
+//! FE8U = 0x0804CB94
+void sub_804CB94(struct SioProc85AAA90 * proc)
+{
+    int i;
+    int y;
+    int j;
+
+    for (i = 0; i < proc->unk_3c; i++)
+    {
+        y = proc->unk_30 + i * 0x10;
+
+        if (y >= proc->unk_38)
+        {
+            continue;
+        }
+
+        if (y <= proc->unk_34)
+        {
+            continue;
+        }
+
+        for (j = 0; j < 5; j++)
+        {
+            struct Unit * unit = GetUnit(i * 5 + j + 1);
+
+            if (unit->pCharacterData == NULL)
+            {
+                continue;
+            }
+
+            sub_8027E4C(4, proc->unk_2c + j * 0xe, y, 0x400, unit);
+        }
+    }
+
+    return;
+}
+
+extern struct ProcCmd gUnknown_085AAA90[];
+
+//! FE8U = 0x0804CC14
+void sub_804CC14(int x, int y, int upperBound, int lowerBound, int count, ProcPtr parent)
+{
+    struct SioProc85AAA90 * proc;
+
+    Proc_EndEach(gUnknown_085AAA90);
+    proc = Proc_Start(gUnknown_085AAA90, parent);
+
+    proc->unk_3c = count;
+
+    proc->unk_2c = x;
+    proc->unk_30 = y;
+
+    proc->unk_34 = lowerBound;
+    proc->unk_38 = upperBound;
+
+    return;
+}
+
+//! FE8U = 0x0804CC5C
+void sub_804CC5C(int amount)
+{
+    struct SioProc85AAA90 * proc = Proc_Find(gUnknown_085AAA90);
+    proc->unk_30 += amount;
+
+    return;
+}
+
+extern u16 gUnknown_085ADE28[];
+
+//! FE8U = 0x0804CC78
+void sub_804CC78(void)
+{
+    int r2;
+    int i;
+
+    u16 * ptr = gUnknown_085ADE28;
+
+    if (gUnk_Sio_0203DDDC == 0)
+    {
+        r2 = (GetGameClock() % 0x20);
+        r2 = r2 >> 1;
+
+        for (i = 0; i < 5; i++)
+        {
+            gPaletteBuffer[0x19B + i] = ptr[((r2 + i) & 0xf)];
+        }
+
+        EnablePaletteSync();
+    }
+
+    return;
+}
+
+struct SioProc85AAAC4
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ int unk_30;
+    /* 34 */ int unk_34;
+    /* 38 */ int unk_38;
+    /* 3C */ int unk_3c;
+    /* 40 */ int unk_40;
+    /* 44 */ int unk_44;
+};
+
+extern u16 * gUnknown_085AAAA8[];
+extern u16 * gUnknown_085AAAB0[];
+
+extern u16 gUnknown_080DA132[];
+extern u16 gUnknown_085AA9D8[];
+extern u16 Sprite_085AAA50[];
+
+//! FE8U = 0x0804CCCC
+void sub_804CCCC(struct SioProc85AAAC4 * proc)
+{
+    int i;
+
+    int x = (proc->unk_34 + proc->unk_2c) >> 1;
+    int y = (proc->unk_38 + proc->unk_30) >> 1;
+
+    proc->unk_2c = x;
+    proc->unk_30 = y;
+
+    PutSprite(2, x, y, gUnknown_085AAAA8[proc->unk_3c], 0);
+    PutSprite(2, proc->unk_40 + 0x60, 0x30, gUnknown_080DA132, 0);
+    PutSprite(2, 0x60, 0x20, gUnknown_085AA9D8, 0);
+    PutSprite(4, 0x50, 0x20, Sprite_085AAA50, 0x800);
+
+    for (i = 3; i < 5; i++)
+    {
+        if ((proc->unk_44 == i) && (i < 3))
+        {
+            PutSprite(4, 0xc4, 0x48 + i * 0x10, gUnknown_085AAAB0[i], 0x4000);
+        }
+        else
+        {
+            PutSprite(4, 0xc4, 0x48 + i * 0x10, gUnknown_085AAAB0[i], 0x8000);
+        }
+    }
+
+    sub_804CC78();
+
+    return;
+}
+
+extern struct ProcCmd Proc_085AAAC4[];
+
+//! FE8U = 0x0804CD90
+ProcPtr NewProc_085AAAC4(ProcPtr parent, int x, int y)
+{
+    struct SioProc85AAAC4 * proc;
+
+    Proc_EndEach(Proc_085AAAC4);
+    proc = Proc_Start(Proc_085AAAC4, parent);
+
+    proc->unk_34 = x;
+    proc->unk_2c = x;
+
+    proc->unk_38 = y;
+    proc->unk_30 = y;
+
+    proc->unk_3c = 0;
+    proc->unk_40 = 0;
+    proc->unk_44 = 1;
+
+    return proc;
+}
+
+// FIXME - param
+//! FE8U = 0x0804CDD0
+void sub_804CDD0(void * proc, int b, int c, int d, int e, int f)
+{
+    struct SioProc85AAAC4 * param_1 = proc;
+
+    param_1->unk_34 = b;
+    param_1->unk_38 = c;
+    param_1->unk_3c = e;
+    param_1->unk_40 = d;
+    param_1->unk_44 = f;
+
+    return;
+}
+
+struct SioProc85AAAE8
+{
+    /* 00 */ PROC_HEADER;
+    /* 2A */ s16 unk_2a;
+    /* 2C */ s16 unk_2c;
+    /* 2E */ s16 unk_2e;
+    /* 30 */ s16 unk_30;
+};
+
+extern u16 * gUnknown_085AAADC[];
+
+//! FE8U = 0x0804CDE8
+void sub_804CDE8(struct SioProc85AAAE8 * proc)
+{
+    int i;
+
+    int y1 = proc->unk_2c;
+    int y2 = proc->unk_2a;
+    int y = (y1 + y2) * 12;
+
+    proc->unk_2a = proc->unk_2c;
+
+    for (i = 0; i < 3; i++)
+    {
+        PutSprite(2, 0x20, 0x30 + i * 0x18, gUnknown_085AAADC[i], 0);
+    }
+
+    DisplayFrozenUiHand(0x20, y + 0x30);
+    DisplayUiHand(proc->unk_2e, proc->unk_30);
+
+    PutLinkArenaButtonSpriteAt(0xc0, 0x10);
+
+    return;
+}
+
+//! FE8U = 0x0804CE5C
+void sub_804CE5C(struct SioProc85AAAE8 * proc)
+{
+    int i;
+
+    for (i = 0; i < 3; i++)
+    {
+        PutSprite(2, 0x20, 0x30 + i * 0x18, gUnknown_085AAADC[i], 0);
+    }
+
+    return;
+}
+
+extern struct ProcCmd gUnknown_085AAAE8[];
+
+//! FE8U = 0x0804CE8C
+ProcPtr sub_804CE8C(ProcPtr parent)
+{
+    struct SioProc85AAAE8 * proc;
+
+    Proc_EndEach(gUnknown_085AAAE8);
+    proc = Proc_Start(gUnknown_085AAAE8, parent);
+
+    proc->unk_2a = 0;
+
+    return proc;
+}
+
+extern struct ProcCmd gUnknown_085AAB00[];
+
+//! FE8U = 0x0804CEB0
+void sub_804CEB0(void)
+{
+    Proc_Start(gUnknown_085AAB00, PROC_TREE_3);
+    return;
+}
+
+// FIXME
+//! FE8U = 0x0804CEC4
+void sub_804CEC4(ProcPtr proc, s16 b, s16 c, s16 d)
+{
+    struct SioProc85AAAE8 * param_1 = proc;
+
+    param_1->unk_2c = b;
+    param_1->unk_2e = c;
+    param_1->unk_30 = d;
+
+    return;
+}
+
+extern u16 gUnknown_085ADE28[];
+
+//! FE8U = 0x0804CECC
+void sub_804CECC(int idx)
+{
+    u16 * ptr = gUnknown_085ADE28;
+
+    if (gUnk_Sio_0203DDDC == 0)
+    {
+        gPaletteBuffer[0x16E] = ptr[idx];
+        EnablePaletteSync();
+    }
+
+    return;
+}
+
+struct SioProc85AAB18
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ int unk_30;
+    /* 34 */ STRUCT_PAD(0x34, 0x4C);
+    /* 4C */ s16 unk_4c;
+};
+
+extern s16 gUnknown_080DA1CA[];
+
+extern u16 gUnknown_080DA17A[];
+extern u16 gUnknown_080DA18E[];
+extern u16 gUnknown_080DA1A2[];
+extern u16 gUnknown_080DA1B6[];
+
+//! FE8U = 0x0804CF04
+void sub_804CF04(struct SioProc85AAB18 * proc)
+{
+    int idx;
+    int x;
+    int y;
+    int r1;
+
+    idx = proc->unk_4c * 2;
+
+    sub_804CECC(proc->unk_4c);
+
+    x = gUnknown_080DA1CA[idx + 1];
+    r1 = proc->unk_2c - x;
+
+    y = gUnknown_080DA1CA[idx + 0];
+
+    PutSprite(2, r1, proc->unk_30 - y, gUnknown_080DA17A, 0);
+    PutSprite(2, proc->unk_2c + x + 0x10, proc->unk_30 - y, gUnknown_080DA18E, 0);
+    PutSprite(2, proc->unk_2c - x, proc->unk_30 + y, gUnknown_080DA1A2, 0);
+    PutSprite(2, proc->unk_2c + x + 0x10, proc->unk_30 + y, gUnknown_080DA1B6, 0);
+
+    proc->unk_4c++;
+
+    if (proc->unk_4c == 0xf)
+    {
+        Proc_Break(proc);
+    }
+
+    return;
+}
+
+extern struct ProcCmd gUnknown_085AAB18[];
+
+//! FE8U = 0x0804CFB8
+ProcPtr sub_804CFB8(ProcPtr parent, int b, int c)
+{
+    struct SioProc85AAB18 * proc = Proc_Start(gUnknown_085AAB18, parent);
+
+    proc->unk_2c = b;
+    proc->unk_30 = c;
+    proc->unk_4c = 0;
+
+    // return proc; // BUG
+}
+
+struct SioProc85AAB48
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ int unk_30;
+    /* 34 */ int unk_34;
+    /* 38 */ int unk_38;
+    /* 3C */ u8 unk_3c;
+    /* 3D */ u8 unk_3d;
+    /* 3E */ s16 unk_3e;
+    /* 40 */ s16 unk_40;
+    /* 42 */ u16 unk_42;
+    /* 44 */ u8 unk_44[2];
+};
+
+//! FE8U = 0x0804CFE0
+void sub_804CFE0(struct SioProc85AAB48 * proc)
+{
+    proc->unk_44[1] = 0;
+    proc->unk_44[0] = 0;
+
+    proc->unk_38 = (proc->unk_34 * proc->unk_3d * 8) / proc->unk_3c;
+    proc->unk_42 = (proc->unk_34 * 0x800) / (proc->unk_3c * 16);
+
+    return;
+}
+
+extern u16 gUnknown_085AAB30[];
+extern u16 gUnknown_085AAB38[];
+extern u16 gUnknown_085AAB40[];
+
+//! FE8U = 0x0804D01C
+void sub_804D01C(struct SioProc85AAB48 * proc)
+{
+    int i;
+    int buf[2];
+
+    int r8 = proc->unk_2c;
+    int sl = proc->unk_30 + 8;
+    int sp_10 = proc->unk_38 >> 3;
+    int sp_14 = 8 - (proc->unk_38 & 7);
+    int sp_18 = (proc->unk_3e * proc->unk_42) >> 8;
+
+    if (proc->unk_3c > proc->unk_3d)
+    {
+        proc->unk_44[0]++;
+        proc->unk_44[1]++;
+
+        if (proc->unk_3e < proc->unk_40)
+        {
+            proc->unk_44[0] += 2;
+        }
+
+        if (proc->unk_3e > proc->unk_40)
+        {
+            proc->unk_44[1] += 2;
+        }
+
+        for (i = 0; i < 2; i++)
+        {
+            if (proc->unk_44[i] > 0x30)
+            {
+                proc->unk_44[i] = 0;
+            }
+
+            buf[i] = (proc->unk_44[i] / 8) % 6;
+        }
+
+        if (proc->unk_3e != 0)
+        {
+            PutSprite(3, r8, sl - 9, gUnknown_085AAB38, buf[0]);
+        }
+
+        if (((proc->unk_3e / 16) + proc->unk_3d) < proc->unk_3c)
+        {
+            PutSprite(3, r8, proc->unk_34 * 8 + sl + 1, gUnknown_085AAB30, buf[1]);
+        }
+
+        for (i = 0; i < proc->unk_34; i++)
+        {
+            PutSprite(2, r8, sl + i * 8, gUnknown_085AAB40, 1);
+        }
+
+        for (i = 0; i < sp_10; i++)
+        {
+            PutSprite(2, r8, (sl + sp_18) + i * 8, gUnknown_085AAB40, 0);
+        }
+
+        PutSprite(2, r8, (sl + sp_18) + (sp_10 * 8) - sp_14, gUnknown_085AAB40, 0);
+        PutSprite(2, r8, sl - 8, gUnknown_085AAB40, 2);
+        PutSprite(2, r8 + 0x2000, proc->unk_34 * 8 + sl - 7, gUnknown_085AAB40, 2);
+
+        proc->unk_40 = proc->unk_3e;
+    }
+
+    return;
+}
+
+extern struct ProcCmd gUnknown_085AAB48[];
+
+//! FE8U = 0x0804D1E0
+void sub_804D1E0(int a, int b, u8 c, u8 d, u8 e, ProcPtr parent)
+{
+    struct SioProc85AAB48 * proc;
+
+    Proc_EndEach(gUnknown_085AAB48);
+    proc = Proc_Start(gUnknown_085AAB48, parent);
+
+    proc->unk_2c = a;
+    proc->unk_30 = b;
+
+    proc->unk_34 = d * 2 - 2;
+
+    proc->unk_3c = c;
+    proc->unk_3d = d;
+    proc->unk_3e = e;
+    proc->unk_40 = e;
+
+    return;
+}
+
+//! FE8U = 0x0804D24C
+void sub_804D24C(u8 a, s16 b)
+{
+    struct SioProc85AAB48 * proc = Proc_Find(gUnknown_085AAB48);
+
+    if (proc == NULL)
+    {
+        return;
+    }
+
+    proc->unk_3c = a;
+    proc->unk_3e = b & 0xff;
+    proc->unk_38 = (proc->unk_34 * proc->unk_3d * 8) / proc->unk_3c;
+    proc->unk_42 = (proc->unk_34 * 0x800) / (proc->unk_3c * 16);
+
+    return;
+}

From 7e3bea842702fe66a181bdb5653f8d77e09d629b Mon Sep 17 00:00:00 2001
From: Eebit <eight_bit_hero@yahoo.ca>
Date: Mon, 24 Jun 2024 19:05:54 -0400
Subject: [PATCH 2/3] (sio_uiutils) Extract data

---
 data/const_data_D9FE4.s |  44 ----
 data/data_5AA96C.s      | 198 ---------------
 include/sio.h           |   2 +-
 ldscript.txt            |   2 +
 src/sio_uiutils.c       | 544 +++++++++++++++++++++++++++++++++++-----
 5 files changed, 489 insertions(+), 301 deletions(-)

diff --git a/data/const_data_D9FE4.s b/data/const_data_D9FE4.s
index cc25e994..5ac9877a 100644
--- a/data/const_data_D9FE4.s
+++ b/data/const_data_D9FE4.s
@@ -1,49 +1,5 @@
     .section .rodata
 
-	.global SioDefaultBgConfig
-SioDefaultBgConfig:  @ 0x080D9FE4
-	.incbin "baserom.gba", 0xD9FE4, 0xB8
-
-	.global gUnknown_080DA09C
-gUnknown_080DA09C:  @ 0x080DA09C
-	.incbin "baserom.gba", 0xDA09C, 0x3E
-
-	.global gUnknown_080DA0DA
-gUnknown_080DA0DA:  @ 0x080DA0DA
-    .incbin "baserom.gba", 0xDA0DA, 0x20
-
-	.global gUnknown_080DA0FA
-gUnknown_080DA0FA:  @ 0x080DA0FA
-	.incbin "baserom.gba", 0xDA0FA, 0x8
-
-	.global gUnknown_080DA102
-gUnknown_080DA102:  @ 0x080DA102
-    .incbin "baserom.gba", 0xDA102, 0x30
-
-	.global gUnknown_080DA132
-gUnknown_080DA132:  @ 0x080DA132
-	.incbin "baserom.gba", 0xDA132, 0x48
-
-	.global gUnknown_080DA17A
-gUnknown_080DA17A:  @ 0x080DA17A
-	.incbin "baserom.gba", 0xDA17A, 0x14
-
-	.global gUnknown_080DA18E
-gUnknown_080DA18E:  @ 0x080DA18E
-	.incbin "baserom.gba", 0xDA18E, 0x14
-
-	.global gUnknown_080DA1A2
-gUnknown_080DA1A2:  @ 0x080DA1A2
-	.incbin "baserom.gba", 0xDA1A2, 0x14
-
-	.global gUnknown_080DA1B6
-gUnknown_080DA1B6:  @ 0x080DA1B6
-	.incbin "baserom.gba", 0xDA1B6, 0x14
-
-	.global gUnknown_080DA1CA
-gUnknown_080DA1CA:  @ 0x080DA1CA
-	.incbin "baserom.gba", 0xDA1CA, 0x42
-
 	.global gUnknown_080DA20C
 gUnknown_080DA20C:  @ 0x080DA20C
 @ replacing .incbin "baserom.gba", 0x000da20c, 0x10
diff --git a/data/data_5AA96C.s b/data/data_5AA96C.s
index 88846ced..a863a9e8 100644
--- a/data/data_5AA96C.s
+++ b/data/data_5AA96C.s
@@ -1,203 +1,5 @@
     .section .data
 
-	.global gUnknown_085AA96C
-gUnknown_085AA96C:  @ 0x085AA96C
-	.incbin "baserom.gba", 0x5AA96C, 0x14
-
-	.global ProcScr_085AA980
-ProcScr_085AA980:  @ 0x085AA980
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_CALL
-        .short 0x2, 0x0
-        .word sub_804C3EC
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804C47C
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AA9A0
-gUnknown_085AA9A0:  @ 0x085AA9A0
-@ replacing .incbin "baserom.gba", 0x005aa9a0, 0x14
-.4byte SioDefaultBgConfig + 0x18
-.4byte SioDefaultBgConfig + 0x38
-.4byte SioDefaultBgConfig + 0x58
-.4byte SioDefaultBgConfig + 0x78
-.4byte SioDefaultBgConfig + 0x98
-
-	.global gUnknown_085AA9B4
-gUnknown_085AA9B4:  @ 0x085AA9B4
-@ replacing .incbin "baserom.gba", 0x005aa9b4, 0xc
-.4byte gUnknown_080DA09C + 0x8
-.4byte gUnknown_080DA09C + 0x16
-.4byte gUnknown_080DA09C + 0x2a
-
-	.global gUnknown_085AA9C0
-gUnknown_085AA9C0:  @ 0x085AA9C0
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804C5F8
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AA9D8
-gUnknown_085AA9D8:  @ 0x085AA9D8
-	.incbin "baserom.gba", 0x5AA9D8, 0x36
-
-	.global gUnknown_085AAA0E
-gUnknown_085AAA0E:  @ 0x085AAA0E
-	.incbin "baserom.gba", 0x5AAA0E, 0x3A
-
-	.global gUnknown_085AAA48
-gUnknown_085AAA48:  @ 0x085AAA48
-@ replacing .incbin "baserom.gba", 0x005aaa48, 0x8
-.4byte gUnknown_085AA9D8 + 0xe
-.4byte gUnknown_085AA9D8 + 0x22
-
-	.global Sprite_085AAA50
-Sprite_085AAA50:  @ 0x085AAA50
-	.incbin "baserom.gba", 0x5AAA50, 0xE
-
-	.global gUnknown_085AAA5E
-gUnknown_085AAA5E:  @ 0x085AAA5E
-	.incbin "baserom.gba", 0x5AAA5E, 0x1A
-
-	.global gUnknown_085AAA78
-gUnknown_085AAA78:  @ 0x085AAA78
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804C894
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAA90
-gUnknown_085AAA90:  @ 0x085AAA90
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804CB94
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAAA8
-gUnknown_085AAAA8:  @ 0x085AAAA8
-@ replacing .incbin "baserom.gba", 0x005aaaa8, 0x8
-.4byte gUnknown_080DA102 + 0x20
-.4byte gUnknown_080DA102 + 0x28
-
-	.global gUnknown_085AAAB0
-gUnknown_085AAAB0:  @ 0x085AAAB0
-@ replacing .incbin "baserom.gba", 0x005aaab0, 0x14
-.4byte gUnknown_080DA132 + 0x20
-.4byte gUnknown_080DA132 + 0x18
-.4byte gUnknown_080DA132 + 0x28
-.4byte gUnknown_080DA132 + 0x10
-.4byte gUnknown_080DA132 + 0x8
-
-	.global Proc_085AAAC4
-Proc_085AAAC4:  @ 0x085AAAC4
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804CCCC
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAADC
-gUnknown_085AAADC:  @ 0x085AAADC
-@ replacing .incbin "baserom.gba", 0x005aaadc, 0xc
-.4byte gUnknown_080DA132 + 0x30
-.4byte gUnknown_080DA132 + 0x38
-.4byte gUnknown_080DA132 + 0x40
-
-	.global gUnknown_085AAAE8
-gUnknown_085AAAE8:  @ 0x085AAAE8
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804CDE8
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAB00
-gUnknown_085AAB00:  @ 0x085AAB00
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804CE5C
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAB18
-gUnknown_085AAB18:  @ 0x085AAB18
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804CF04
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
-
-	.global gUnknown_085AAB30
-gUnknown_085AAB30:  @ 0x085AAB30
-	.incbin "baserom.gba", 0x5AAB30, 0x8
-
-	.global gUnknown_085AAB38
-gUnknown_085AAB38:  @ 0x085AAB38
-	.incbin "baserom.gba", 0x5AAB38, 0x8
-
-	.global gUnknown_085AAB40
-gUnknown_085AAB40:  @ 0x085AAB40
-	.incbin "baserom.gba", 0x5AAB40, 0x8
-
-	.global gUnknown_085AAB48
-gUnknown_085AAB48:  @ 0x085AAB48
-        @ PROC_YIELD
-        .short 0xe, 0x0
-        .word 0x0
-        @ PROC_CALL
-        .short 0x2, 0x0
-        .word sub_804CFE0
-        @ PROC_REPEAT
-        .short 0x3, 0x0
-        .word sub_804D01C
-        @ PROC_END
-        .short 0x0, 0x0
-        .word 0x0
-
 	.global gUnknown_085AAB68
 gUnknown_085AAB68:  @ 0x085AAB68
         @ PROC_CALL
diff --git a/include/sio.h b/include/sio.h
index 218f331a..66eea762 100644
--- a/include/sio.h
+++ b/include/sio.h
@@ -443,7 +443,7 @@ void StartLinkArenaMUDeathFade(struct MUProc *);
 // ??? SioWarpFx_AwaitSioWarp(???);
 ProcPtr StartSioWarpFx(struct Unit *, struct MUProc *, int, int, int, int, ProcPtr);
 // ??? sub_804C260(???);
-// ??? PutLinkArenaButtonSpriteAt(???);
+void PutLinkArenaButtonSpriteAt(int, int);
 // ??? LAButtonSprites_Loop(???);
 void StartLinkArenaButtonSpriteDraw(int, int, ProcPtr);
 // ??? EndLinkArenaButtonSpriteDraw(???);
diff --git a/ldscript.txt b/ldscript.txt
index 96af4275..2b792059 100644
--- a/ldscript.txt
+++ b/ldscript.txt
@@ -722,6 +722,7 @@ SECTIONS
         . = ALIGN(4); src/sio_battlemap.o(.rodata);
         . = ALIGN(4); data/const_data_D9F18.o(.rodata);
         . = ALIGN(4); src/sio_mu.o(.rodata);
+        . = ALIGN(4); src/sio_uiutils.o(.rodata);
         . = ALIGN(4); data/const_data_D9FE4.o(.rodata);
         . = ALIGN(4); src/uiutils.o(.rodata);
         . = ALIGN(4); src/uimenu.o(.rodata);
@@ -972,6 +973,7 @@ SECTIONS
         . = ALIGN(4); data/data_5A9F48.o(.data);
         . = ALIGN(4); src/sio_804B920.o(.data);
         . = ALIGN(4); src/sio_mu.o(.data);
+        . = ALIGN(4); src/sio_uiutils.o(.data);
         . = ALIGN(4); data/data_5AA96C.o(.data);
         . = ALIGN(4); src/uiutils.o(.data);
         . = ALIGN(4); src/uimenu.o(.data);
diff --git a/src/sio_uiutils.c b/src/sio_uiutils.c
index 81ae3fd9..a1c722b9 100644
--- a/src/sio_uiutils.c
+++ b/src/sio_uiutils.c
@@ -16,15 +16,22 @@
  * the Link Arena menus.
  */
 
-extern const u16 SioDefaultBgConfig[];
+extern s8 gUnk_Sio_0203DDDC;
 
 //! FE8U = 0x0804C33C
 void InitSioBG(void)
 {
-    u16 hack[12];
-    memcpy(hack, SioDefaultBgConfig, 0x18);
+    // clang-format off
+    u16 SioDefaultBgConfig[] =
+    {
+        0x0000, 0x6000, 0x0000,
+        0x0000, 0x6800, 0x0000,
+        0x0000, 0x7000, 0x0000,
+        0x8000, 0x7800, 0x0000,
+    };
+    // clang-format on
 
-    SetupBackgrounds(hack);
+    SetupBackgrounds(SioDefaultBgConfig);
 
     gLCDControlBuffer.bg0cnt.priority = 0;
     gLCDControlBuffer.bg1cnt.priority = 1;
@@ -105,7 +112,17 @@ void sub_804C3EC(struct SioProc85AA980 * proc)
     return;
 }
 
-extern u16 gUnknown_085AA96C[];
+// clang-format off
+
+u16 CONST_DATA gUnknown_085AA96C[] =
+{
+    3,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x200) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16 + OAM1_X(32), OAM2_CHR(0x204) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16 + OAM1_X(64), OAM2_CHR(0x208) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+// clang-format on
 
 //! FE8U = 0x0804C47C
 void sub_804C47C(void)
@@ -114,7 +131,18 @@ void sub_804C47C(void)
     return;
 }
 
-extern struct ProcCmd ProcScr_085AA980[];
+// clang-format off
+
+struct ProcCmd CONST_DATA ProcScr_085AA980[] =
+{
+    PROC_YIELD,
+    PROC_CALL(sub_804C3EC),
+    PROC_REPEAT(sub_804C47C),
+
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804C49C
 void NewProc085AA980(ProcPtr parent, int b, int chr)
@@ -176,19 +204,123 @@ void sub_804C590(void)
     return;
 }
 
-extern s8 gUnk_Sio_0203DDDC;
+// clang-format off
+
+const u16 Sprite_080D9FFC[] =
+{
+    5,
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x240),
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(40), OAM2_CHR(0x244),
+    OAM0_SHAPE_16x16 + OAM0_Y(8), OAM1_SIZE_16x16 + OAM1_X(72), OAM2_CHR(0x248),
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x294),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
+};
+
+const u16 Sprite_080DA01C[] =
+{
+    5,
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x24A),
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(40), OAM2_CHR(0x24E),
+    OAM0_SHAPE_16x16 + OAM0_Y(8), OAM1_SIZE_16x16 + OAM1_X(72), OAM2_CHR(0x252),
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x294),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
+};
+
+const u16 Sprite_080DA03C[] =
+{
+    5,
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x254),
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(40), OAM2_CHR(0x258),
+    OAM0_SHAPE_16x16 + OAM0_Y(8), OAM1_SIZE_16x16 + OAM1_X(72), OAM2_CHR(0x25C),
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x294),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
+};
+
+const u16 Sprite_080DA05C[] =
+{
+    5,
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x280),
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(40), OAM2_CHR(0x284),
+    OAM0_SHAPE_16x16 + OAM0_Y(8), OAM1_SIZE_16x16 + OAM1_X(72), OAM2_CHR(0x288),
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x294),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
+};
+
+const u16 Sprite_080DA07C[] =
+{
+    5,
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x28A),
+    OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(40), OAM2_CHR(0x28E),
+    OAM0_SHAPE_16x16 + OAM0_Y(8), OAM1_SIZE_16x16 + OAM1_X(72), OAM2_CHR(0x292),
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x294),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
+};
+
+const u16 * CONST_DATA gUnknown_085AA9A0[] =
+{
+    Sprite_080D9FFC,
+    Sprite_080DA01C,
+    Sprite_080DA03C,
+    Sprite_080DA05C,
+    Sprite_080DA07C,
+};
+
+const u16 gUnknown_080DA09C[] =
+{
+    OAM2_LAYER(1) + OAM2_PAL(5),
+    OAM2_LAYER(1) + OAM2_PAL(4),
+    OAM2_PAL(3),
+    OAM2_PAL(4),
+};
+
+const u16 Sprite_080DA0A4[] =
+{
+    2,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16 + OAM1_X(32), OAM2_CHR(0x2C4) + OAM2_PAL(4),
+};
+
+const u16 Sprite_080DA0B2[] =
+{
+    3,
+    OAM0_SHAPE_8x16, OAM1_SIZE_8x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
+    OAM0_SHAPE_8x16, OAM1_SIZE_8x16 + OAM1_X(8), OAM2_CHR(0x2C6) + OAM2_PAL(4),
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16 + OAM1_X(16), OAM2_CHR(0x2C2) + OAM2_PAL(4),
+};
+
+const u16 Sprite_080DA0C6[] =
+{
+    3,
+    OAM0_SHAPE_8x16, OAM1_SIZE_8x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
+    OAM0_SHAPE_8x16, OAM1_SIZE_8x16 + OAM1_X(8), OAM2_CHR(0x2C7) + OAM2_PAL(4),
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16 + OAM1_X(16), OAM2_CHR(0x2C2) + OAM2_PAL(4),
+};
+
+const u16 * CONST_DATA gUnknown_085AA9B4[] =
+{
+    Sprite_080DA0A4,
+    Sprite_080DA0B2,
+    Sprite_080DA0C6,
+};
 
-extern const u8 gUnknown_080DA0DA[];
+// clang-format on
 
 //! FE8U = 0x0804C5A4
 void sub_804C5A4(u8 idx)
 {
-    u8 hack[0x20];
-    memcpy(hack, gUnknown_080DA0DA, 0x20);
+    // clang-format off
+    const u8 gUnknown_080DA0DA[] =
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+        0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
+        0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+    };
+    // clang-format on
 
     if (gUnk_Sio_0203DDDC == 0)
     {
-        int color = hack[idx] + 0x10;
+        int color = gUnknown_080DA0DA[idx] + 0x10;
         gPaletteBuffer[0x131] = ((color) << 10) + ((color) << 5) + (color);
         EnablePaletteSync();
     }
@@ -213,14 +345,10 @@ struct SioProc85AA9C0
     /* 3E */ u8 unk_3e;
 };
 
-extern u16 * gUnknown_085AA9A0[];
-extern u16 gUnknown_080DA09C[];
-extern u16 * gUnknown_085AA9B4[];
-
 //! FE8U = 0x0804C5F8
 void sub_804C5F8(struct SioProc85AA9C0 * proc)
 {
-    int oam2 = 0x000082C8;
+    int oam2 = OAM2_CHR(0x2C8) + OAM2_PAL(8);
 
     PutSprite(4, proc->unk_2a, proc->unk_2c, gUnknown_085AA9A0[proc->unk_2f], gUnknown_080DA09C[proc->unk_2e]);
 
@@ -271,7 +399,16 @@ void sub_804C5F8(struct SioProc85AA9C0 * proc)
     return;
 }
 
-extern struct ProcCmd gUnknown_085AA9C0[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AA9C0[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804C5F8),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804C758
 ProcPtr sub_804C758(ProcPtr parent, u8 x1, u8 y1, u8 d, u8 e)
@@ -314,21 +451,37 @@ void sub_804C7DC(struct SioProc85AA9C0 * proc, s16 x, s16 y)
     return;
 }
 
-extern const u8 gUnknown_080DA102[];
-
 extern u16 gUnknown_085ADDE8[];
 
+// clang-format off
+
+const u16 gUnknown_080DA0FA[] =
+{
+    1,
+    OAM0_SHAPE_64x32 + OAM0_AFFINE_ENABLE, OAM1_SIZE_64x32, OAM2_CHR(0x300) + OAM2_LAYER(1),
+};
+
+// clang-format on
+
 //! FE8U = 0x0804C7E4
 void sub_804C7E4(void)
 {
-    u8 hack[0x20];
     u16 * ptr = gUnknown_085ADDE8;
-    memcpy(hack, gUnknown_080DA102, 0x20);
+
+    // clang-format off
+    const u8 gUnknown_080DA102[] =
+    {
+        0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
+        0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+    };
+    // clang-format on
 
     if (gUnk_Sio_0203DDDC == 0)
     {
         int a = (GetGameClock() % 0x40);
-        int idx = hack[a / 2];
+        int idx = gUnknown_080DA102[a / 2];
 
         gPaletteBuffer[0x18E] = ptr[idx];
         EnablePaletteSync();
@@ -337,21 +490,27 @@ void sub_804C7E4(void)
     return;
 }
 
-extern const u8 gUnknown_080DA0DA[];
-
 extern u16 gUnknown_085ADE48[];
 
 //! FE8U = 0x0804C83C
 void sub_804C83C(void)
 {
-    u8 hack[0x20];
     u16 * ptr = gUnknown_085ADE48;
-    memcpy(hack, gUnknown_080DA0DA, 0x20);
+
+    // clang-format off
+    const u8 gUnknown_080DA0DA[] =
+    {
+        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+        0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
+        0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+    };
+    // clang-format on
 
     if (gUnk_Sio_0203DDDC == 0)
     {
         int a = (GetGameClock() % 0x40);
-        int idx = hack[a / 2];
+        int idx = gUnknown_080DA0DA[a / 2];
 
         gPaletteBuffer[0x13E] = ptr[idx];
         EnablePaletteSync();
@@ -372,20 +531,70 @@ struct SioProc85AAA78
     /* 48 */ int unk_48;
 };
 
-s8 gUnk_Sio_0203DDDC;
+// clang-format off
 
-extern u16 gUnknown_085AA9D8[];
-extern u16 gUnknown_085AAA0E[];
-extern u16 Sprite_085AAA50[];
-extern u16 gUnknown_085AAA5E[];
+u16 CONST_DATA gUnknown_085AA9D8[] =
+{
+    2,
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x2B8) + OAM2_PAL(8),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x2BC) + OAM2_PAL(8),
+};
 
-extern u16 gUnknown_080DA0FA[];
+u16 CONST_DATA Sprite_085AA9E6[] =
+{
+    3,
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x27B) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x27B) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8 + OAM1_X(64), OAM2_CHR(0x27F) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
 
-extern u16 gUnknown_08A1BD40[];
+u16 CONST_DATA Sprite_085AA9FA[] =
+{
+    3,
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x29B) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x29B) + OAM2_LAYER(1) + OAM2_PAL(8),
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8 + OAM1_X(64), OAM2_CHR(0x29F) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+u16 CONST_DATA gUnknown_085AAA0E[] =
+{
+    9,
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8, OAM2_CHR(0x277) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(16), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(32), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(48), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(64), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(80), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(96), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(112), OAM2_CHR(0x278) + OAM2_PAL(3),
+    OAM0_SHAPE_16x8, OAM1_SIZE_16x8 + OAM1_X(128), OAM2_CHR(0x279) + OAM2_PAL(3),
+};
+
+u16 * CONST_DATA gUnknown_085AAA48[] =
+{
+    Sprite_085AA9E6,
+    Sprite_085AA9FA,
+};
+
+u16 CONST_DATA Sprite_085AAA50[] =
+{
+    2,
+    OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x240) + OAM2_PAL(3),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x248) + OAM2_PAL(3),
+};
+
+u16 CONST_DATA gUnknown_085AAA5E[] =
+{
+    4,
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32, OAM2_CHR(0x24C) + OAM2_PAL(3),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x290) + OAM2_PAL(3),
+    OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x2AD) + OAM2_PAL(3),
+    OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64) + OAM1_HFLIP, OAM2_CHR(0x24C) + OAM2_PAL(3),
+};
 
-extern u16 * gUnknown_085AAA48[];
+// clang-format on
 
-void PutLinkArenaButtonSpriteAt(int, int);
+extern u16 gUnknown_08A1BD40[];
 
 //! FE8U = 0x0804C894
 void sub_804C894(struct SioProc85AAA78 * proc)
@@ -513,7 +722,16 @@ struct SioTeamListProc
     /* 5C */ s8 unk_5c;
 };
 
-extern struct ProcCmd gUnknown_085AAA78[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAA78[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804C894),
+    PROC_END,
+};
+
+// clang-format on
 
 void sub_804CC14(int, int, int, int, int, ProcPtr);
 
@@ -583,14 +801,23 @@ void sub_804CB94(struct SioProc85AAA90 * proc)
                 continue;
             }
 
-            sub_8027E4C(4, proc->unk_2c + j * 0xe, y, 0x400, unit);
+            sub_8027E4C(4, proc->unk_2c + j * 0xe, y, OAM2_LAYER(1), unit);
         }
     }
 
     return;
 }
 
-extern struct ProcCmd gUnknown_085AAA90[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAA90[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804CB94),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CC14
 void sub_804CC14(int x, int y, int upperBound, int lowerBound, int count, ProcPtr parent)
@@ -658,12 +885,72 @@ struct SioProc85AAAC4
     /* 44 */ int unk_44;
 };
 
-extern u16 * gUnknown_085AAAA8[];
-extern u16 * gUnknown_085AAAB0[];
+// clang-format off
 
-extern u16 gUnknown_080DA132[];
-extern u16 gUnknown_085AA9D8[];
-extern u16 Sprite_085AAA50[];
+const u16 Sprite_080DA122[] =
+{
+    1,
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x251) + OAM2_LAYER(1) + OAM2_PAL(9),
+};
+
+const u16 Sprite_080DA12A[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x253) + OAM2_LAYER(1) + OAM2_PAL(9),
+};
+
+const u16 * CONST_DATA gUnknown_085AAAA8[] =
+{
+    Sprite_080DA122,
+    Sprite_080DA12A,
+};
+
+const u16 gUnknown_080DA132[] =
+{
+    1,
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x29A) + OAM2_LAYER(2) + OAM2_PAL(9),
+};
+
+const u16 Sprite_080DA13A[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C0) + OAM2_LAYER(1),
+};
+
+const u16 Sprite_080DA142[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C4) + OAM2_LAYER(1),
+};
+
+const u16 Sprite_080DA14A[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C8) + OAM2_LAYER(1),
+};
+
+const u16 Sprite_080DA152[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2CC) + OAM2_LAYER(1),
+};
+
+const u16 Sprite_080DA15A[] =
+{
+    1,
+    OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2D0) + OAM2_LAYER(1),
+};
+
+const u16 * CONST_DATA gUnknown_085AAAB0[] =
+{
+    Sprite_080DA152,
+    Sprite_080DA14A,
+    Sprite_080DA15A,
+    Sprite_080DA142,
+    Sprite_080DA13A,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CCCC
 void sub_804CCCC(struct SioProc85AAAC4 * proc)
@@ -698,7 +985,16 @@ void sub_804CCCC(struct SioProc85AAAC4 * proc)
     return;
 }
 
-extern struct ProcCmd Proc_085AAAC4[];
+// clang-format off
+
+struct ProcCmd CONST_DATA Proc_085AAAC4[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804CCCC),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CD90
 ProcPtr NewProc_085AAAC4(ProcPtr parent, int x, int y)
@@ -745,7 +1041,34 @@ struct SioProc85AAAE8
     /* 30 */ s16 unk_30;
 };
 
-extern u16 * gUnknown_085AAADC[];
+// clang-format off
+
+const u16 Sprite_080DA162[] =
+{
+    1,
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D4) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+const u16 Sprite_080DA16A[] =
+{
+    1,
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D6) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+const u16 Sprite_080DA172[] =
+{
+    1,
+    OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D8) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+const u16 * CONST_DATA gUnknown_085AAADC[] =
+{
+    Sprite_080DA162,
+    Sprite_080DA16A,
+    Sprite_080DA172,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CDE8
 void sub_804CDE8(struct SioProc85AAAE8 * proc)
@@ -784,7 +1107,16 @@ void sub_804CE5C(struct SioProc85AAAE8 * proc)
     return;
 }
 
-extern struct ProcCmd gUnknown_085AAAE8[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAAE8[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804CDE8),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CE8C
 ProcPtr sub_804CE8C(ProcPtr parent)
@@ -799,7 +1131,16 @@ ProcPtr sub_804CE8C(ProcPtr parent)
     return proc;
 }
 
-extern struct ProcCmd gUnknown_085AAB00[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAB00[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804CE5C),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CEB0
 void sub_804CEB0(void)
@@ -846,12 +1187,61 @@ struct SioProc85AAB18
     /* 4C */ s16 unk_4c;
 };
 
-extern s16 gUnknown_080DA1CA[];
+// clang-format off
+
+const u16 gUnknown_080DA17A[] =
+{
+    3,
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x2CE) + OAM2_PAL(6),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(32), OAM2_CHR(0x2CF) + OAM2_PAL(6),
+    OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16, OAM2_CHR(0x2D3) + OAM2_PAL(6),
+};
+
+const u16 gUnknown_080DA18E[] =
+{
+    3,
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(16) + OAM1_HFLIP, OAM2_CHR(0x2CF) + OAM2_PAL(6),
+    OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(48) + OAM1_HFLIP, OAM2_CHR(0x2CE) + OAM2_PAL(6),
+    OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16 + OAM1_X(72) + OAM1_HFLIP, OAM2_CHR(0x2D3) + OAM2_PAL(6),
+};
+
+const u16 gUnknown_080DA1A2[] =
+{
+    3,
+    OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_VFLIP, OAM2_CHR(0x2CE) + OAM2_PAL(6),
+    OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_X(32) + OAM1_VFLIP, OAM2_CHR(0x2CF) + OAM2_PAL(6),
+    OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16 + OAM1_VFLIP, OAM2_CHR(0x2D3) + OAM2_PAL(6),
+};
+
+const u16 gUnknown_080DA1B6[] =
+{
+    3,
+    OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_X(16) + OAM1_HFLIP + OAM1_VFLIP, OAM2_CHR(0x2CF) + OAM2_PAL(6),
+    OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_X(48) + OAM1_HFLIP + OAM1_VFLIP, OAM2_CHR(0x2CE) + OAM2_PAL(6),
+    OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16 + OAM1_X(72) + OAM1_HFLIP + OAM1_VFLIP, OAM2_CHR(0x2D3) + OAM2_PAL(6),
+};
+
+const s16 gUnknown_080DA1CA[] =
+{
+    0x0002, 0x0003,
+    0x0002, 0x0006,
+    0x0006, 0x0009,
+    0x0008, 0x000C,
+    0x0007, 0x000B,
+    0x0007, 0x000B,
+    0x0006, 0x000A,
+    0x0006, 0x0009,
+    0x0005, 0x0008,
+    0x0005, 0x0007,
+    0x0004, 0x0006,
+    0x0004, 0x0005,
+    0x0003, 0x0004,
+    0x0002, 0x0003,
+    0x0001, 0x0001,
+    0x0000, 0x0000,
+};
 
-extern u16 gUnknown_080DA17A[];
-extern u16 gUnknown_080DA18E[];
-extern u16 gUnknown_080DA1A2[];
-extern u16 gUnknown_080DA1B6[];
+// clang-format on
 
 //! FE8U = 0x0804CF04
 void sub_804CF04(struct SioProc85AAB18 * proc)
@@ -885,7 +1275,16 @@ void sub_804CF04(struct SioProc85AAB18 * proc)
     return;
 }
 
-extern struct ProcCmd gUnknown_085AAB18[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAB18[] =
+{
+    PROC_YIELD,
+    PROC_REPEAT(sub_804CF04),
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804CFB8
 ProcPtr sub_804CFB8(ProcPtr parent, int b, int c)
@@ -926,9 +1325,27 @@ void sub_804CFE0(struct SioProc85AAB48 * proc)
     return;
 }
 
-extern u16 gUnknown_085AAB30[];
-extern u16 gUnknown_085AAB38[];
-extern u16 gUnknown_085AAB40[];
+// clang-format off
+
+u16 CONST_DATA gUnknown_085AAB30[] =
+{
+    1,
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x257) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+u16 CONST_DATA gUnknown_085AAB38[] =
+{
+    1,
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8 + OAM1_VFLIP, OAM2_CHR(0x257) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+u16 CONST_DATA gUnknown_085AAB40[] =
+{
+    1,
+    OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x25D) + OAM2_LAYER(1) + OAM2_PAL(8),
+};
+
+// clang-format on
 
 //! FE8U = 0x0804D01C
 void sub_804D01C(struct SioProc85AAB48 * proc)
@@ -997,7 +1414,18 @@ void sub_804D01C(struct SioProc85AAB48 * proc)
     return;
 }
 
-extern struct ProcCmd gUnknown_085AAB48[];
+// clang-format off
+
+struct ProcCmd CONST_DATA gUnknown_085AAB48[] =
+{
+    PROC_YIELD,
+    PROC_CALL(sub_804CFE0),
+    PROC_REPEAT(sub_804D01C),
+
+    PROC_END,
+};
+
+// clang-format on
 
 //! FE8U = 0x0804D1E0
 void sub_804D1E0(int a, int b, u8 c, u8 d, u8 e, ProcPtr parent)

From 9d13670932c7fe83e8311d9673d4bb300e364e06 Mon Sep 17 00:00:00 2001
From: Eebit <eight_bit_hero@yahoo.ca>
Date: Mon, 24 Jun 2024 22:45:50 -0400
Subject: [PATCH 3/3] (sio_uiutils) Cleanup and renames

---
 asm/code_sio.s         |   8 +-
 asm/code_sio_8048260.s |   4 +-
 data/data_5A92E0.s     |   2 +-
 include/sio.h          | 122 +++++---
 include/variables.h    |  40 +--
 src/sio_804B920.c      |   4 +-
 src/sio_event.c        |   2 +-
 src/sio_menu.c         |  12 +-
 src/sio_postbattle.c   |   4 +-
 src/sio_result.c       |  16 +-
 src/sio_rulesettings.c |   8 +-
 src/sio_tactician.c    |   6 +-
 src/sio_teamlist.c     |  62 +---
 src/sio_uiutils.c      | 643 +++++++++++++++++++----------------------
 14 files changed, 448 insertions(+), 485 deletions(-)

diff --git a/asm/code_sio.s b/asm/code_sio.s
index 05049a95..b61daac7 100644
--- a/asm/code_sio.s
+++ b/asm/code_sio.s
@@ -687,7 +687,7 @@ _08045E46:
 	adds r1, r1, r2
 	ldrb r1, [r1]
 	movs r2, #0
-	bl NewProc085AA980
+	bl StartLinkArenaTitleBanner
 	bl sub_804C508
 	ldr r0, [r6, #0x30]
 	movs r1, #0xe9
@@ -1912,7 +1912,7 @@ sub_8046838: @ 0x08046838
 	bl SetTextFont
 	bl ResetTextFont
 	bl sub_8043164
-	bl sub_804CEB0
+	bl StartRuleSettingSpriteDrawStatic
 	add r0, sp, #4
 	bl LoadLinkArenaRuleSettings
 	movs r0, #1
@@ -1973,7 +1973,7 @@ _080468D4:
 	ldrb r1, [r0]
 	mov r0, r9
 	movs r2, #0
-	bl NewProc085AA980
+	bl StartLinkArenaTitleBanner
 	bl sub_804C508
 	ldr r0, _080469A8  @ 0x0000074B
 	movs r1, #1
@@ -2334,7 +2334,7 @@ _08046BB0:
 	adds r0, r7, #0
 	movs r1, #1
 	movs r2, #0
-	bl NewProc085AA980
+	bl StartLinkArenaTitleBanner
 	bl sub_804C508
 	movs r0, #0xf
 	bl BG_EnableSyncByMask
diff --git a/asm/code_sio_8048260.s b/asm/code_sio_8048260.s
index 4dbc5536..98889383 100644
--- a/asm/code_sio_8048260.s
+++ b/asm/code_sio_8048260.s
@@ -268,7 +268,7 @@ _0804D494:
 	adds r0, r0, r3
 	str r0, [sp]
 	movs r0, #4
-	ldr r3, _0804D648  @ Sprite_085AAA50
+	ldr r3, _0804D648  @ Sprite_LinkArena_NameBanner
 	bl PutSprite
 	ldr r4, _0804D64C  @ gSinLookup+0x80
 	movs r1, #0
@@ -464,7 +464,7 @@ _0804D636:
 	pop {r0}
 	bx r0
 	.align 2, 0
-_0804D648: .4byte Sprite_085AAA50
+_0804D648: .4byte Sprite_LinkArena_NameBanner
 _0804D64C: .4byte gSinLookup+0x80
 _0804D650: .4byte gSinLookup
 _0804D654: .4byte 0x0000014F
diff --git a/data/data_5A92E0.s b/data/data_5A92E0.s
index 08e3882d..e0ebcbee 100644
--- a/data/data_5A92E0.s
+++ b/data/data_5A92E0.s
@@ -217,7 +217,7 @@ ProcScr_SIOBAT:  @ 0x085A9888
         .word 0x0
         @ PROC_END_EACH
         .short 0x9, 0x0
-        .word gUnknown_085AAB00
+        .word ProcScr_RuleSettingSpriteDraw_Static
         @ PROC_CALL
         .short 0x2, 0x0
         .word nullsub_13
diff --git a/include/sio.h b/include/sio.h
index 66eea762..e39b34ac 100644
--- a/include/sio.h
+++ b/include/sio.h
@@ -134,6 +134,45 @@ void SioPlaySoundEffect(int);
 // ??? sub_8043244(???);
 bool IsKeyInputSequenceComplete(const u16 * list);
 // ??? sub_80432F4(???);
+
+/* sio_teamlist.c */
+
+struct SioProc85AAA78
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ int unk_2c;
+    /* 30 */ s16 unk_30[5];
+    /* 3A */ u8 unk_3a[5];
+    /* 40 */ int unk_40;
+    /* 44 */ s8 unk_44;
+    /* 45 */ STRUCT_PAD(0x45, 0x48);
+    /* 48 */ int unk_48;
+};
+
+struct SioTeamListProc
+{
+    /* 00 */ PROC_HEADER;
+    /* 2C */ struct SioProc85AAA78 * unk_2c;
+    /* 30 */ ProcPtr pSioHoldProc;
+    /* 34 */ int numActiveOptions;
+    /* 38 */ int unk_38;
+    /* 3C */ int optionIdx;
+    /* 40 */ int unk_40;
+    /* 44 */ int unk_44;
+    /* 48 */ u8 unk_48;
+    /* 49 */ STRUCT_PAD(0x49, 0x4A);
+    /* 4A */ u16 yBg1;
+    /* 4C */ s8 unk_4c;
+    /* 4D */ u8 validOptions[5];
+    /* 52 */ u8 selectedOption;
+    /* 53 */ u8 selectedTeam;
+    /* 54 */ u8 unk_54;
+    /* 55 */ u8 unk_55;
+    /* 56 */ STRUCT_PAD(0x56, 0x58);
+    /* 58 */ int unk_58;
+    /* 5C */ s8 unk_5c;
+};
+
 // ??? StartLinkArenaTeamList(???);
 // ??? SioTeamList_Init(???);
 // ??? CanBuildNewLinkArenaTeam(???);
@@ -244,18 +283,27 @@ void DrawLinkArenaModeIcon(u16 *, u32);
 // ??? SioRuleSettings_Init(???);
 // ??? SioRuleSettings_Loop_Main(???);
 
-struct Proc85AA9C0
+struct SioProc85AA9C0
 {
     /* 00 */ PROC_HEADER;
-    /* 2A */ s16 unk_2a;
-    /* 2C */ s16 unk_2c;
-    /* 2E */ s8 unk_2e;
+    /* 2A */ s16 xBase;
+    /* 2C */ s16 yBase;
+    /* 2E */ u8 unk_2e;
+    /* 2F */ u8 unk_2f;
+    /* 30 */ u8 unk_30;
+    /* 32 */ s16 unk_32;
+    /* 34 */ s16 unk_34;
+    /* 36 */ u16 unk_36;
+    /* 38 */ u16 unk_38;
+    /* 3A */ s16 unk_3a;
+    /* 3C */ s16 unk_3c;
+    /* 3E */ u8 unk_3e;
 };
 
 struct SioMenuProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2C */ struct Proc85AA9C0 * unk_2c[5];
+    /* 2C */ struct SioProc85AA9C0 * unk_2c[5];
     /* 40 */ u8 unk_40[4];
     /* 44 */ s8 unk_44;
     /* 48 */ int unk_48;
@@ -452,9 +500,9 @@ void sub_804C3A0(int, int);
 void sub_804C3A4(int);
 void nullsub_13(void);
 // ??? sub_804C3AC(???);
-// ??? sub_804C3EC(???);
-// ??? sub_804C47C(???);
-void NewProc085AA980(ProcPtr parent, int, int);
+// ??? LATitleBanner_Init(???);
+// ??? LATitleBanner_Loop(???);
+void StartLinkArenaTitleBanner(ProcPtr parent, int, int);
 // ??? sub_804C4F8(???);
 void sub_804C508(void);
 void sub_804C558(void);
@@ -462,31 +510,31 @@ void sub_804C558(void);
 // ??? sub_804C5A4(???);
 // ??? sub_804C5F8(???);
 ProcPtr sub_804C758(ProcPtr, u8, u8, u8, u8);
-// void sub_804C7C8(ProcPtr, int, int, int, int); TODO
-// void sub_804C7DC(ProcPtr, s16, s16); TODO
+void sub_804C7C8(struct SioProc85AA9C0 * proc, int, int, int, int);
+void sub_804C7DC(struct SioProc85AA9C0 * proc, s16 x, s16 y);
 // ??? sub_804C7E4(???);
 // ??? sub_804C83C(???);
 // ??? sub_804C894(???);
-// ProcPtr sub_804CAEC(ProcPtr, int, u8 *); TODO
-// ??? sub_804CB94(???);
-// ??? sub_804CC14(???);
-void sub_804CC5C(int);;
-// ??? sub_804CC78(???);
-// ??? sub_804CCCC(???);
-ProcPtr NewProc_085AAAC4(ProcPtr parent, int a, int b);
-void sub_804CDD0(void *, int, int, int, int, int);
-// ??? sub_804CDE8(???);
-// ??? sub_804CE5C(???);
-ProcPtr sub_804CE8C(ProcPtr);
-// ??? sub_804CEB0(???);
-void sub_804CEC4(ProcPtr, s16, s16, s16);
-// ??? sub_804CECC(???);
-// ??? sub_804CF04(???);
-ProcPtr sub_804CFB8(ProcPtr, int, int);
-// ??? sub_804CFE0(???);
-// ??? sub_804D01C(???);
-void sub_804D1E0(int, int, u8, u8, u8, ProcPtr);
-void sub_804D24C(u8, s16);
+ProcPtr sub_804CAEC(struct SioTeamListProc * parent, int numActiveOptions, u8 * buf);
+// ??? LATeamSpriteDraw_Loop(???);
+void PutLinkArenaTeamSprites(int x, int y, int upperBound, int lowerBound, int count, ProcPtr parent);
+void ScrollMultiArenaTeamSprites(int);;
+// ??? UpdateNameEntrySpriteGlow(???);
+// ??? NameEntrySpriteDraw_Loop(???);
+ProcPtr StartNameEntrySpriteDraw(ProcPtr parent, int a, int b);
+void UpdateNameEntrySpriteDraw(void *, int, int, int, int, int);
+// ??? RuleSettingSprites_Interactive_Loop(???);
+// ??? RuleSettingSprites_Static_Loop(???);
+ProcPtr StartRuleSettingSpriteDrawInteractive(ProcPtr);
+// ??? StartRuleSettingSpriteDrawStatic(???);
+void UpdateRuleSettingSprites(ProcPtr, s16, s16, s16);
+// ??? UpdateSioMenuBurstGlow(???);
+// ??? SioMenuBurstFx_Loop(???);
+ProcPtr StartSioMenuBurstFx(ProcPtr, int, int);
+// ??? LinkArenaMenuScroll_Init(???);
+// ??? LinkArenaMenuScroll_Loop(???);
+void StartLinkArenaMenuScrollBar(int, int, u8, u8, u8, ProcPtr);
+void UpdateLinkArenaMenuScrollBar(u8, s16);
 // ??? sub_804D2A4(???);
 // ??? sub_804D37C(???);
 // ??? StopBGM2(???);
@@ -550,7 +598,7 @@ extern int gUnk_Sio_0203DD8C;
 // extern ??? gUnk_Sio_0203DD95
 // extern ??? gUnk_Sio_0203DD9A
 // extern ??? gUnk_Sio_0203DDB4
-// extern ??? gUnk_Sio_0203DDDC
+extern s8 gUnk_Sio_0203DDDC;
 
 // extern ??? gUnknown_080D8714
 extern s16 gUnknown_080D9C9E[];
@@ -593,13 +641,13 @@ extern u16 const Sprite_080D9E0E[];
 // extern ??? SioDefaultBgConfig
 // extern ??? gUnknown_080DA09C
 // extern ??? gUnknown_080DA0DA
-// extern ??? gUnknown_080DA0FA
+// extern ??? Sprite_LinkArena_PressStart
 // extern ??? gUnknown_080DA102
-// extern ??? gUnknown_080DA132
-// extern ??? gUnknown_080DA17A
-// extern ??? gUnknown_080DA18E
-// extern ??? gUnknown_080DA1A2
-// extern ??? gUnknown_080DA1B6
+// extern ??? Sprite_NameEntry_PositionIndicator
+// extern ??? Sprite_SioMenuBurst_TopLeft
+// extern ??? Sprite_SioMenuBurst_TopRight
+// extern ??? Sprite_SioMenuBurst_BottomLeft
+// extern ??? Sprite_SioMenuBurst_BottomRight
 // extern ??? gUnknown_080DA1CA
 // extern ??? gUnknown_080DA20C
 // extern ??? gUnknown_080DA21C
diff --git a/include/variables.h b/include/variables.h
index c7470cd7..473c8e69 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -557,29 +557,29 @@ extern u16 CONST_DATA Pal_EventCursorShinning[];
 // extern ??? ProcScr_SIOWARPFX
 // extern ??? ProcScr_SioWarpFxPartial
 // extern ??? ProcScr_LAButtonSpriteDraw
-// extern ??? gUnknown_085AA96C
-// extern ??? ProcScr_085AA980
-// extern ??? gUnknown_085AA9A0
-// extern ??? gUnknown_085AA9B4
-// extern ??? gUnknown_085AA9C0
-// extern ??? gUnknown_085AA9D8
+// extern ??? Sprite_LinkArena_MenuTitle
+// extern ??? ProcScr_LinkArenaTitleBanner
+// extern ??? SpriteArray_SioMenuItems
+// extern ??? SpriteArray_SioMenuTeamCount
+// extern ??? ProcScr_085AA9C0
+// extern ??? Sprite_LinkArena_TeamName
 // extern ??? gUnknown_085AAA0E
 // extern ??? gUnknown_085AAA48
-extern u16 Sprite_085AAA50[]; // sprite
+extern u16 Sprite_LinkArena_NameBanner[]; // sprite
 // extern ??? gUnknown_085AAA5E
-// extern ??? gUnknown_085AAA78
-// extern ??? gUnknown_085AAA90
-// extern ??? gUnknown_085AAAA8
-// extern ??? gUnknown_085AAAB0
-// extern ??? Proc_085AAAC4
-// extern ??? gUnknown_085AAADC
-// extern ??? gUnknown_085AAAE8
-// extern ??? gUnknown_085AAB00
-// extern ??? gUnknown_085AAB18
-// extern ??? gUnknown_085AAB30
-// extern ??? gUnknown_085AAB38
-// extern ??? gUnknown_085AAB40
-// extern ??? gUnknown_085AAB48
+// extern ??? ProcScr_085AAA78
+// extern ??? ProcScr_LinkArenaTeamSpriteDraw
+// extern ??? SpriteArray_NameEntryCursor
+// extern ??? SpriteArray_NameEntryIcons
+// extern ??? ProcScr_NameEntrySpriteDraw
+// extern ??? SpriteArray_RuleSettingIcons
+// extern ??? ProcScr_RuleSettingSpriteDraw_Interactive
+// extern ??? ProcScr_RuleSettingSpriteDraw_Static
+// extern ??? ProcScr_SioMenuBurstFx
+// extern ??? Sprite_LAMenuScrollBar_UpArrow
+// extern ??? Sprite_LAMenuScrollBar_DownArrow
+// extern ??? Sprite_LinkArenaMenuScrollBar
+// extern ??? ProcScr_LinkArenaMenuScrollBar
 // extern ??? gUnknown_085AABB8
 // extern ??? gUnknown_085AABC8
 // extern ??? gUnknown_085AABD8
diff --git a/src/sio_804B920.c b/src/sio_804B920.c
index eec78977..7f9f7b0d 100644
--- a/src/sio_804B920.c
+++ b/src/sio_804B920.c
@@ -3,6 +3,8 @@
 #include "hardware.h"
 #include "bmlib.h"
 
+#include "sio.h"
+
 struct SioProc85AA7B4
 {
     /* 00 */ PROC_HEADER;
@@ -14,8 +16,6 @@ struct SioProc85AA7B4
 
 extern s16 gUnk_Sio_02000F00[];
 
-extern u8 gUnk_Sio_0203DDDC;
-
 extern s16 * gUnk_Sio_02001180;
 extern s16 * gUnk_Sio_02001184;
 extern s16 * gUnk_Sio_02001188;
diff --git a/src/sio_event.c b/src/sio_event.c
index e82415e8..131724a6 100644
--- a/src/sio_event.c
+++ b/src/sio_event.c
@@ -345,7 +345,7 @@ void sub_804879C(void)
 void sub_80487C0(struct Proc * proc)
 {
     int i;
-    struct Proc85AA9C0 ** iter;
+    struct SioProc85AA9C0 ** iter;
 
     struct SioMenuProc * pSioMenuProc = proc->proc_parent;
 
diff --git a/src/sio_menu.c b/src/sio_menu.c
index e340bb00..e1be6d46 100644
--- a/src/sio_menu.c
+++ b/src/sio_menu.c
@@ -14,10 +14,6 @@
 
 #include "constants/faces.h"
 
-// FIXME
-void sub_804C7C8(ProcPtr, int, int, int, int);
-void sub_804C7DC(ProcPtr, s16, s16);
-
 //! FE8U = 0x08047A54
 int sub_8047A54(struct SioMenuProc * proc, int lineNum)
 {
@@ -153,7 +149,7 @@ void SioMenu_LoadGraphics(struct SioMenuProc * proc)
         proc->unk_2c[i] = sub_804C758(proc, 0xb0, 0xa0, i, proc->unk_40[i]);
     }
 
-    NewProc085AA980(proc->unk_2c[0], 0, 0);
+    StartLinkArenaTitleBanner(proc->unk_2c[0], 0, 0);
     sub_804C508();
 
     SetupFaceGfxData(FaceConfig_085A9E48);
@@ -302,7 +298,7 @@ void SioMenu_RestartGraphicsMaybe(struct SioMenuProc * proc)
         proc->unk_2c[i] = sub_804C758(proc, gUnknown_080D9EF0[idx + 0], gUnknown_080D9EF0[idx + 1], i, proc->unk_40[i]);
     }
 
-    NewProc085AA980(proc->unk_2c[0], 0, 0);
+    StartLinkArenaTitleBanner(proc->unk_2c[0], 0, 0);
     sub_804C508();
 
     SetupFaceGfxData(FaceConfig_085A9E68);
@@ -382,7 +378,7 @@ void SioMenu_Loop_HandleKeyInput(struct SioMenuProc * proc)
 
     if (idx != proc->unk_48)
     {
-        struct Proc85AA9C0 * child;
+        struct SioProc85AA9C0 * child;
 
         SioPlaySoundEffect(3);
 
@@ -392,7 +388,7 @@ void SioMenu_Loop_HandleKeyInput(struct SioMenuProc * proc)
         child = proc->unk_2c[proc->unk_48];
         child->unk_2e = 2;
 
-        sub_804CFB8(child, child->unk_2a, child->unk_2c);
+        StartSioMenuBurstFx(child, child->xBase, child->yBase);
 
         sub_8043100(sub_8047A54(proc, 0), 0);
         sub_8043100(sub_8047A54(proc, 1), 1);
diff --git a/src/sio_postbattle.c b/src/sio_postbattle.c
index 1f500817..fbf162c3 100644
--- a/src/sio_postbattle.c
+++ b/src/sio_postbattle.c
@@ -131,7 +131,7 @@ void SioPostBattleSprites_Loop_DrawSlideIn(struct SioPostBattleSpritesProc * pro
         PutSprite(4, proc->x + 72, proc->y - 6, SpriteArray_085A96D4[proc->oam2], 0);
         PutSprite(4, proc->x + 96, proc->y + 8, Sprite_080D9DE4, 0);
         PutSprite(4, proc->x + 64, proc->y + 8, Sprite_080D9E06, proc->ranking * 4 + 0x50);
-        PutSprite(4, -proc->x + 112, proc->y - 8, Sprite_085AAA50, OAM2_PAL(proc->oam2) + 0x400);
+        PutSprite(4, -proc->x + 112, proc->y - 8, Sprite_LinkArena_NameBanner, OAM2_PAL(proc->oam2) + 0x400);
         PutSprite(4, -proc->x + 124, proc->y, Sprite_080D9DF2, proc->oam2 == 3 ? 0x40 : proc->oam2 * 9);
         PutSprite(
             5, -proc->x + 208, proc->y - 8, Sprite_080D9E0E, OAM2_PAL(proc->oam2 + 10) + 0x180 + (proc->oam2 << 3));
@@ -147,7 +147,7 @@ void SioPostBattleSprites_Loop_DrawStatic(struct SioPostBattleSpritesProc * proc
     PutSprite(4, proc->x + 72, proc->y - 6, SpriteArray_085A96D4[proc->oam2], 0);
     PutSprite(4, proc->x + 96, proc->y + 8, Sprite_080D9DE4, 0);
     PutSprite(4, proc->x + 64, proc->y + 8, Sprite_080D9E06, proc->ranking * 4 + 0x50);
-    PutSprite(4, -proc->x + 112, proc->y - 8, Sprite_085AAA50, OAM2_PAL(proc->oam2) + 0x400);
+    PutSprite(4, -proc->x + 112, proc->y - 8, Sprite_LinkArena_NameBanner, OAM2_PAL(proc->oam2) + 0x400);
     PutSprite(4, -proc->x + 124, proc->y, Sprite_080D9DF2, proc->oam2 == 3 ? 0x40 : proc->oam2 * 9);
     PutSprite(5, -proc->x + 208, proc->y - 8, Sprite_080D9E0E, OAM2_PAL(proc->oam2 + 10) + 0x180 + (proc->oam2 << 3));
 
diff --git a/src/sio_result.c b/src/sio_result.c
index 872fb8fb..a77fff0f 100644
--- a/src/sio_result.c
+++ b/src/sio_result.c
@@ -172,8 +172,8 @@ void SioResult_Init(struct SioResultProc * proc)
 
     SetWOutLayers(1, 0, 1, 1, 1);
 
-    sub_804D1E0(217, 57, 10, 5, proc->unk_36 + 56, proc);
-    NewProc085AA980(proc, 5, 0);
+    StartLinkArenaMenuScrollBar(217, 57, 10, 5, proc->unk_36 + 56, proc);
+    StartLinkArenaTitleBanner(proc, 5, 0);
     sub_804C558();
     StartLinkArenaButtonSpriteDraw(0xc0, 0x10, proc);
 
@@ -191,7 +191,7 @@ void SioResult_Loop_Main(struct SioResultProc * proc)
         proc->unk_38--;
 
         BG_SetPosition(BG_1, 0, proc->unk_36);
-        sub_804D24C(10, proc->unk_36 + 56);
+        UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
 
         return;
     }
@@ -202,7 +202,7 @@ void SioResult_Loop_Main(struct SioResultProc * proc)
         proc->unk_38++;
 
         BG_SetPosition(BG_1, 0, proc->unk_36);
-        sub_804D24C(10, proc->unk_36 + 56);
+        UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
 
         return;
     }
@@ -217,7 +217,7 @@ void SioResult_Loop_Main(struct SioResultProc * proc)
         proc->unk_38 = 3;
 
         BG_SetPosition(BG_1, 0, proc->unk_36);
-        sub_804D24C(10, proc->unk_36 + 56);
+        UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
     }
 
     if (((gKeyStatusPtr->repeatedKeys & DPAD_DOWN) != 0) && (proc->unk_34 + 5 < 10))
@@ -230,7 +230,7 @@ void SioResult_Loop_Main(struct SioResultProc * proc)
         proc->unk_38 = -3;
 
         BG_SetPosition(BG_1, 0, proc->unk_36);
-        sub_804D24C(10, proc->unk_36 + 56);
+        UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
     }
 
     if ((gKeyStatusPtr->newKeys & B_BUTTON) != 0)
@@ -356,7 +356,7 @@ void SioResult_NewHS_LoopScroll(struct SioResultProc * proc)
         proc->unk_38--;
 
         BG_SetPosition(BG_1, 0, proc->unk_36);
-        sub_804D24C(10, proc->unk_36 + 56);
+        UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
 
         otherProc->unk_30 += 2;
     }
@@ -370,7 +370,7 @@ void SioResult_NewHS_LoopScroll(struct SioResultProc * proc)
             proc->unk_38 = 7;
 
             BG_SetPosition(BG_1, 0, proc->unk_36);
-            sub_804D24C(10, proc->unk_36 + 56);
+            UpdateLinkArenaMenuScrollBar(10, proc->unk_36 + 56);
 
             otherProc->unk_30 += 2;
         }
diff --git a/src/sio_rulesettings.c b/src/sio_rulesettings.c
index ded4cd8e..e28d4442 100644
--- a/src/sio_rulesettings.c
+++ b/src/sio_rulesettings.c
@@ -107,13 +107,13 @@ void SioRuleSettings_Init(struct ProcSioRuleSettings * proc)
     sub_8043164();
 
     proc->unk_30 = 0;
-    proc->unk_2c = sub_804CE8C(proc);
+    proc->unk_2c = StartRuleSettingSpriteDrawInteractive(proc);
 
     BG_SetPosition(BG_1, 254, 0);
 
     LoadLinkArenaRuleSettings(buf);
 
-    sub_804CEC4(
+    UpdateRuleSettingSprites(
         proc->unk_2c, proc->unk_30, gLinkArenaRuleData[proc->unk_30].xPos[buf[proc->unk_30]] * 8,
         ((proc->unk_30 * 3) << 3) + 0x30);
 
@@ -132,7 +132,7 @@ void SioRuleSettings_Init(struct ProcSioRuleSettings * proc)
     DrawLinkArenaModeIcon(gBG1TilemapBuffer + 0x11E + gLinkArenaRuleData[1].xPos[0], 0);
     DrawLinkArenaModeIcon(gBG1TilemapBuffer + 0x11E + gLinkArenaRuleData[1].xPos[1], 1);
 
-    NewProc085AA980(proc->unk_2c, 6, 0);
+    StartLinkArenaTitleBanner(proc->unk_2c, 6, 0);
 
     sub_804C508();
 
@@ -196,7 +196,7 @@ void SioRuleSettings_Loop_Main(struct ProcSioRuleSettings * proc)
             var = -2;
         }
 
-        sub_804CEC4(
+        UpdateRuleSettingSprites(
             proc->unk_2c, proc->unk_30, (gLinkArenaRuleData[proc->unk_30].xPos[buf[proc->unk_30]] + var) * 8,
             ((proc->unk_30 * 3) << 3) + 0x30);
 
diff --git a/src/sio_tactician.c b/src/sio_tactician.c
index 3fed9d02..d17404b7 100644
--- a/src/sio_tactician.c
+++ b/src/sio_tactician.c
@@ -121,14 +121,14 @@ void Tactician_InitScreen(struct ProcTactician * proc)
     proc->conf_idx = 6;
 
     conf = GetTacticianTextConf(6);
-    proc->child1 = NewProc_085AAAC4(proc, conf->xpos - 4, conf->unk32 + 1);
+    proc->child1 = StartNameEntrySpriteDraw(proc, conf->xpos - 4, conf->unk32 + 1);
     proc->unk39 = 0;
 
     for (i = 0; i < 10; i++)
         InitText(Texts_0203DB14 + i, 0x1A);
 
     InitText(&Texts_0203DAB0, 0xC);
-    NewProc085AA980(proc->child1, 3, 0x500);
+    StartLinkArenaTitleBanner(proc->child1, 3, 0x500);
     sub_804C508();
     gUnk_Sio_0203DD24 = 0;
     proc->text_idx = 0;
@@ -503,7 +503,7 @@ void Tactician_Loop(struct ProcTactician * proc)
 
     _cbuf[proc->max_len - 1] = 0;
 
-    sub_804CDD0(proc->child1, conf->xpos - 4, conf->unk32 + 1, StrLen(_cbuf) * 7, conf->unk34, (proc->line_idx <= 1) ? proc->line_idx : 2);
+    UpdateNameEntrySpriteDraw(proc->child1, conf->xpos - 4, conf->unk32 + 1, StrLen(_cbuf) * 7, conf->unk34, (proc->line_idx <= 1) ? proc->line_idx : 2);
 }
 
 extern u8 gUnknown_03001810;
diff --git a/src/sio_teamlist.c b/src/sio_teamlist.c
index b7f91bbf..da1730eb 100644
--- a/src/sio_teamlist.c
+++ b/src/sio_teamlist.c
@@ -15,46 +15,6 @@
 #include "sio_core.h"
 #include "sio.h"
 
-// FIXME
-ProcPtr sub_804CAEC(ProcPtr, int, u8 *);
-
-struct SioProc85AAA78
-{
-    /* 00 */ PROC_HEADER;
-    /* 29 */ STRUCT_PAD(0x29, 0x30);
-    /* 30 */ s16 unk_30[5];
-    /* 3A */ u8 unk_3a[2];
-    /* 3C */ STRUCT_PAD(0x3c, 0x40);
-    /* 40 */ int unk_40;
-    /* 44 */ u8 unk_44;
-    /* 45 */ STRUCT_PAD(0x45, 0x48);
-    /* 48 */ int unk_48;
-};
-
-struct SioTeamListProc
-{
-    /* 00 */ PROC_HEADER;
-    /* 2C */ struct SioProc85AAA78 * unk_2c;
-    /* 30 */ ProcPtr pSioHoldProc;
-    /* 34 */ int numActiveOptions;
-    /* 38 */ int unk_38;
-    /* 3C */ int optionIdx;
-    /* 40 */ int unk_40;
-    /* 44 */ int unk_44;
-    /* 48 */ u8 unk_48;
-    /* 49 */ STRUCT_PAD(0x49, 0x4A);
-    /* 4A */ u16 yBg1;
-    /* 4C */ s8 unk_4c;
-    /* 4D */ u8 validOptions[5];
-    /* 52 */ u8 selectedOption;
-    /* 53 */ u8 selectedTeam;
-    /* 54 */ u8 unk_54;
-    /* 55 */ u8 unk_55;
-    /* 56 */ STRUCT_PAD(0x56, 0x58);
-    /* 58 */ int unk_58;
-    /* 5C */ s8 unk_5c;
-};
-
 extern struct ProcCmd ProcScr_SioTeamList[];
 
 struct LinkArenaTeamEnt
@@ -407,7 +367,7 @@ void SioTeamList_EraseTeam(struct SioTeamListProc * proc)
         sub_80437C0(gLinkArenaSt.unk_00, proc);
     }
 
-    sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+    UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
 
     BG_EnableSyncByMask(BG1_SYNC_BIT);
 
@@ -451,7 +411,7 @@ void SioTeamList_SwapTeams(struct SioTeamListProc * proc)
     DrawLinkArenaTeamName(teamB);
     DrawLinkArenaTeamName(teamA);
 
-    sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+    UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
 
     Proc_End(proc->pSioHoldProc);
 
@@ -598,7 +558,7 @@ void SioTeamList_SetupGfx(struct SioTeamListProc * proc)
     SetWin1Layers(1, 0, 1, 1, 0);
     SetWOutLayers(1, 0, 1, 1, 1);
 
-    NewProc085AA980(proc->unk_2c, gUnknown_080D9D5E[gLinkArenaSt.unk_00], 0);
+    StartLinkArenaTitleBanner(proc->unk_2c, gUnknown_080D9D5E[gLinkArenaSt.unk_00], 0);
     sub_804C558();
 
     sub_8043100(GetLATeamListHelpTextId(proc), 1);
@@ -790,10 +750,10 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
             sub_804303C(proc->pSioHoldProc, +4);
         }
 
-        sub_804CC5C(+4);
+        ScrollMultiArenaTeamSprites(+4);
 
         DisplayUiHand(80, (proc->unk_40 - proc->unk_48) * 16 + 40);
-        sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+        UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
 
         return;
     }
@@ -809,10 +769,10 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
             sub_804303C(proc->pSioHoldProc, -4);
         }
 
-        sub_804CC5C(-4);
+        ScrollMultiArenaTeamSprites(-4);
 
         DisplayUiHand(80, (proc->unk_40 - proc->unk_48) * 16 + 40);
-        sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+        UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
 
         return;
     }
@@ -971,7 +931,7 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
                 sub_804303C(proc->pSioHoldProc, +4);
             }
 
-            sub_804CC5C(+4);
+            ScrollMultiArenaTeamSprites(+4);
 
             proc->unk_48--;
             proc->unk_4c = +3;
@@ -979,7 +939,7 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
 
             BG_SetPosition(BG_1, 0, proc->yBg1);
 
-            sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+            UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
         }
         else
         {
@@ -1001,7 +961,7 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
                 sub_804303C(proc->pSioHoldProc, -4);
             }
 
-            sub_804CC5C(-4);
+            ScrollMultiArenaTeamSprites(-4);
 
             proc->unk_48++;
             proc->unk_4c = -3;
@@ -1009,7 +969,7 @@ void SioTeamList_8043D8C(struct SioTeamListProc * proc)
 
             BG_SetPosition(BG_1, 0, proc->yBg1);
 
-            sub_804D24C(proc->unk_38, proc->yBg1 + 40);
+            UpdateLinkArenaMenuScrollBar(proc->unk_38, proc->yBg1 + 40);
         }
         else
         {
diff --git a/src/sio_uiutils.c b/src/sio_uiutils.c
index a1c722b9..630ac1a7 100644
--- a/src/sio_uiutils.c
+++ b/src/sio_uiutils.c
@@ -16,8 +16,6 @@
  * the Link Arena menus.
  */
 
-extern s8 gUnk_Sio_0203DDDC;
-
 //! FE8U = 0x0804C33C
 void InitSioBG(void)
 {
@@ -40,7 +38,7 @@ void InitSioBG(void)
 
     ReadGameSaveCoreGfx();
 
-    CopyToPaletteBuffer(Pal_LinkArenaRankIcons, 0x300, 0x40);
+    ApplyPalettes(Pal_LinkArenaRankIcons, 0x18, 2);
 
     return;
 }
@@ -80,14 +78,14 @@ void sub_804C3AC(u8 * src, u8 * dst, int c, int d)
     return;
 }
 
-struct SioProc85AA980
+struct LinkArenaTitleBannerProc
 {
     /* 00 */ PROC_HEADER;
     /* 2C */ int unk_2c;
     /* 30 */ int unk_30;
     /* 34 */ STRUCT_PAD(0x34, 0x58);
     /* 58 */ int unk_58;
-    /* 5C */ u32 unk_5c;
+    /* 5C */ u32 chr;
 };
 
 extern u8 gUnknown_085B0DE8[];
@@ -96,17 +94,17 @@ extern u8 gUnknown_085AAE0C[];
 extern u8 gUnknown_085B0F2C[];
 
 //! FE8U = 0x0804C3EC
-void sub_804C3EC(struct SioProc85AA980 * proc)
+void LATitleBanner_Init(struct LinkArenaTitleBannerProc * proc)
 {
     int a = (proc->unk_58 % 3) * 0x140;
     int b = (proc->unk_58 / 3) * 0x800;
 
-    Decompress(gUnknown_085B0DE8, (void *)(0x6000000 + proc->unk_5c));
+    Decompress(gUnknown_085B0DE8, (void *)(0x6000000 + proc->chr));
     Decompress(gUnknown_085AAE0C, gGenericBuffer);
 
     sub_804C3AC(gGenericBuffer + (a + b), (void *)(0x06014000), 10, 2);
 
-    CallARM_FillTileRect(gBG2TilemapBuffer, gUnknown_085B0F2C, (((u16)(proc->unk_5c >> 1) >> 4)) | 0x1000);
+    CallARM_FillTileRect(gBG2TilemapBuffer, gUnknown_085B0F2C, (((u16)(proc->chr >> 1) >> 4)) | 0x1000);
     BG_EnableSyncByMask(BG2_SYNC_BIT);
 
     return;
@@ -114,7 +112,7 @@ void sub_804C3EC(struct SioProc85AA980 * proc)
 
 // clang-format off
 
-u16 CONST_DATA gUnknown_085AA96C[] =
+u16 CONST_DATA Sprite_LinkArena_MenuTitle[] =
 {
     3,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x200) + OAM2_LAYER(1) + OAM2_PAL(8),
@@ -125,19 +123,19 @@ u16 CONST_DATA gUnknown_085AA96C[] =
 // clang-format on
 
 //! FE8U = 0x0804C47C
-void sub_804C47C(void)
+void LATitleBanner_Loop(void)
 {
-    PutSpriteExt(4, 20, 8, gUnknown_085AA96C, 0);
+    PutSpriteExt(4, 20, 8, Sprite_LinkArena_MenuTitle, 0);
     return;
 }
 
 // clang-format off
 
-struct ProcCmd CONST_DATA ProcScr_085AA980[] =
+struct ProcCmd CONST_DATA ProcScr_LinkArenaTitleBanner[] =
 {
     PROC_YIELD,
-    PROC_CALL(sub_804C3EC),
-    PROC_REPEAT(sub_804C47C),
+    PROC_CALL(LATitleBanner_Init),
+    PROC_REPEAT(LATitleBanner_Loop),
 
     PROC_END,
 };
@@ -145,19 +143,19 @@ struct ProcCmd CONST_DATA ProcScr_085AA980[] =
 // clang-format on
 
 //! FE8U = 0x0804C49C
-void NewProc085AA980(ProcPtr parent, int b, int chr)
+void StartLinkArenaTitleBanner(ProcPtr parent, int size, int chr)
 {
-    struct SioProc85AA980 * proc;
+    struct LinkArenaTitleBannerProc * proc;
 
-    Proc_EndEach(ProcScr_085AA980);
-    proc = Proc_Start(ProcScr_085AA980, parent);
+    Proc_EndEach(ProcScr_LinkArenaTitleBanner);
+    proc = Proc_Start(ProcScr_LinkArenaTitleBanner, parent);
 
-    proc->unk_58 = b;
-    proc->unk_5c = chr;
+    proc->unk_58 = size;
+    proc->chr = chr;
 
     if (chr == 0)
     {
-        proc->unk_5c = 0x5c00;
+        proc->chr = 0x5c00;
     }
 
     proc->unk_2c = (proc->unk_58 % 3) * 0x140;
@@ -169,14 +167,14 @@ void NewProc085AA980(ProcPtr parent, int b, int chr)
 //! FE8U = 0x0804C4F8
 void sub_804C4F8(void)
 {
-    Proc_EndEach(ProcScr_085AA980);
+    Proc_EndEach(ProcScr_LinkArenaTitleBanner);
     return;
 }
 
 //! FE8U = 0x0804C508
 void sub_804C508(void)
 {
-    SetBlendConfig(1, 0x10, 4, 0);
+    SetBlendAlpha(16, 4);
 
     SetBlendTargetA(0, 0, 1, 0, 0);
     SetBlendTargetB(0, 0, 0, 1, 0);
@@ -189,7 +187,7 @@ void sub_804C508(void)
 //! FE8U = 0x0804C558
 void sub_804C558(void)
 {
-    SetBlendConfig(1, 0x10, 4, 0);
+    SetBlendAlpha(16, 4);
 
     SetBlendTargetA(0, 0, 1, 0, 0);
     SetBlendTargetB(0, 0, 0, 1, 0);
@@ -206,7 +204,7 @@ void sub_804C590(void)
 
 // clang-format off
 
-const u16 Sprite_080D9FFC[] =
+const u16 Sprite_SioMenu_EditTeams[] =
 {
     5,
     OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x240),
@@ -216,7 +214,7 @@ const u16 Sprite_080D9FFC[] =
     OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
 };
 
-const u16 Sprite_080DA01C[] =
+const u16 Sprite_SioMenu_Practice[] =
 {
     5,
     OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x24A),
@@ -226,7 +224,7 @@ const u16 Sprite_080DA01C[] =
     OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
 };
 
-const u16 Sprite_080DA03C[] =
+const u16 Sprite_SioMenu_LinkedBattle[] =
 {
     5,
     OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x254),
@@ -236,7 +234,7 @@ const u16 Sprite_080DA03C[] =
     OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
 };
 
-const u16 Sprite_080DA05C[] =
+const u16 Sprite_SioMenu_BattleData[] =
 {
     5,
     OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x280),
@@ -246,7 +244,7 @@ const u16 Sprite_080DA05C[] =
     OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
 };
 
-const u16 Sprite_080DA07C[] =
+const u16 Sprite_SioMenu_RuleSettings[] =
 {
     5,
     OAM0_SHAPE_32x16 + OAM0_Y(8), OAM1_SIZE_32x16 + OAM1_X(8), OAM2_CHR(0x28A),
@@ -256,13 +254,13 @@ const u16 Sprite_080DA07C[] =
     OAM0_SHAPE_32x32, OAM1_SIZE_32x32 + OAM1_X(64), OAM2_CHR(0x29C),
 };
 
-const u16 * CONST_DATA gUnknown_085AA9A0[] =
+const u16 * CONST_DATA SpriteArray_SioMenuItems[] =
 {
-    Sprite_080D9FFC,
-    Sprite_080DA01C,
-    Sprite_080DA03C,
-    Sprite_080DA05C,
-    Sprite_080DA07C,
+    Sprite_SioMenu_EditTeams,
+    Sprite_SioMenu_Practice,
+    Sprite_SioMenu_LinkedBattle,
+    Sprite_SioMenu_BattleData,
+    Sprite_SioMenu_RuleSettings,
 };
 
 const u16 gUnknown_080DA09C[] =
@@ -273,14 +271,14 @@ const u16 gUnknown_080DA09C[] =
     OAM2_PAL(4),
 };
 
-const u16 Sprite_080DA0A4[] =
+const u16 Sprite_SioMenu_2Teams[] =
 {
     2,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
     OAM0_SHAPE_16x16, OAM1_SIZE_16x16 + OAM1_X(32), OAM2_CHR(0x2C4) + OAM2_PAL(4),
 };
 
-const u16 Sprite_080DA0B2[] =
+const u16 Sprite_SioMenu_3Teams[] =
 {
     3,
     OAM0_SHAPE_8x16, OAM1_SIZE_8x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
@@ -288,7 +286,7 @@ const u16 Sprite_080DA0B2[] =
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16 + OAM1_X(16), OAM2_CHR(0x2C2) + OAM2_PAL(4),
 };
 
-const u16 Sprite_080DA0C6[] =
+const u16 Sprite_SioMenu_4Teams[] =
 {
     3,
     OAM0_SHAPE_8x16, OAM1_SIZE_8x16, OAM2_CHR(0x2C0) + OAM2_PAL(4),
@@ -296,11 +294,11 @@ const u16 Sprite_080DA0C6[] =
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16 + OAM1_X(16), OAM2_CHR(0x2C2) + OAM2_PAL(4),
 };
 
-const u16 * CONST_DATA gUnknown_085AA9B4[] =
+const u16 * CONST_DATA SpriteArray_SioMenuTeamCount[] =
 {
-    Sprite_080DA0A4,
-    Sprite_080DA0B2,
-    Sprite_080DA0C6,
+    Sprite_SioMenu_2Teams,
+    Sprite_SioMenu_3Teams,
+    Sprite_SioMenu_4Teams,
 };
 
 // clang-format on
@@ -321,43 +319,26 @@ void sub_804C5A4(u8 idx)
     if (gUnk_Sio_0203DDDC == 0)
     {
         int color = gUnknown_080DA0DA[idx] + 0x10;
-        gPaletteBuffer[0x131] = ((color) << 10) + ((color) << 5) + (color);
+        PAL_OBJ_COLOR(3, 1) = ((color) << 10) + ((color) << 5) + (color);
         EnablePaletteSync();
     }
 
     return;
 }
 
-struct SioProc85AA9C0
-{
-    /* 00 */ PROC_HEADER;
-    /* 2A */ s16 unk_2a;
-    /* 2C */ s16 unk_2c;
-    /* 2E */ u8 unk_2e;
-    /* 2F */ u8 unk_2f;
-    /* 30 */ u8 unk_30;
-    /* 32 */ s16 unk_32;
-    /* 34 */ s16 unk_34;
-    /* 36 */ u16 unk_36;
-    /* 38 */ u16 unk_38;
-    /* 3A */ s16 unk_3a;
-    /* 3C */ s16 unk_3c;
-    /* 3E */ u8 unk_3e;
-};
-
 //! FE8U = 0x0804C5F8
 void sub_804C5F8(struct SioProc85AA9C0 * proc)
 {
     int oam2 = OAM2_CHR(0x2C8) + OAM2_PAL(8);
 
-    PutSprite(4, proc->unk_2a, proc->unk_2c, gUnknown_085AA9A0[proc->unk_2f], gUnknown_080DA09C[proc->unk_2e]);
+    PutSprite(4, proc->xBase, proc->yBase, SpriteArray_SioMenuItems[proc->unk_2f], gUnknown_080DA09C[proc->unk_2e]);
 
     if (proc->unk_2e == 2)
     {
         sub_804C5A4(proc->unk_30);
     }
 
-    proc->unk_30 = (proc->unk_30 + 1) & 0x1f;
+    proc->unk_30 = (proc->unk_30 + 1) & 31;
 
     if (proc->unk_2e == 2 && proc->unk_2f == 1)
     {
@@ -381,19 +362,20 @@ void sub_804C5F8(struct SioProc85AA9C0 * proc)
                 proc->unk_32++;
             }
 
-            if (proc->unk_34 > 0x34)
+            if (proc->unk_34 > 52)
             {
                 proc->unk_34--;
             }
         }
 
+        // Put golden arrow sprites for increasing/decreasing team count
+
+        PutSprite(0, 75 + proc->xBase + proc->unk_32, proc->yBase + 8, gObject_8x16, ((proc->unk_36 >> 5) % 6) + oam2);
         PutSprite(
-            0, 0x4b + proc->unk_2a + proc->unk_32, proc->unk_2c + 8, gObject_8x16, ((proc->unk_36 >> 5) % 6) + oam2);
-        PutSprite(
-            0, 0x49 + proc->unk_2a + proc->unk_34, proc->unk_2c + 8, gObject_8x16_HFlipped,
+            0, 73 + proc->xBase + proc->unk_34, proc->yBase + 8, gObject_8x16_HFlipped,
             ((proc->unk_38 >> 5) % 6) + oam2);
 
-        PutSpriteExt(0, 0x50 + proc->unk_2a, proc->unk_2c + 9, gUnknown_085AA9B4[gLinkArenaSt.unk_05], 0);
+        PutSpriteExt(0, 80 + proc->xBase, proc->yBase + 9, SpriteArray_SioMenuTeamCount[gLinkArenaSt.unk_05], 0);
     }
 
     return;
@@ -401,7 +383,7 @@ void sub_804C5F8(struct SioProc85AA9C0 * proc)
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AA9C0[] =
+struct ProcCmd CONST_DATA ProcScr_085AA9C0[] =
 {
     PROC_YIELD,
     PROC_REPEAT(sub_804C5F8),
@@ -411,16 +393,16 @@ struct ProcCmd CONST_DATA gUnknown_085AA9C0[] =
 // clang-format on
 
 //! FE8U = 0x0804C758
-ProcPtr sub_804C758(ProcPtr parent, u8 x1, u8 y1, u8 d, u8 e)
+ProcPtr sub_804C758(ProcPtr parent, u8 xBase, u8 yBase, u8 d, u8 e)
 {
-    struct SioProc85AA9C0 * proc = Proc_Start(gUnknown_085AA9C0, parent);
+    struct SioProc85AA9C0 * proc = Proc_Start(ProcScr_085AA9C0, parent);
 
-    proc->unk_2a = x1;
-    proc->unk_2c = y1;
+    proc->xBase = xBase;
+    proc->yBase = yBase;
     proc->unk_2e = e;
     proc->unk_2f = d;
     proc->unk_32 = 0;
-    proc->unk_34 = 0x34;
+    proc->unk_34 = 52;
     proc->unk_38 = 0;
     proc->unk_36 = 0;
     proc->unk_3c = 4;
@@ -445,8 +427,8 @@ void sub_804C7C8(struct SioProc85AA9C0 * proc, int b, int c, int d, int e)
 //! FE8U = 0x0804C7DC
 void sub_804C7DC(struct SioProc85AA9C0 * proc, s16 x, s16 y)
 {
-    proc->unk_2a = x;
-    proc->unk_2c = y;
+    proc->xBase = x;
+    proc->yBase = y;
 
     return;
 }
@@ -455,7 +437,7 @@ extern u16 gUnknown_085ADDE8[];
 
 // clang-format off
 
-const u16 gUnknown_080DA0FA[] =
+const u16 Sprite_LinkArena_PressStart[] =
 {
     1,
     OAM0_SHAPE_64x32 + OAM0_AFFINE_ENABLE, OAM1_SIZE_64x32, OAM2_CHR(0x300) + OAM2_LAYER(1),
@@ -483,7 +465,7 @@ void sub_804C7E4(void)
         int a = (GetGameClock() % 0x40);
         int idx = gUnknown_080DA102[a / 2];
 
-        gPaletteBuffer[0x18E] = ptr[idx];
+        PAL_OBJ_COLOR(8, 14) = ptr[idx];
         EnablePaletteSync();
     }
 
@@ -512,28 +494,16 @@ void sub_804C83C(void)
         int a = (GetGameClock() % 0x40);
         int idx = gUnknown_080DA0DA[a / 2];
 
-        gPaletteBuffer[0x13E] = ptr[idx];
+        PAL_OBJ_COLOR(3, 14) = ptr[idx];
         EnablePaletteSync();
     }
 
     return;
 }
 
-struct SioProc85AAA78
-{
-    /* 00 */ PROC_HEADER;
-    /* 2C */ int unk_2c;
-    /* 30 */ s16 unk_30[5];
-    /* 3A */ u8 unk_3a[5];
-    /* 40 */ int unk_40;
-    /* 44 */ s8 unk_44;
-    /* 45 */ STRUCT_PAD(0x45, 0x48);
-    /* 48 */ int unk_48;
-};
-
 // clang-format off
 
-u16 CONST_DATA gUnknown_085AA9D8[] =
+u16 CONST_DATA Sprite_LinkArena_TeamName[] =
 {
     2,
     OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x2B8) + OAM2_PAL(8),
@@ -576,7 +546,7 @@ u16 * CONST_DATA gUnknown_085AAA48[] =
     Sprite_085AA9FA,
 };
 
-u16 CONST_DATA Sprite_085AAA50[] =
+u16 CONST_DATA Sprite_LinkArena_NameBanner[] =
 {
     2,
     OAM0_SHAPE_64x32, OAM1_SIZE_64x32, OAM2_CHR(0x240) + OAM2_PAL(3),
@@ -606,22 +576,25 @@ void sub_804C894(struct SioProc85AAA78 * proc)
     {
         if (proc->unk_44 != 0)
         {
-            oam2 = 0x400;
+            oam2 = OAM2_LAYER(1);
         }
         else
         {
-            oam2 = 0xc00;
+            oam2 = OAM2_LAYER(3);
         }
 
-        PutSprite(0, 0x58, 0x20, gUnknown_085AA9D8, 0);
+        // Put "Team Name" sprite
+        PutSprite(0, 88, 32, Sprite_LinkArena_TeamName, 0);
 
         for (i = 0; i < proc->unk_2c; i++)
         {
-            PutSprite(4, proc->unk_30[i] + 6, 0x20 + i * 0x18, Sprite_085AAA50, (i & 0xf) * 0x1000 + oam2);
+            // Put name banner sprite
+            PutSprite(4, proc->unk_30[i] + 6, 32 + i * 24, Sprite_LinkArena_NameBanner, OAM2_PAL(i) + oam2);
 
             if (proc->unk_3a[i] != 0)
             {
-                PutSprite(4, proc->unk_30[i] + 6, 0x20 + i * 0x18, gUnknown_085AAA5E, oam2);
+                // Put active selection sprite
+                PutSprite(4, proc->unk_30[i] + 6, 32 + i * 24, gUnknown_085AAA5E, oam2);
             }
         }
 
@@ -629,13 +602,13 @@ void sub_804C894(struct SioProc85AAA78 * proc)
         {
             if (gUnk_Sio_0203DDDC == 0)
             {
-                gPaletteBuffer[0x18e] = ((GetGameClock() % 0x40) / 4)[gUnknown_08A1BD40];
+                PAL_OBJ_COLOR(8, 14) = ((GetGameClock() % 0x40) / 4)[gUnknown_08A1BD40];
                 EnablePaletteSync();
             }
 
             if (proc->unk_40 < 0x100)
             {
-                proc->unk_40 = proc->unk_40 + 0x10;
+                proc->unk_40 += 0x10;
             }
 
             // clang-format off
@@ -648,17 +621,21 @@ void sub_804C894(struct SioProc85AAA78 * proc)
             );
             // clang-format on
 
-            PutSprite(4, 0x78, 0, gUnknown_080DA0FA, 0x8000);
+            // Put "Press Start" sprite
+            PutSprite(4, 120, 0, Sprite_LinkArena_PressStart, OAM2_PAL(8));
         }
+
         sub_804C83C();
     }
     else
     {
-        PutSprite(0xb, 0x58, 0x20, gUnknown_085AA9D8, 0);
+        // Put "Team Name" sprite
+        PutSprite(0xb, 88, 32, Sprite_LinkArena_TeamName, 0);
 
         for (i = 0; i < proc->unk_2c; i++)
         {
-            PutSprite(2, proc->unk_30[i], 0x30 + i * 0x10, gUnknown_085AAA48[proc->unk_3a[i]], 0);
+            // Put side menu item sprite
+            PutSprite(2, proc->unk_30[i], 48 + i * 16, gUnknown_085AAA48[proc->unk_3a[i]], 0);
 
             if (proc->unk_3a[i] != 0)
             {
@@ -678,53 +655,30 @@ void sub_804C894(struct SioProc85AAA78 * proc)
 
     if (gLinkArenaSt.unk_00 == 1)
     {
-        oam2 = 0x400;
+        oam2 = OAM2_LAYER(1);
     }
     else
     {
-        oam2 = 0x800;
+        oam2 = OAM2_LAYER(2);
     }
 
     if (proc->unk_44 != 0)
     {
-        PutLinkArenaButtonSpriteAt(0xc0, 0x10);
+        PutLinkArenaButtonSpriteAt(192, 16);
     }
 
     if (proc->unk_48 >= 0)
     {
-        PutSprite(4, 0x50, proc->unk_48 + 8, gUnknown_085AAA0E, oam2);
+        // Put team row highlight indicator sprite
+        PutSprite(4, 80, proc->unk_48 + 8, gUnknown_085AAA0E, oam2);
     }
 
     return;
 }
 
-struct SioTeamListProc
-{
-    /* 00 */ PROC_HEADER;
-    /* 2C */ struct SioProc85AAA78 * unk_2c;
-    /* 30 */ ProcPtr pSioHoldProc;
-    /* 34 */ int numActiveOptions;
-    /* 38 */ int unk_38;
-    /* 3C */ int optionIdx;
-    /* 40 */ int unk_40;
-    /* 44 */ int unk_44;
-    /* 48 */ u8 unk_48;
-    /* 49 */ STRUCT_PAD(0x49, 0x4A);
-    /* 4A */ u16 yBg1;
-    /* 4C */ s8 unk_4c;
-    /* 4D */ u8 validOptions[5];
-    /* 52 */ u8 selectedOption;
-    /* 53 */ u8 selectedTeam;
-    /* 54 */ u8 unk_54;
-    /* 55 */ u8 unk_55;
-    /* 56 */ STRUCT_PAD(0x56, 0x58);
-    /* 58 */ int unk_58;
-    /* 5C */ s8 unk_5c;
-};
-
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAA78[] =
+struct ProcCmd CONST_DATA ProcScr_085AAA78[] =
 {
     PROC_YIELD,
     PROC_REPEAT(sub_804C894),
@@ -733,18 +687,16 @@ struct ProcCmd CONST_DATA gUnknown_085AAA78[] =
 
 // clang-format on
 
-void sub_804CC14(int, int, int, int, int, ProcPtr);
-
 //! FE8U = 0x0804CAEC
-ProcPtr sub_804CAEC(struct SioTeamListProc * parent, int b, u8 * buf)
+ProcPtr sub_804CAEC(struct SioTeamListProc * parent, int numActiveOptions, u8 * buf)
 {
     struct SioProc85AAA78 * proc;
     int i;
 
-    Proc_EndEach(gUnknown_085AAA78);
-    proc = Proc_Start(gUnknown_085AAA78, parent);
+    Proc_EndEach(ProcScr_085AAA78);
+    proc = Proc_Start(ProcScr_085AAA78, parent);
 
-    proc->unk_2c = b;
+    proc->unk_2c = numActiveOptions;
     proc->unk_44 = 1;
     proc->unk_40 = 0;
     proc->unk_48 = -1;
@@ -755,39 +707,38 @@ ProcPtr sub_804CAEC(struct SioTeamListProc * parent, int b, u8 * buf)
         proc->unk_30[i] = -8;
     }
 
-    sub_804D1E0(0xe1, 0x28, parent->unk_38, 6, parent->yBg1 + 40, proc);
-    sub_804CC14(0x98, 0x28 - parent->unk_48 * 0x10, 0x88, 0x27, parent->unk_38, proc);
+    StartLinkArenaMenuScrollBar(225, 40, parent->unk_38, 6, parent->yBg1 + 40, proc);
+    PutLinkArenaTeamSprites(152, 40 - parent->unk_48 * 16, 136, 39, parent->unk_38, proc);
 
     return proc;
 }
 
-struct SioProc85AAA90
+struct LATeamSpriteDrawProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2C */ int unk_2c;
-    /* 30 */ int unk_30;
-    /* 34 */ int unk_34;
-    /* 38 */ int unk_38;
-    /* 3C */ int unk_3c;
+    /* 2C */ int xBase;
+    /* 30 */ int yBase;
+    /* 34 */ int yMin;
+    /* 38 */ int yMax;
+    /* 3C */ int numTeams;
 };
 
 //! FE8U = 0x0804CB94
-void sub_804CB94(struct SioProc85AAA90 * proc)
+void LATeamSpriteDraw_Loop(struct LATeamSpriteDrawProc * proc)
 {
     int i;
-    int y;
     int j;
 
-    for (i = 0; i < proc->unk_3c; i++)
+    for (i = 0; i < proc->numTeams; i++)
     {
-        y = proc->unk_30 + i * 0x10;
+        int y = proc->yBase + i * 16;
 
-        if (y >= proc->unk_38)
+        if (y >= proc->yMax)
         {
             continue;
         }
 
-        if (y <= proc->unk_34)
+        if (y <= proc->yMin)
         {
             continue;
         }
@@ -801,7 +752,7 @@ void sub_804CB94(struct SioProc85AAA90 * proc)
                 continue;
             }
 
-            sub_8027E4C(4, proc->unk_2c + j * 0xe, y, OAM2_LAYER(1), unit);
+            sub_8027E4C(4, proc->xBase + j * 14, y, OAM2_LAYER(1), unit);
         }
     }
 
@@ -810,39 +761,39 @@ void sub_804CB94(struct SioProc85AAA90 * proc)
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAA90[] =
+struct ProcCmd CONST_DATA ProcScr_LinkArenaTeamSpriteDraw[] =
 {
     PROC_YIELD,
-    PROC_REPEAT(sub_804CB94),
+    PROC_REPEAT(LATeamSpriteDraw_Loop),
     PROC_END,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CC14
-void sub_804CC14(int x, int y, int upperBound, int lowerBound, int count, ProcPtr parent)
+void PutLinkArenaTeamSprites(int x, int y, int yMax, int yMin, int count, ProcPtr parent)
 {
-    struct SioProc85AAA90 * proc;
+    struct LATeamSpriteDrawProc * proc;
 
-    Proc_EndEach(gUnknown_085AAA90);
-    proc = Proc_Start(gUnknown_085AAA90, parent);
+    Proc_EndEach(ProcScr_LinkArenaTeamSpriteDraw);
+    proc = Proc_Start(ProcScr_LinkArenaTeamSpriteDraw, parent);
 
-    proc->unk_3c = count;
+    proc->numTeams = count;
 
-    proc->unk_2c = x;
-    proc->unk_30 = y;
+    proc->xBase = x;
+    proc->yBase = y;
 
-    proc->unk_34 = lowerBound;
-    proc->unk_38 = upperBound;
+    proc->yMin = yMin;
+    proc->yMax = yMax;
 
     return;
 }
 
 //! FE8U = 0x0804CC5C
-void sub_804CC5C(int amount)
+void ScrollMultiArenaTeamSprites(int amount)
 {
-    struct SioProc85AAA90 * proc = Proc_Find(gUnknown_085AAA90);
-    proc->unk_30 += amount;
+    struct LATeamSpriteDrawProc * proc = Proc_Find(ProcScr_LinkArenaTeamSpriteDraw);
+    proc->yBase += amount;
 
     return;
 }
@@ -850,7 +801,7 @@ void sub_804CC5C(int amount)
 extern u16 gUnknown_085ADE28[];
 
 //! FE8U = 0x0804CC78
-void sub_804CC78(void)
+void UpdateNameEntrySpriteGlow(void)
 {
     int r2;
     int i;
@@ -864,7 +815,7 @@ void sub_804CC78(void)
 
         for (i = 0; i < 5; i++)
         {
-            gPaletteBuffer[0x19B + i] = ptr[((r2 + i) & 0xf)];
+            PAL_OBJ_COLOR(9, 11 + i) = ptr[(r2 + i) & 0xf];
         }
 
         EnablePaletteSync();
@@ -873,145 +824,147 @@ void sub_804CC78(void)
     return;
 }
 
-struct SioProc85AAAC4
+struct NameEntrySpriteDrawProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2C */ int unk_2c;
-    /* 30 */ int unk_30;
-    /* 34 */ int unk_34;
-    /* 38 */ int unk_38;
-    /* 3C */ int unk_3c;
-    /* 40 */ int unk_40;
-    /* 44 */ int unk_44;
+    /* 2C */ int xCurrent;
+    /* 30 */ int yCurrent;
+    /* 34 */ int xNew;
+    /* 38 */ int yNew;
+    /* 3C */ int cursorKind;
+    /* 40 */ int xPointer;
+    /* 44 */ int unk_44; // maybe mode (Katakana/Hiragana)?
 };
 
 // clang-format off
 
-const u16 Sprite_080DA122[] =
+const u16 Sprite_NameEntry_CursorSmall[] =
 {
     1,
     OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x251) + OAM2_LAYER(1) + OAM2_PAL(9),
 };
 
-const u16 Sprite_080DA12A[] =
+const u16 Sprite_NameEntry_CursorLarge[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x253) + OAM2_LAYER(1) + OAM2_PAL(9),
 };
 
-const u16 * CONST_DATA gUnknown_085AAAA8[] =
+const u16 * CONST_DATA SpriteArray_NameEntryCursor[] =
 {
-    Sprite_080DA122,
-    Sprite_080DA12A,
+    Sprite_NameEntry_CursorSmall,
+    Sprite_NameEntry_CursorLarge,
 };
 
-const u16 gUnknown_080DA132[] =
+// Sprite for the "next letter" position indicator
+
+const u16 Sprite_NameEntry_PositionIndicator[] =
 {
     1,
     OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x29A) + OAM2_LAYER(2) + OAM2_PAL(9),
 };
 
-const u16 Sprite_080DA13A[] =
+const u16 Sprite_NameEntry_OKIcon[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C0) + OAM2_LAYER(1),
 };
 
-const u16 Sprite_080DA142[] =
+const u16 Sprite_NameEntry_DeleteIcon[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C4) + OAM2_LAYER(1),
 };
 
-const u16 Sprite_080DA14A[] =
+const u16 Sprite_NameEntry_KatakanaIcon[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2C8) + OAM2_LAYER(1),
 };
 
-const u16 Sprite_080DA152[] =
+const u16 Sprite_NameEntry_HiraganaIcon[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2CC) + OAM2_LAYER(1),
 };
 
-const u16 Sprite_080DA15A[] =
+const u16 Sprite_NameEntry_080DA15A[] =
 {
     1,
     OAM0_SHAPE_32x16, OAM1_SIZE_32x16, OAM2_CHR(0x2D0) + OAM2_LAYER(1),
 };
 
-const u16 * CONST_DATA gUnknown_085AAAB0[] =
+const u16 * CONST_DATA SpriteArray_NameEntryIcons[] =
 {
-    Sprite_080DA152,
-    Sprite_080DA14A,
-    Sprite_080DA15A,
-    Sprite_080DA142,
-    Sprite_080DA13A,
+    Sprite_NameEntry_HiraganaIcon,
+    Sprite_NameEntry_KatakanaIcon,
+    Sprite_NameEntry_080DA15A,
+    Sprite_NameEntry_DeleteIcon,
+    Sprite_NameEntry_OKIcon,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CCCC
-void sub_804CCCC(struct SioProc85AAAC4 * proc)
+void NameEntrySpriteDraw_Loop(struct NameEntrySpriteDrawProc * proc)
 {
     int i;
 
-    int x = (proc->unk_34 + proc->unk_2c) >> 1;
-    int y = (proc->unk_38 + proc->unk_30) >> 1;
+    int x = (proc->xNew + proc->xCurrent) >> 1;
+    int y = (proc->yNew + proc->yCurrent) >> 1;
 
-    proc->unk_2c = x;
-    proc->unk_30 = y;
+    proc->xCurrent = x;
+    proc->yCurrent = y;
 
-    PutSprite(2, x, y, gUnknown_085AAAA8[proc->unk_3c], 0);
-    PutSprite(2, proc->unk_40 + 0x60, 0x30, gUnknown_080DA132, 0);
-    PutSprite(2, 0x60, 0x20, gUnknown_085AA9D8, 0);
-    PutSprite(4, 0x50, 0x20, Sprite_085AAA50, 0x800);
+    PutSprite(2, x, y, SpriteArray_NameEntryCursor[proc->cursorKind], 0);
+    PutSprite(2, 96 + proc->xPointer, 48, Sprite_NameEntry_PositionIndicator, 0);
+    PutSprite(2, 96, 32, Sprite_LinkArena_TeamName, 0);
+    PutSprite(4, 80, 32, Sprite_LinkArena_NameBanner, OAM2_LAYER(2));
 
     for (i = 3; i < 5; i++)
     {
         if ((proc->unk_44 == i) && (i < 3))
         {
-            PutSprite(4, 0xc4, 0x48 + i * 0x10, gUnknown_085AAAB0[i], 0x4000);
+            PutSprite(4, 196, 72 + i * 16, SpriteArray_NameEntryIcons[i], OAM2_PAL(4));
         }
         else
         {
-            PutSprite(4, 0xc4, 0x48 + i * 0x10, gUnknown_085AAAB0[i], 0x8000);
+            PutSprite(4, 196, 72 + i * 16, SpriteArray_NameEntryIcons[i], OAM2_PAL(8));
         }
     }
 
-    sub_804CC78();
+    UpdateNameEntrySpriteGlow();
 
     return;
 }
 
 // clang-format off
 
-struct ProcCmd CONST_DATA Proc_085AAAC4[] =
+struct ProcCmd CONST_DATA ProcScr_NameEntrySpriteDraw[] =
 {
     PROC_YIELD,
-    PROC_REPEAT(sub_804CCCC),
+    PROC_REPEAT(NameEntrySpriteDraw_Loop),
     PROC_END,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CD90
-ProcPtr NewProc_085AAAC4(ProcPtr parent, int x, int y)
+ProcPtr StartNameEntrySpriteDraw(ProcPtr parent, int x, int y)
 {
-    struct SioProc85AAAC4 * proc;
+    struct NameEntrySpriteDrawProc * proc;
 
-    Proc_EndEach(Proc_085AAAC4);
-    proc = Proc_Start(Proc_085AAAC4, parent);
+    Proc_EndEach(ProcScr_NameEntrySpriteDraw);
+    proc = Proc_Start(ProcScr_NameEntrySpriteDraw, parent);
 
-    proc->unk_34 = x;
-    proc->unk_2c = x;
+    proc->xNew = x;
+    proc->xCurrent = x;
 
-    proc->unk_38 = y;
-    proc->unk_30 = y;
+    proc->yNew = y;
+    proc->yCurrent = y;
 
-    proc->unk_3c = 0;
-    proc->unk_40 = 0;
+    proc->cursorKind = 0;
+    proc->xPointer = 0;
     proc->unk_44 = 1;
 
     return proc;
@@ -1019,89 +972,89 @@ ProcPtr NewProc_085AAAC4(ProcPtr parent, int x, int y)
 
 // FIXME - param
 //! FE8U = 0x0804CDD0
-void sub_804CDD0(void * proc, int b, int c, int d, int e, int f)
+void UpdateNameEntrySpriteDraw(void * proc, int xNew, int yNew, int xPointer, int cursorKind, int f)
 {
-    struct SioProc85AAAC4 * param_1 = proc;
+    struct NameEntrySpriteDrawProc * param_1 = proc;
 
-    param_1->unk_34 = b;
-    param_1->unk_38 = c;
-    param_1->unk_3c = e;
-    param_1->unk_40 = d;
+    param_1->xNew = xNew;
+    param_1->yNew = yNew;
+    param_1->cursorKind = cursorKind;
+    param_1->xPointer = xPointer;
     param_1->unk_44 = f;
 
     return;
 }
 
-struct SioProc85AAAE8
+struct RuleSettingSpriteDrawProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2A */ s16 unk_2a;
-    /* 2C */ s16 unk_2c;
-    /* 2E */ s16 unk_2e;
-    /* 30 */ s16 unk_30;
+    /* 2A */ s16 yPrevious;
+    /* 2C */ s16 yNew;
+    /* 2E */ s16 xOption;
+    /* 30 */ s16 yOption;
 };
 
 // clang-format off
 
-const u16 Sprite_080DA162[] =
+const u16 Sprite_RuleSettings_HideUnitsIcon[] =
 {
     1,
     OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D4) + OAM2_LAYER(1) + OAM2_PAL(8),
 };
 
-const u16 Sprite_080DA16A[] =
+const u16 Sprite_RuleSettings_VictoryCondIcon[] =
 {
     1,
     OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D6) + OAM2_LAYER(1) + OAM2_PAL(8),
 };
 
-const u16 Sprite_080DA172[] =
+const u16 Sprite_RuleSettings_AutoWeaponIcon[] =
 {
     1,
     OAM0_SHAPE_16x16, OAM1_SIZE_16x16, OAM2_CHR(0x2D8) + OAM2_LAYER(1) + OAM2_PAL(8),
 };
 
-const u16 * CONST_DATA gUnknown_085AAADC[] =
+const u16 * CONST_DATA SpriteArray_RuleSettingIcons[] =
 {
-    Sprite_080DA162,
-    Sprite_080DA16A,
-    Sprite_080DA172,
+    Sprite_RuleSettings_HideUnitsIcon,
+    Sprite_RuleSettings_VictoryCondIcon,
+    Sprite_RuleSettings_AutoWeaponIcon,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CDE8
-void sub_804CDE8(struct SioProc85AAAE8 * proc)
+void RuleSettingSprites_Interactive_Loop(struct RuleSettingSpriteDrawProc * proc)
 {
     int i;
 
-    int y1 = proc->unk_2c;
-    int y2 = proc->unk_2a;
+    int y1 = proc->yNew;
+    int y2 = proc->yPrevious;
     int y = (y1 + y2) * 12;
 
-    proc->unk_2a = proc->unk_2c;
+    proc->yPrevious = proc->yNew;
 
     for (i = 0; i < 3; i++)
     {
-        PutSprite(2, 0x20, 0x30 + i * 0x18, gUnknown_085AAADC[i], 0);
+        PutSprite(2, 32, 48 + i * 24, SpriteArray_RuleSettingIcons[i], 0);
     }
 
-    DisplayFrozenUiHand(0x20, y + 0x30);
-    DisplayUiHand(proc->unk_2e, proc->unk_30);
+    DisplayFrozenUiHand(32, y + 48);
+    DisplayUiHand(proc->xOption, proc->yOption);
 
-    PutLinkArenaButtonSpriteAt(0xc0, 0x10);
+    PutLinkArenaButtonSpriteAt(192, 16);
 
     return;
 }
 
 //! FE8U = 0x0804CE5C
-void sub_804CE5C(struct SioProc85AAAE8 * proc)
+void RuleSettingSprites_Static_Loop(struct RuleSettingSpriteDrawProc * proc)
 {
     int i;
 
     for (i = 0; i < 3; i++)
     {
-        PutSprite(2, 0x20, 0x30 + i * 0x18, gUnknown_085AAADC[i], 0);
+        PutSprite(2, 32, 48 + i * 24, SpriteArray_RuleSettingIcons[i], 0);
     }
 
     return;
@@ -1109,55 +1062,55 @@ void sub_804CE5C(struct SioProc85AAAE8 * proc)
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAAE8[] =
+struct ProcCmd CONST_DATA ProcScr_RuleSettingSpriteDraw_Interactive[] =
 {
     PROC_YIELD,
-    PROC_REPEAT(sub_804CDE8),
+    PROC_REPEAT(RuleSettingSprites_Interactive_Loop),
     PROC_END,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CE8C
-ProcPtr sub_804CE8C(ProcPtr parent)
+ProcPtr StartRuleSettingSpriteDrawInteractive(ProcPtr parent)
 {
-    struct SioProc85AAAE8 * proc;
+    struct RuleSettingSpriteDrawProc * proc;
 
-    Proc_EndEach(gUnknown_085AAAE8);
-    proc = Proc_Start(gUnknown_085AAAE8, parent);
+    Proc_EndEach(ProcScr_RuleSettingSpriteDraw_Interactive);
+    proc = Proc_Start(ProcScr_RuleSettingSpriteDraw_Interactive, parent);
 
-    proc->unk_2a = 0;
+    proc->yPrevious = 0;
 
     return proc;
 }
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAB00[] =
+struct ProcCmd CONST_DATA ProcScr_RuleSettingSpriteDraw_Static[] =
 {
     PROC_YIELD,
-    PROC_REPEAT(sub_804CE5C),
+    PROC_REPEAT(RuleSettingSprites_Static_Loop),
     PROC_END,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CEB0
-void sub_804CEB0(void)
+void StartRuleSettingSpriteDrawStatic(void)
 {
-    Proc_Start(gUnknown_085AAB00, PROC_TREE_3);
+    Proc_Start(ProcScr_RuleSettingSpriteDraw_Static, PROC_TREE_3);
     return;
 }
 
 // FIXME
 //! FE8U = 0x0804CEC4
-void sub_804CEC4(ProcPtr proc, s16 b, s16 c, s16 d)
+void UpdateRuleSettingSprites(ProcPtr proc, s16 b, s16 xOption, s16 yOption)
 {
-    struct SioProc85AAAE8 * param_1 = proc;
+    struct RuleSettingSpriteDrawProc * param_1 = proc;
 
-    param_1->unk_2c = b;
-    param_1->unk_2e = c;
-    param_1->unk_30 = d;
+    param_1->yNew = b;
+    param_1->xOption = xOption;
+    param_1->yOption = yOption;
 
     return;
 }
@@ -1165,31 +1118,31 @@ void sub_804CEC4(ProcPtr proc, s16 b, s16 c, s16 d)
 extern u16 gUnknown_085ADE28[];
 
 //! FE8U = 0x0804CECC
-void sub_804CECC(int idx)
+void UpdateSioMenuBurstGlow(int idx)
 {
     u16 * ptr = gUnknown_085ADE28;
 
     if (gUnk_Sio_0203DDDC == 0)
     {
-        gPaletteBuffer[0x16E] = ptr[idx];
+        PAL_OBJ_COLOR(6, 14) = ptr[idx];
         EnablePaletteSync();
     }
 
     return;
 }
 
-struct SioProc85AAB18
+struct SioMenuBurstFxProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2C */ int unk_2c;
-    /* 30 */ int unk_30;
+    /* 2C */ int xBase;
+    /* 30 */ int yBase;
     /* 34 */ STRUCT_PAD(0x34, 0x4C);
-    /* 4C */ s16 unk_4c;
+    /* 4C */ s16 glowPalIdx;
 };
 
 // clang-format off
 
-const u16 gUnknown_080DA17A[] =
+const u16 Sprite_SioMenuBurst_TopLeft[] =
 {
     3,
     OAM0_SHAPE_32x8, OAM1_SIZE_32x8, OAM2_CHR(0x2CE) + OAM2_PAL(6),
@@ -1197,7 +1150,7 @@ const u16 gUnknown_080DA17A[] =
     OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16, OAM2_CHR(0x2D3) + OAM2_PAL(6),
 };
 
-const u16 gUnknown_080DA18E[] =
+const u16 Sprite_SioMenuBurst_TopRight[] =
 {
     3,
     OAM0_SHAPE_32x8, OAM1_SIZE_32x8 + OAM1_X(16) + OAM1_HFLIP, OAM2_CHR(0x2CF) + OAM2_PAL(6),
@@ -1205,7 +1158,7 @@ const u16 gUnknown_080DA18E[] =
     OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16 + OAM1_X(72) + OAM1_HFLIP, OAM2_CHR(0x2D3) + OAM2_PAL(6),
 };
 
-const u16 gUnknown_080DA1A2[] =
+const u16 Sprite_SioMenuBurst_BottomLeft[] =
 {
     3,
     OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_VFLIP, OAM2_CHR(0x2CE) + OAM2_PAL(6),
@@ -1213,7 +1166,7 @@ const u16 gUnknown_080DA1A2[] =
     OAM0_SHAPE_8x16 + OAM0_Y(8), OAM1_SIZE_8x16 + OAM1_VFLIP, OAM2_CHR(0x2D3) + OAM2_PAL(6),
 };
 
-const u16 gUnknown_080DA1B6[] =
+const u16 Sprite_SioMenuBurst_BottomRight[] =
 {
     3,
     OAM0_SHAPE_32x8 + OAM0_Y(24), OAM1_SIZE_32x8 + OAM1_X(16) + OAM1_HFLIP + OAM1_VFLIP, OAM2_CHR(0x2CF) + OAM2_PAL(6),
@@ -1223,51 +1176,51 @@ const u16 gUnknown_080DA1B6[] =
 
 const s16 gUnknown_080DA1CA[] =
 {
-    0x0002, 0x0003,
-    0x0002, 0x0006,
-    0x0006, 0x0009,
-    0x0008, 0x000C,
-    0x0007, 0x000B,
-    0x0007, 0x000B,
-    0x0006, 0x000A,
-    0x0006, 0x0009,
-    0x0005, 0x0008,
-    0x0005, 0x0007,
-    0x0004, 0x0006,
-    0x0004, 0x0005,
-    0x0003, 0x0004,
-    0x0002, 0x0003,
-    0x0001, 0x0001,
-    0x0000, 0x0000,
+    2, 3,
+    2, 6,
+    6, 9,
+    8, 12,
+    7, 11,
+    7, 11,
+    6, 10,
+    6, 9,
+    5, 8,
+    5, 7,
+    4, 6,
+    4, 5,
+    3, 4,
+    2, 3,
+    1, 1,
+    0, 0,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CF04
-void sub_804CF04(struct SioProc85AAB18 * proc)
+void SioMenuBurstFx_Loop(struct SioMenuBurstFxProc * proc)
 {
     int idx;
     int x;
     int y;
     int r1;
 
-    idx = proc->unk_4c * 2;
+    idx = proc->glowPalIdx * 2;
 
-    sub_804CECC(proc->unk_4c);
+    UpdateSioMenuBurstGlow(proc->glowPalIdx);
 
     x = gUnknown_080DA1CA[idx + 1];
-    r1 = proc->unk_2c - x;
+    r1 = proc->xBase - x;
 
     y = gUnknown_080DA1CA[idx + 0];
 
-    PutSprite(2, r1, proc->unk_30 - y, gUnknown_080DA17A, 0);
-    PutSprite(2, proc->unk_2c + x + 0x10, proc->unk_30 - y, gUnknown_080DA18E, 0);
-    PutSprite(2, proc->unk_2c - x, proc->unk_30 + y, gUnknown_080DA1A2, 0);
-    PutSprite(2, proc->unk_2c + x + 0x10, proc->unk_30 + y, gUnknown_080DA1B6, 0);
+    PutSprite(2, r1, proc->yBase - y, Sprite_SioMenuBurst_TopLeft, 0);
+    PutSprite(2, proc->xBase + x + 16, proc->yBase - y, Sprite_SioMenuBurst_TopRight, 0);
+    PutSprite(2, proc->xBase - x, proc->yBase + y, Sprite_SioMenuBurst_BottomLeft, 0);
+    PutSprite(2, proc->xBase + x + 16, proc->yBase + y, Sprite_SioMenuBurst_BottomRight, 0);
 
-    proc->unk_4c++;
+    proc->glowPalIdx++;
 
-    if (proc->unk_4c == 0xf)
+    if (proc->glowPalIdx == 15)
     {
         Proc_Break(proc);
     }
@@ -1277,32 +1230,32 @@ void sub_804CF04(struct SioProc85AAB18 * proc)
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAB18[] =
+struct ProcCmd CONST_DATA ProcScr_SioMenuBurstFx[] =
 {
     PROC_YIELD,
-    PROC_REPEAT(sub_804CF04),
+    PROC_REPEAT(SioMenuBurstFx_Loop),
     PROC_END,
 };
 
 // clang-format on
 
 //! FE8U = 0x0804CFB8
-ProcPtr sub_804CFB8(ProcPtr parent, int b, int c)
+ProcPtr StartSioMenuBurstFx(ProcPtr parent, int x, int y)
 {
-    struct SioProc85AAB18 * proc = Proc_Start(gUnknown_085AAB18, parent);
+    struct SioMenuBurstFxProc * proc = Proc_Start(ProcScr_SioMenuBurstFx, parent);
 
-    proc->unk_2c = b;
-    proc->unk_30 = c;
-    proc->unk_4c = 0;
+    proc->xBase = x;
+    proc->yBase = y;
+    proc->glowPalIdx = 0;
 
     // return proc; // BUG
 }
 
-struct SioProc85AAB48
+struct LAMenuScrollBarProc
 {
     /* 00 */ PROC_HEADER;
-    /* 2C */ int unk_2c;
-    /* 30 */ int unk_30;
+    /* 2C */ int xBase;
+    /* 30 */ int yBase;
     /* 34 */ int unk_34;
     /* 38 */ int unk_38;
     /* 3C */ u8 unk_3c;
@@ -1310,14 +1263,14 @@ struct SioProc85AAB48
     /* 3E */ s16 unk_3e;
     /* 40 */ s16 unk_40;
     /* 42 */ u16 unk_42;
-    /* 44 */ u8 unk_44[2];
+    /* 44 */ u8 oam2Arrows[2];
 };
 
 //! FE8U = 0x0804CFE0
-void sub_804CFE0(struct SioProc85AAB48 * proc)
+void LinkArenaMenuScroll_Init(struct LAMenuScrollBarProc * proc)
 {
-    proc->unk_44[1] = 0;
-    proc->unk_44[0] = 0;
+    proc->oam2Arrows[1] = 0;
+    proc->oam2Arrows[0] = 0;
 
     proc->unk_38 = (proc->unk_34 * proc->unk_3d * 8) / proc->unk_3c;
     proc->unk_42 = (proc->unk_34 * 0x800) / (proc->unk_3c * 16);
@@ -1327,19 +1280,19 @@ void sub_804CFE0(struct SioProc85AAB48 * proc)
 
 // clang-format off
 
-u16 CONST_DATA gUnknown_085AAB30[] =
+u16 CONST_DATA Sprite_LAMenuScrollBar_UpArrow[] =
 {
     1,
     OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x257) + OAM2_LAYER(1) + OAM2_PAL(8),
 };
 
-u16 CONST_DATA gUnknown_085AAB38[] =
+u16 CONST_DATA Sprite_LAMenuScrollBar_DownArrow[] =
 {
     1,
     OAM0_SHAPE_8x8, OAM1_SIZE_8x8 + OAM1_VFLIP, OAM2_CHR(0x257) + OAM2_LAYER(1) + OAM2_PAL(8),
 };
 
-u16 CONST_DATA gUnknown_085AAB40[] =
+u16 CONST_DATA Sprite_LinkArenaMenuScrollBar[] =
 {
     1,
     OAM0_SHAPE_8x8, OAM1_SIZE_8x8, OAM2_CHR(0x25D) + OAM2_LAYER(1) + OAM2_PAL(8),
@@ -1348,65 +1301,71 @@ u16 CONST_DATA gUnknown_085AAB40[] =
 // clang-format on
 
 //! FE8U = 0x0804D01C
-void sub_804D01C(struct SioProc85AAB48 * proc)
+void LinkArenaMenuScroll_Loop(struct LAMenuScrollBarProc * proc)
 {
     int i;
     int buf[2];
 
-    int r8 = proc->unk_2c;
-    int sl = proc->unk_30 + 8;
+    int r8 = proc->xBase;
+    int sl = proc->yBase + 8;
     int sp_10 = proc->unk_38 >> 3;
     int sp_14 = 8 - (proc->unk_38 & 7);
     int sp_18 = (proc->unk_3e * proc->unk_42) >> 8;
 
     if (proc->unk_3c > proc->unk_3d)
     {
-        proc->unk_44[0]++;
-        proc->unk_44[1]++;
+        proc->oam2Arrows[0]++;
+        proc->oam2Arrows[1]++;
 
         if (proc->unk_3e < proc->unk_40)
         {
-            proc->unk_44[0] += 2;
+            proc->oam2Arrows[0] += 2;
         }
 
         if (proc->unk_3e > proc->unk_40)
         {
-            proc->unk_44[1] += 2;
+            proc->oam2Arrows[1] += 2;
         }
 
         for (i = 0; i < 2; i++)
         {
-            if (proc->unk_44[i] > 0x30)
+            if (proc->oam2Arrows[i] > 48)
             {
-                proc->unk_44[i] = 0;
+                proc->oam2Arrows[i] = 0;
             }
 
-            buf[i] = (proc->unk_44[i] / 8) % 6;
+            buf[i] = (proc->oam2Arrows[i] / 8) % 6;
         }
 
         if (proc->unk_3e != 0)
         {
-            PutSprite(3, r8, sl - 9, gUnknown_085AAB38, buf[0]);
+            PutSprite(3, r8, sl - 9, Sprite_LAMenuScrollBar_DownArrow, buf[0]);
         }
 
         if (((proc->unk_3e / 16) + proc->unk_3d) < proc->unk_3c)
         {
-            PutSprite(3, r8, proc->unk_34 * 8 + sl + 1, gUnknown_085AAB30, buf[1]);
+            PutSprite(3, r8, proc->unk_34 * 8 + sl + 1, Sprite_LAMenuScrollBar_UpArrow, buf[1]);
         }
 
+        // Put the "container" of the scroll bar
+
         for (i = 0; i < proc->unk_34; i++)
         {
-            PutSprite(2, r8, sl + i * 8, gUnknown_085AAB40, 1);
+            PutSprite(2, r8, sl + i * 8, Sprite_LinkArenaMenuScrollBar, 1);
         }
 
+        // Put the active scroll bar segments
+
         for (i = 0; i < sp_10; i++)
         {
-            PutSprite(2, r8, (sl + sp_18) + i * 8, gUnknown_085AAB40, 0);
+            PutSprite(2, r8, (sl + sp_18) + i * 8, Sprite_LinkArenaMenuScrollBar, 0);
         }
 
-        PutSprite(2, r8, (sl + sp_18) + (sp_10 * 8) - sp_14, gUnknown_085AAB40, 0);
-        PutSprite(2, r8, sl - 8, gUnknown_085AAB40, 2);
-        PutSprite(2, r8 + 0x2000, proc->unk_34 * 8 + sl - 7, gUnknown_085AAB40, 2);
+        // Put the "cap" of the scroll bar
+
+        PutSprite(2, r8, (sl + sp_18) + (sp_10 * 8) - sp_14, Sprite_LinkArenaMenuScrollBar, 0);
+        PutSprite(2, r8, sl - 8, Sprite_LinkArenaMenuScrollBar, 2);
+        PutSprite(2, r8 + OAM1_VFLIP, proc->unk_34 * 8 + sl - 7, Sprite_LinkArenaMenuScrollBar, 2);
 
         proc->unk_40 = proc->unk_3e;
     }
@@ -1416,11 +1375,11 @@ void sub_804D01C(struct SioProc85AAB48 * proc)
 
 // clang-format off
 
-struct ProcCmd CONST_DATA gUnknown_085AAB48[] =
+struct ProcCmd CONST_DATA ProcScr_LinkArenaMenuScrollBar[] =
 {
     PROC_YIELD,
-    PROC_CALL(sub_804CFE0),
-    PROC_REPEAT(sub_804D01C),
+    PROC_CALL(LinkArenaMenuScroll_Init),
+    PROC_REPEAT(LinkArenaMenuScroll_Loop),
 
     PROC_END,
 };
@@ -1428,15 +1387,15 @@ struct ProcCmd CONST_DATA gUnknown_085AAB48[] =
 // clang-format on
 
 //! FE8U = 0x0804D1E0
-void sub_804D1E0(int a, int b, u8 c, u8 d, u8 e, ProcPtr parent)
+void StartLinkArenaMenuScrollBar(int xBase, int yBase, u8 c, u8 d, u8 e, ProcPtr parent)
 {
-    struct SioProc85AAB48 * proc;
+    struct LAMenuScrollBarProc * proc;
 
-    Proc_EndEach(gUnknown_085AAB48);
-    proc = Proc_Start(gUnknown_085AAB48, parent);
+    Proc_EndEach(ProcScr_LinkArenaMenuScrollBar);
+    proc = Proc_Start(ProcScr_LinkArenaMenuScrollBar, parent);
 
-    proc->unk_2c = a;
-    proc->unk_30 = b;
+    proc->xBase = xBase;
+    proc->yBase = yBase;
 
     proc->unk_34 = d * 2 - 2;
 
@@ -1449,9 +1408,9 @@ void sub_804D1E0(int a, int b, u8 c, u8 d, u8 e, ProcPtr parent)
 }
 
 //! FE8U = 0x0804D24C
-void sub_804D24C(u8 a, s16 b)
+void UpdateLinkArenaMenuScrollBar(u8 a, s16 b)
 {
-    struct SioProc85AAB48 * proc = Proc_Find(gUnknown_085AAB48);
+    struct LAMenuScrollBarProc * proc = Proc_Find(ProcScr_LinkArenaMenuScrollBar);
 
     if (proc == NULL)
     {