summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatoMew <SatoMew@users.noreply.github.com>2019-04-09 14:52:56 +0100
committerSatoMew <SatoMew@users.noreply.github.com>2019-04-09 14:52:56 +0100
commit542d15bf7036c328dc54c3775c68ce64f64d8f80 (patch)
tree345d03e5e4854964513d0040cca1d150fbbf944e
parentd0a68de6e0606617027ab0437f2da1a414deb2da (diff)
decompile roulette_util.c
-rw-r--r--asm/roulette_util.s1447
-rw-r--r--ld_script.txt2
-rw-r--r--src/roulette_util.c526
3 files changed, 527 insertions, 1448 deletions
diff --git a/asm/roulette_util.s b/asm/roulette_util.s
deleted file mode 100644
index 532bf4684..000000000
--- a/asm/roulette_util.s
+++ /dev/null
@@ -1,1447 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80D8BE4
-sub_80D8BE4: @ 80D8BE4
- push {lr}
- movs r1, 0
- strb r1, [r0]
- strh r1, [r0, 0x2]
- adds r0, 0x4
- movs r2, 0xC0
- bl memset
- pop {r0}
- bx r0
- thumb_func_end sub_80D8BE4
-
- thumb_func_start sub_80D8BF8
-sub_80D8BF8: @ 80D8BF8
- push {r4-r7,lr}
- adds r3, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- cmp r6, 0xF
- bhi _080D8C14
- lsls r0, r6, 1
- adds r0, r6
- lsls r0, 2
- adds r5, r3, r0
- ldrb r7, [r5, 0x4]
- lsrs r0, r7, 7
- cmp r0, 0
- beq _080D8C18
-_080D8C14:
- movs r0, 0xFF
- b _080D8C76
-_080D8C18:
- ldrh r0, [r2]
- movs r4, 0
- strh r0, [r5, 0x8]
- ldrh r0, [r2, 0x2]
- strh r0, [r5, 0xA]
- ldrb r0, [r2, 0x4]
- strb r0, [r5, 0xC]
- ldrb r0, [r2, 0x5]
- strb r0, [r5, 0xD]
- ldrb r0, [r2, 0x6]
- strb r0, [r5, 0xE]
- ldrb r3, [r2, 0x7]
- lsls r0, r3, 27
- lsrs r0, 27
- ldrb r2, [r5, 0xF]
- movs r1, 0x20
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- movs r0, 0x60
- ands r0, r3
- movs r2, 0x61
- negs r2, r2
- ands r1, r2
- orrs r1, r0
- lsls r3, 24
- asrs r3, 31
- lsls r3, 7
- movs r0, 0x7F
- ands r1, r0
- orrs r1, r3
- strb r1, [r5, 0xF]
- subs r0, 0xFF
- ands r0, r7
- movs r2, 0x80
- orrs r0, r2
- strb r0, [r5, 0x4]
- strb r4, [r5, 0x6]
- strb r4, [r5, 0x5]
- lsls r1, 24
- cmp r1, 0
- bge _080D8C70
- movs r0, 0xFF
- b _080D8C72
-_080D8C70:
- movs r0, 0x1
-_080D8C72:
- strb r0, [r5, 0x7]
- adds r0, r6, 0
-_080D8C76:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80D8BF8
-
- thumb_func_start sub_80D8C7C
-sub_80D8C7C: @ 80D8C7C
- push {r4,lr}
- adds r2, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r4, r1, 0
- cmp r4, 0xF
- bhi _080D8CA8
- lsls r0, r4, 1
- adds r0, r4
- lsls r0, 2
- adds r1, r2, r0
- ldrb r0, [r1, 0x4]
- lsrs r0, 7
- cmp r0, 0
- beq _080D8CA8
- adds r0, r1, 0x4
- movs r1, 0
- movs r2, 0xC
- bl memset
- adds r0, r4, 0
- b _080D8CAA
-_080D8CA8:
- movs r0, 0xFF
-_080D8CAA:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80D8C7C
-
- thumb_func_start sub_80D8CB0
-sub_80D8CB0: @ 80D8CB0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r5, r0, 0
- movs r0, 0
- mov r12, r0
- ldrb r1, [r5, 0x8]
- cmp r12, r1
- bcc _080D8CC8
- b _080D8E60
-_080D8CC8:
- movs r7, 0x1F
- ldr r0, _080D8CF8 @ =0xfffffc1f
- mov r10, r0
- movs r1, 0x7D
- negs r1, r1
- mov r9, r1
- movs r0, 0x1F
- mov r8, r0
-_080D8CD8:
- ldrh r0, [r5, 0x6]
- add r0, r12
- lsls r0, 1
- ldr r1, _080D8CFC @ =gPlttBufferFaded
- adds r3, r0, r1
- ldr r1, _080D8D00 @ =gPlttBufferUnfaded
- adds r6, r0, r1
- ldrb r0, [r5]
- lsls r0, 25
- lsrs r0, 25
- cmp r0, 0x1
- beq _080D8D04
- cmp r0, 0x2
- beq _080D8D62
- b _080D8E4E
- .align 2, 0
-_080D8CF8: .4byte 0xfffffc1f
-_080D8CFC: .4byte gPlttBufferFaded
-_080D8D00: .4byte gPlttBufferUnfaded
-_080D8D04:
- ldr r0, [r3]
- lsls r2, r0, 27
- lsrs r0, r2, 27
- movs r1, 0x3
- ldrsb r1, [r5, r1]
- adds r0, r1
- cmp r0, 0x1F
- bhi _080D8D26
- lsrs r0, r2, 27
- adds r0, r1
- ands r0, r7
- ldrb r2, [r3]
- movs r1, 0x20
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- strb r1, [r3]
-_080D8D26:
- ldr r0, [r3]
- lsls r2, r0, 22
- lsrs r0, r2, 27
- movs r1, 0x3
- ldrsb r1, [r5, r1]
- adds r0, r1
- cmp r0, 0x1F
- bhi _080D8D4A
- lsrs r0, r2, 27
- adds r0, r1
- mov r1, r8
- ands r0, r1
- lsls r0, 5
- ldrh r2, [r3]
- mov r1, r10
- ands r1, r2
- orrs r1, r0
- strh r1, [r3]
-_080D8D4A:
- ldr r0, [r3]
- lsls r2, r0, 17
- lsrs r0, r2, 27
- movs r1, 0x3
- ldrsb r1, [r5, r1]
- adds r0, r1
- cmp r0, 0x1F
- bls _080D8D5C
- b _080D8E4E
-_080D8D5C:
- lsrs r0, r2, 27
- adds r0, r1
- b _080D8E40
-_080D8D62:
- movs r0, 0x3
- ldrsb r0, [r5, r0]
- cmp r0, 0
- bge _080D8DD4
- ldr r0, [r3]
- lsls r4, r0, 27
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 27
- lsrs r0, 27
- cmp r1, r0
- blt _080D8D92
- lsrs r0, r4, 27
- adds r0, r2
- ands r0, r7
- ldrb r2, [r3]
- movs r1, 0x20
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- strb r1, [r3]
-_080D8D92:
- ldr r0, [r3]
- lsls r4, r0, 22
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 22
- lsrs r0, 27
- cmp r1, r0
- blt _080D8DBC
- lsrs r0, r4, 27
- adds r0, r2
- mov r1, r8
- ands r0, r1
- lsls r0, 5
- ldrh r2, [r3]
- mov r1, r10
- ands r1, r2
- orrs r1, r0
- strh r1, [r3]
-_080D8DBC:
- ldr r0, [r3]
- lsls r4, r0, 17
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 17
- lsrs r0, 27
- cmp r1, r0
- blt _080D8E4E
- b _080D8E3C
-_080D8DD4:
- ldr r0, [r3]
- lsls r4, r0, 27
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 27
- lsrs r0, 27
- cmp r1, r0
- bgt _080D8DFC
- lsrs r0, r4, 27
- adds r0, r2
- ands r0, r7
- ldrb r2, [r3]
- movs r1, 0x20
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- strb r1, [r3]
-_080D8DFC:
- ldr r0, [r3]
- lsls r4, r0, 22
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 22
- lsrs r0, 27
- cmp r1, r0
- bgt _080D8E26
- lsrs r0, r4, 27
- adds r0, r2
- mov r1, r8
- ands r0, r1
- lsls r0, 5
- ldrh r2, [r3]
- mov r1, r10
- ands r1, r2
- orrs r1, r0
- strh r1, [r3]
-_080D8E26:
- ldr r0, [r3]
- lsls r4, r0, 17
- lsrs r1, r4, 27
- movs r2, 0x3
- ldrsb r2, [r5, r2]
- adds r1, r2
- ldr r0, [r6]
- lsls r0, 17
- lsrs r0, 27
- cmp r1, r0
- bgt _080D8E4E
-_080D8E3C:
- lsrs r0, r4, 27
- adds r0, r2
-_080D8E40:
- ands r0, r7
- lsls r0, 2
- ldrb r2, [r3, 0x1]
- mov r1, r9
- ands r1, r2
- orrs r1, r0
- strb r1, [r3, 0x1]
-_080D8E4E:
- mov r0, r12
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- mov r12, r0
- ldrb r0, [r5, 0x8]
- cmp r12, r0
- bcs _080D8E60
- b _080D8CD8
-_080D8E60:
- ldrb r1, [r5, 0x2]
- adds r0, r1, 0x1
- strb r0, [r5, 0x2]
- ldrb r0, [r5, 0xB]
- lsls r0, 27
- lsls r1, 24
- asrs r0, 3
- cmp r1, r0
- beq _080D8E76
- movs r0, 0
- b _080D8EAA
-_080D8E76:
- movs r0, 0
- strb r0, [r5, 0x2]
- movs r0, 0x3
- ldrsb r0, [r5, r0]
- negs r0, r0
- strb r0, [r5, 0x3]
- ldrb r2, [r5]
- movs r1, 0x7F
- movs r0, 0x7F
- ands r0, r2
- cmp r0, 0x1
- bne _080D8E96
- lsls r0, r2, 25
- lsrs r0, 25
- adds r0, 0x1
- b _080D8E9C
-_080D8E96:
- lsls r0, r2, 25
- lsrs r0, 25
- subs r0, 0x1
-_080D8E9C:
- ands r0, r1
- movs r1, 0x80
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- strb r1, [r5]
- movs r0, 0x1
-_080D8EAA:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80D8CB0
-
- thumb_func_start sub_80D8EB8
-sub_80D8EB8: @ 80D8EB8
- push {r4,r5,lr}
- adds r3, r0, 0
- movs r2, 0
- ldrb r0, [r3]
- lsls r0, 25
- lsrs r0, 25
- cmp r0, 0x1
- beq _080D8ECE
- cmp r0, 0x2
- beq _080D8EFC
- b _080D8F36
-_080D8ECE:
- ldrb r0, [r3, 0x8]
- cmp r2, r0
- bcs _080D8EEE
- ldr r4, _080D8EF8 @ =gPlttBufferFaded
-_080D8ED6:
- ldrh r0, [r3, 0x6]
- adds r0, r2
- lsls r0, 1
- adds r0, r4
- ldrh r1, [r3, 0x4]
- strh r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- ldrb r0, [r3, 0x8]
- cmp r2, r0
- bcc _080D8ED6
-_080D8EEE:
- ldrb r2, [r3]
- lsls r1, r2, 25
- lsrs r1, 25
- adds r1, 0x1
- b _080D8F28
- .align 2, 0
-_080D8EF8: .4byte gPlttBufferFaded
-_080D8EFC:
- ldrb r0, [r3, 0x8]
- cmp r2, r0
- bcs _080D8F20
- ldr r5, _080D8F40 @ =gPlttBufferFaded
- ldr r4, _080D8F44 @ =gPlttBufferUnfaded
-_080D8F06:
- ldrh r0, [r3, 0x6]
- adds r0, r2
- lsls r0, 1
- adds r1, r0, r5
- adds r0, r4
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- ldrb r0, [r3, 0x8]
- cmp r2, r0
- bcc _080D8F06
-_080D8F20:
- ldrb r2, [r3]
- lsls r1, r2, 25
- lsrs r1, 25
- subs r1, 0x1
-_080D8F28:
- movs r0, 0x7F
- ands r1, r0
- movs r0, 0x80
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r3]
-_080D8F36:
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D8F40: .4byte gPlttBufferFaded
-_080D8F44: .4byte gPlttBufferUnfaded
- thumb_func_end sub_80D8EB8
-
- thumb_func_start task_tutorial_controls_fadein
-task_tutorial_controls_fadein: @ 80D8F48
- push {r4-r6,lr}
- adds r4, r0, 0
- movs r5, 0
- ldrb r0, [r4]
- cmp r0, 0
- beq _080D8FAC
-_080D8F54:
- ldrh r0, [r4, 0x2]
- asrs r0, r5
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _080D8FA2
- lsls r1, r5, 1
- adds r0, r1, r5
- lsls r3, r0, 2
- adds r2, r4, r3
- ldrb r0, [r2, 0x5]
- subs r0, 0x1
- strb r0, [r2, 0x5]
- lsls r0, 24
- lsrs r0, 24
- adds r6, r1, 0
- cmp r0, 0xFF
- bne _080D8FA2
- ldrh r0, [r2, 0x8]
- movs r2, 0x80
- lsls r2, 8
- adds r1, r2, 0
- ands r0, r1
- cmp r0, 0
- beq _080D8F90
- adds r0, r3, 0x4
- adds r0, r4, r0
- bl sub_80D8CB0
- b _080D8F98
-_080D8F90:
- adds r0, r3, 0x4
- adds r0, r4, r0
- bl sub_80D8EB8
-_080D8F98:
- adds r0, r6, r5
- lsls r0, 2
- adds r0, r4, r0
- ldrb r1, [r0, 0xD]
- strb r1, [r0, 0x5]
-_080D8FA2:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0xF
- bls _080D8F54
-_080D8FAC:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end task_tutorial_controls_fadein
-
- thumb_func_start sub_80D8FB4
-sub_80D8FB4: @ 80D8FB4
- push {r4-r7,lr}
- adds r3, r0, 0
- lsls r1, 16
- lsrs r6, r1, 16
- movs r4, 0
- ldrb r0, [r3]
- adds r0, 0x1
- strb r0, [r3]
- movs r5, 0x1
- movs r7, 0x80
- negs r7, r7
-_080D8FCA:
- adds r0, r6, 0
- asrs r0, r4
- ands r0, r5
- cmp r0, 0
- beq _080D8FF8
- lsls r0, r4, 1
- adds r0, r4
- lsls r0, 2
- adds r2, r3, r0
- ldrb r0, [r2, 0x4]
- lsrs r0, 7
- cmp r0, 0
- beq _080D8FF8
- adds r0, r5, 0
- lsls r0, r4
- ldrh r1, [r3, 0x2]
- orrs r0, r1
- strh r0, [r3, 0x2]
- ldrb r1, [r2, 0x4]
- adds r0, r7, 0
- ands r0, r1
- orrs r0, r5
- strb r0, [r2, 0x4]
-_080D8FF8:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xF
- bls _080D8FCA
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D8FB4
-
- thumb_func_start sub_80D9008
-sub_80D9008: @ 80D9008
- push {r4-r7,lr}
- sub sp, 0x4
- adds r6, r0, 0
- lsls r1, 16
- lsrs r7, r1, 16
- movs r5, 0
- movs r3, 0x1
-_080D9016:
- ldrh r0, [r6, 0x2]
- asrs r0, r5
- ands r0, r3
- cmp r0, 0
- beq _080D907E
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 2
- adds r4, r6, r0
- ldrb r0, [r4, 0x4]
- lsrs r0, 7
- cmp r0, 0
- beq _080D907E
- adds r0, r7, 0
- asrs r0, r5
- ands r0, r3
- cmp r0, 0
- beq _080D907E
- ldrh r1, [r4, 0xA]
- lsls r1, 1
- ldr r0, _080D9074 @ =gPlttBufferFaded
- adds r0, r1, r0
- ldr r2, _080D9078 @ =gPlttBufferUnfaded
- adds r1, r2
- ldrb r2, [r4, 0xC]
- lsls r2, 1
- str r3, [sp]
- bl memcpy
- ldrb r0, [r4, 0x4]
- movs r2, 0x80
- negs r2, r2
- adds r1, r2, 0
- ands r0, r1
- strb r0, [r4, 0x4]
- movs r0, 0
- strb r0, [r4, 0x6]
- strb r0, [r4, 0x5]
- ldrb r0, [r4, 0xF]
- lsls r0, 24
- ldr r3, [sp]
- cmp r0, 0
- bge _080D907C
- movs r0, 0xFF
- strb r0, [r4, 0x7]
- b _080D907E
- .align 2, 0
-_080D9074: .4byte gPlttBufferFaded
-_080D9078: .4byte gPlttBufferUnfaded
-_080D907C:
- strb r3, [r4, 0x7]
-_080D907E:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0xF
- bls _080D9016
- ldr r0, _080D9094 @ =0x0000ffff
- cmp r7, r0
- bne _080D9098
- movs r0, 0
- strb r0, [r6]
- b _080D909C
- .align 2, 0
-_080D9094: .4byte 0x0000ffff
-_080D9098:
- ldrh r0, [r6, 0x2]
- bics r0, r7
-_080D909C:
- strh r0, [r6, 0x2]
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D9008
-
- thumb_func_start sub_80D90A8
-sub_80D90A8: @ 80D90A8
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r4, 0
- strh r4, [r5]
- adds r0, r5, 0x4
- movs r1, 0
- movs r2, 0xC0
- bl memset
-_080D90BA:
- lsls r0, r4, 1
- adds r0, r4
- lsls r0, 2
- adds r0, r5, r0
- strb r4, [r0, 0x4]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xF
- bls _080D90BA
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80D90A8
-
- thumb_func_start sub_80D90D4
-sub_80D90D4: @ 80D90D4
- push {r4,r5,lr}
- adds r2, r0, 0
- adds r5, r1, 0
- movs r3, 0
- movs r4, 0
- ldrb r0, [r2, 0x5]
- lsrs r0, 7
- cmp r0, 0
- bne _080D90EA
- adds r4, r2, 0x4
- b _080D9108
-_080D90EA:
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0xF
- bhi _080D9108
- lsls r0, r3, 1
- adds r0, r3
- lsls r1, r0, 2
- adds r0, r2, r1
- ldrb r0, [r0, 0x5]
- lsrs r0, 7
- cmp r0, 0
- bne _080D90EA
- adds r0, r1, 0x4
- adds r4, r2, r0
-_080D9108:
- cmp r4, 0
- beq _080D9136
- ldrb r1, [r4, 0x1]
- movs r0, 0x10
- negs r0, r0
- ands r0, r1
- movs r1, 0x11
- negs r1, r1
- ands r0, r1
- movs r1, 0x40
- orrs r0, r1
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r4, 0x1]
- movs r0, 0
- strb r0, [r4, 0x2]
- strb r0, [r4, 0x3]
- adds r1, r4, 0x4
- adds r0, r5, 0
- ldm r0!, {r2,r4}
- stm r1!, {r2,r4}
- adds r0, r3, 0
- b _080D9138
-_080D9136:
- movs r0, 0xFF
-_080D9138:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80D90D4
-
- thumb_func_start sub_80D9140
-sub_80D9140: @ 80D9140
- push {r4,r5,lr}
- adds r4, r0, 0
- ldrb r1, [r4, 0x1]
- movs r2, 0x40
- adds r0, r2, 0
- ands r0, r1
- cmp r0, 0
- bne _080D9182
- ldrb r1, [r4, 0xB]
- adds r0, r2, 0
- ands r0, r1
- cmp r0, 0
- beq _080D9182
- ldrh r2, [r4, 0x6]
- ldrb r0, [r4, 0x8]
- adds r0, r2, r0
- cmp r2, r0
- bge _080D9182
- ldr r5, _080D91B4 @ =gPlttBufferFaded
- ldr r3, _080D91B8 @ =gPlttBufferUnfaded
-_080D9168:
- lsls r0, r2, 1
- adds r1, r0, r5
- adds r0, r3
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- ldrh r0, [r4, 0x6]
- ldrb r1, [r4, 0x8]
- adds r0, r1
- cmp r2, r0
- blt _080D9168
-_080D9182:
- adds r0, r4, 0x4
- movs r1, 0
- movs r2, 0x8
- bl memset
- ldrb r1, [r4, 0x1]
- movs r0, 0x10
- negs r0, r0
- ands r0, r1
- movs r1, 0x11
- negs r1, r1
- ands r0, r1
- subs r1, 0x10
- ands r0, r1
- movs r1, 0x40
- orrs r0, r1
- movs r1, 0x7F
- ands r0, r1
- strb r0, [r4, 0x1]
- movs r0, 0
- strb r0, [r4, 0x3]
- strb r0, [r4, 0x2]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D91B4: .4byte gPlttBufferFaded
-_080D91B8: .4byte gPlttBufferUnfaded
- thumb_func_end sub_80D9140
-
- thumb_func_start sub_80D91BC
-sub_80D91BC: @ 80D91BC
- push {r4-r6,lr}
- adds r6, r0, 0
- lsls r1, 16
- lsrs r4, r1, 16
- lsls r2, 24
- movs r5, 0
- cmp r2, 0
- bne _080D91E0
- movs r1, 0xF
- ands r1, r4
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 2
- adds r0, 0x4
- adds r0, r6, r0
- bl sub_80D9140
- b _080D920C
-_080D91E0:
- movs r0, 0x1
- ands r0, r4
- cmp r0, 0
- beq _080D9200
- lsls r0, r5, 1
- adds r0, r5
- lsls r1, r0, 2
- adds r0, r6, r1
- ldrb r0, [r0, 0x5]
- lsrs r0, 7
- cmp r0, 0
- beq _080D9200
- adds r0, r1, 0x4
- adds r0, r6, r0
- bl sub_80D9140
-_080D9200:
- lsrs r4, 1
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0xF
- bls _080D91E0
-_080D920C:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_80D91BC
-
- thumb_func_start sub_80D9214
-sub_80D9214: @ 80D9214
- push {r4-r7,lr}
- adds r5, r0, 0
- lsls r1, 16
- lsrs r4, r1, 16
- lsls r2, 24
- movs r3, 0
- cmp r2, 0
- bne _080D9248
- movs r0, 0xF
- adds r3, r0, 0
- ands r3, r4
- lsls r1, r3, 1
- adds r1, r3
- lsls r1, 2
- adds r1, r5, r1
- ldrb r2, [r1, 0x5]
- movs r0, 0x41
- negs r0, r0
- ands r0, r2
- strb r0, [r1, 0x5]
- movs r0, 0x1
- lsls r0, r3
- ldrh r1, [r5]
- orrs r0, r1
- strh r0, [r5]
- b _080D928C
-_080D9248:
- movs r6, 0x1
- movs r7, 0x41
- negs r7, r7
-_080D924E:
- adds r0, r4, 0
- ands r0, r6
- cmp r0, 0
- beq _080D926C
- lsls r0, r3, 1
- adds r0, r3
- lsls r0, 2
- adds r2, r5, r0
- ldrb r1, [r2, 0x5]
- lsrs r0, r1, 7
- cmp r0, 0
- beq _080D926C
- lsls r0, r1, 25
- cmp r0, 0
- blt _080D9272
-_080D926C:
- lsls r0, r4, 17
- lsrs r4, r0, 16
- b _080D9282
-_080D9272:
- adds r0, r7, 0
- ands r0, r1
- strb r0, [r2, 0x5]
- adds r0, r6, 0
- lsls r0, r3
- ldrh r1, [r5]
- orrs r0, r1
- strh r0, [r5]
-_080D9282:
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0xF
- bls _080D924E
-_080D928C:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D9214
-
- thumb_func_start sub_80D9294
-sub_80D9294: @ 80D9294
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- mov r8, r0
- lsls r1, 16
- lsrs r7, r1, 16
- lsls r2, 24
- movs r0, 0
- mov r12, r0
- cmp r2, 0
- bne _080D931C
- movs r1, 0xF
- ands r1, r7
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 2
- adds r0, 0x4
- mov r1, r8
- adds r3, r1, r0
- ldrb r1, [r3, 0x1]
- movs r0, 0xC0
- ands r0, r1
- cmp r0, 0x80
- bne _080D93A6
- ldrb r1, [r3, 0xB]
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- beq _080D92FA
- ldrh r2, [r3, 0x6]
- ldrb r0, [r3, 0x8]
- adds r0, r2, r0
- cmp r2, r0
- bge _080D92FA
- ldr r5, _080D9314 @ =gPlttBufferFaded
- ldr r4, _080D9318 @ =gPlttBufferUnfaded
-_080D92E0:
- lsls r0, r2, 1
- adds r1, r0, r5
- adds r0, r4
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- ldrh r0, [r3, 0x6]
- ldrb r1, [r3, 0x8]
- adds r0, r1
- cmp r2, r0
- blt _080D92E0
-_080D92FA:
- ldrb r0, [r3, 0x1]
- movs r1, 0x40
- orrs r0, r1
- strb r0, [r3, 0x1]
- movs r1, 0x1
- mov r2, r12
- lsls r1, r2
- mov r2, r8
- ldrh r0, [r2]
- bics r0, r1
- strh r0, [r2]
- b _080D93A6
- .align 2, 0
-_080D9314: .4byte gPlttBufferFaded
-_080D9318: .4byte gPlttBufferUnfaded
-_080D931C:
- movs r0, 0x1
- mov r9, r0
- movs r1, 0x40
- mov r10, r1
-_080D9324:
- mov r2, r12
- lsls r0, r2, 1
- add r0, r12
- lsls r0, 2
- adds r0, 0x4
- mov r1, r8
- adds r3, r1, r0
- adds r0, r7, 0
- mov r2, r9
- ands r0, r2
- cmp r0, 0
- beq _080D9346
- ldrb r1, [r3, 0x1]
- movs r0, 0xC0
- ands r0, r1
- cmp r0, 0x80
- beq _080D9350
-_080D9346:
- lsls r0, r7, 17
- lsrs r7, r0, 16
- mov r5, r12
- adds r5, 0x1
- b _080D939C
-_080D9350:
- ldrb r1, [r3, 0xB]
- mov r0, r10
- ands r0, r1
- mov r5, r12
- adds r5, 0x1
- cmp r0, 0
- beq _080D9386
- ldrh r2, [r3, 0x6]
- ldrb r0, [r3, 0x8]
- adds r0, r2, r0
- cmp r2, r0
- bge _080D9386
- ldr r6, _080D93B4 @ =gPlttBufferFaded
- ldr r4, _080D93B8 @ =gPlttBufferUnfaded
-_080D936C:
- lsls r0, r2, 1
- adds r1, r0, r6
- adds r0, r4
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- ldrh r0, [r3, 0x6]
- ldrb r1, [r3, 0x8]
- adds r0, r1
- cmp r2, r0
- blt _080D936C
-_080D9386:
- ldrb r1, [r3, 0x1]
- mov r0, r10
- orrs r0, r1
- strb r0, [r3, 0x1]
- mov r1, r9
- mov r0, r12
- lsls r1, r0
- mov r2, r8
- ldrh r0, [r2]
- bics r0, r1
- strh r0, [r2]
-_080D939C:
- lsls r0, r5, 24
- lsrs r0, 24
- mov r12, r0
- cmp r0, 0xF
- bls _080D9324
-_080D93A6:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080D93B4: .4byte gPlttBufferFaded
-_080D93B8: .4byte gPlttBufferUnfaded
- thumb_func_end sub_80D9294
-
- thumb_func_start sub_80D93BC
-sub_80D93BC: @ 80D93BC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- str r0, [sp]
- movs r0, 0
- mov r10, r0
- ldr r1, [sp]
- ldrh r0, [r1]
- cmp r0, 0
- bne _080D93D8
- b _080D9562
-_080D93D8:
- movs r2, 0xF
- mov r9, r2
- movs r3, 0x10
- negs r3, r3
- mov r8, r3
- movs r7, 0x1
-_080D93E4:
- mov r5, r10
- lsls r0, r5, 1
- add r0, r10
- lsls r0, 2
- adds r0, 0x4
- ldr r1, [sp]
- adds r4, r1, r0
- ldrb r2, [r4, 0x1]
- movs r3, 0xC0
- ands r3, r2
- cmp r3, 0x80
- beq _080D93FE
- b _080D9552
-_080D93FE:
- ldr r0, _080D944C @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- adds r0, r3, 0
- ands r0, r1
- cmp r0, 0
- beq _080D9414
- ldrb r0, [r4, 0xB]
- ands r3, r0
- cmp r3, 0
- beq _080D9414
- b _080D9552
-_080D9414:
- ldrb r0, [r4, 0x2]
- subs r0, 0x1
- strb r0, [r4, 0x2]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xFF
- beq _080D9424
- b _080D9552
-_080D9424:
- ldrb r0, [r4, 0x9]
- strb r0, [r4, 0x2]
- ldrh r0, [r4, 0x6]
- ldrb r1, [r4, 0x8]
- lsls r2, 28
- lsrs r2, 28
- ldrh r3, [r4, 0x4]
- bl BlendPalette
- ldrb r5, [r4, 0xB]
- lsls r0, r5, 26
- asrs r0, 30
- cmp r0, 0x1
- beq _080D9482
- cmp r0, 0x1
- bgt _080D9450
- cmp r0, 0
- beq _080D9456
- b _080D953C
- .align 2, 0
-_080D944C: .4byte gPaletteFade
-_080D9450:
- cmp r0, 0x2
- beq _080D94FE
- b _080D953C
-_080D9456:
- ldrb r2, [r4, 0x1]
- lsls r1, r2, 28
- lsrs r0, r1, 28
- adds r0, 0x1
- mov r3, r9
- ands r0, r3
- mov r6, r8
- adds r3, r6, 0
- ands r3, r2
- orrs r3, r0
- strb r3, [r4, 0x1]
- lsrs r1, 28
- lsls r0, r5, 28
- asrs r0, 28
- cmp r1, r0
- bne _080D953C
- ldrb r0, [r4, 0x3]
- adds r0, 0x1
- strb r0, [r4, 0x3]
- ands r3, r6
- strb r3, [r4, 0x1]
- b _080D953C
-_080D9482:
- ldrb r3, [r4, 0x1]
- movs r0, 0x10
- ands r0, r3
- cmp r0, 0
- beq _080D94C0
- lsls r0, r3, 28
- lsrs r0, 28
- subs r0, 0x1
- mov r5, r9
- ands r0, r5
- mov r2, r8
- ands r2, r3
- orrs r2, r0
- strb r2, [r4, 0x1]
- cmp r0, 0
- bne _080D953C
- ldrb r0, [r4, 0x3]
- adds r0, 0x1
- strb r0, [r4, 0x3]
- lsls r0, r2, 27
- lsrs r0, 31
- eors r0, r7
- ands r0, r7
- lsls r0, 4
- movs r3, 0x11
- negs r3, r3
- adds r1, r3, 0
- ands r2, r1
- orrs r2, r0
- strb r2, [r4, 0x1]
- b _080D953C
-_080D94C0:
- lsls r0, r5, 28
- asrs r0, 28
- subs r0, 0x1
- mov r5, r9
- ands r0, r5
- lsls r2, r3, 28
- lsrs r1, r2, 28
- adds r1, 0x1
- ands r1, r5
- mov r5, r8
- ands r3, r5
- orrs r3, r1
- strb r3, [r4, 0x1]
- lsrs r2, 28
- cmp r2, r0
- bne _080D953C
- ldrb r0, [r4, 0x3]
- adds r0, 0x1
- strb r0, [r4, 0x3]
- lsls r0, r3, 27
- lsrs r0, 31
- eors r0, r7
- ands r0, r7
- lsls r0, 4
- movs r2, 0x11
- negs r2, r2
- adds r1, r2, 0
- ands r3, r1
- orrs r3, r0
- strb r3, [r4, 0x1]
- b _080D953C
-_080D94FE:
- ldrb r2, [r4, 0x1]
- movs r0, 0x10
- ands r0, r2
- cmp r0, 0
- beq _080D950E
- mov r0, r8
- ands r0, r2
- b _080D951C
-_080D950E:
- lsls r1, r5, 28
- asrs r1, 28
- mov r3, r9
- ands r1, r3
- mov r0, r8
- ands r0, r2
- orrs r0, r1
-_080D951C:
- strb r0, [r4, 0x1]
- ldrb r2, [r4, 0x1]
- lsls r0, r2, 27
- lsrs r0, 31
- eors r0, r7
- ands r0, r7
- lsls r0, 4
- movs r5, 0x11
- negs r5, r5
- adds r1, r5, 0
- ands r2, r1
- orrs r2, r0
- strb r2, [r4, 0x1]
- ldrb r0, [r4, 0x3]
- adds r0, 0x1
- strb r0, [r4, 0x3]
-_080D953C:
- ldrb r1, [r4, 0xA]
- cmp r1, 0xFF
- beq _080D9552
- ldrb r0, [r4, 0x3]
- cmp r0, r1
- bne _080D9552
- ldrb r1, [r4]
- ldr r0, [sp]
- movs r2, 0
- bl sub_80D9294
-_080D9552:
- mov r0, r10
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- mov r10, r0
- cmp r0, 0xF
- bhi _080D9562
- b _080D93E4
-_080D9562:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D93BC
-
- thumb_func_start sub_80D9574
-sub_80D9574: @ 80D9574
- push {r4-r7,lr}
- adds r6, r0, 0
- ldr r0, [sp, 0x14]
- ldr r4, [sp, 0x18]
- lsls r1, 16
- lsrs r7, r1, 16
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 24
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r4, 24
- lsrs r4, 24
- movs r1, 0
- lsrs r3, 19
- adds r3, r2
- lsls r3, 1
- adds r6, r3
- cmp r1, r4
- bcs _080D95BE
-_080D959C:
- lsls r0, r1, 6
- adds r2, r6, r0
- movs r0, 0
- adds r3, r1, 0x1
- cmp r0, r5
- bcs _080D95B6
-_080D95A8:
- strh r7, [r2]
- adds r2, 0x2
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, r5
- bcc _080D95A8
-_080D95B6:
- lsls r0, r3, 24
- lsrs r1, r0, 24
- cmp r1, r4
- bcc _080D959C
-_080D95BE:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D9574
-
- thumb_func_start sub_80D95C4
-sub_80D95C4: @ 80D95C4
- push {r4-r7,lr}
- adds r7, r0, 0
- ldr r0, [sp, 0x14]
- ldr r4, [sp, 0x18]
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 24
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r4, 24
- lsrs r6, r4, 24
- movs r4, 0
- lsrs r3, 19
- adds r3, r2
- lsls r3, 1
- adds r7, r3
- cmp r4, r6
- bcs _080D960E
-_080D95E8:
- lsls r0, r4, 6
- adds r2, r7, r0
- movs r3, 0
- adds r4, 0x1
- cmp r3, r5
- bcs _080D9606
-_080D95F4:
- ldrh r0, [r1]
- strh r0, [r2]
- adds r1, 0x2
- adds r2, 0x2
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, r5
- bcc _080D95F4
-_080D9606:
- lsls r0, r4, 24
- lsrs r4, r0, 24
- cmp r4, r6
- bcc _080D95E8
-_080D960E:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80D95C4
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/ld_script.txt b/ld_script.txt
index b342f0b8a..39a12e328 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -179,7 +179,7 @@ SECTIONS {
asm/battle_controller_link_partner.o(.text);
asm/battle_message.o(.text);
src/math_util.o(.text);
- asm/roulette_util.o(.text);
+ src/roulette_util.o(.text);
asm/cable_car_util.o(.text);
src/save.o(.text);
src/mystery_event_script.o(.text);
diff --git a/src/roulette_util.c b/src/roulette_util.c
new file mode 100644
index 000000000..906dd33a5
--- /dev/null
+++ b/src/roulette_util.c
@@ -0,0 +1,526 @@
+#include "global.h"
+#include "palette.h"
+#include "util.h"
+
+struct UnkStruct1
+{
+ u16 var00;
+ u16 var02;
+ u8 var04;
+ u8 var05;
+ u8 var06;
+ s8 var07_0:5;
+ s8 var07_5:2;
+ s8 var07_7:1;
+};
+
+struct UnkStruct3
+{
+ u8 var00_0:7;
+ u8 var00_7:1;
+ u8 var01;
+ s8 var02;
+ s8 var03;
+ struct UnkStruct1 var04;
+};
+
+struct UnkStruct0
+{
+ u8 var00;
+ u8 var01;
+ u16 var02; //flag for each UnkStruct3
+ struct UnkStruct3 var04[0x10];
+};
+
+struct PulseBlendSettings
+{
+ u16 blendColor;
+ u16 paletteOffset;
+ u8 numColors;
+ u8 delay;
+ u8 numFadeCycles;
+ s8 maxBlendCoeff:4;
+ s8 fadeType:2;
+ s8 restorePaletteOnUnload:1;
+ s8 unk7_7:1;
+};
+
+struct PulseBlendPalette
+{
+ u8 paletteSelector;
+ u8 blendCoeff:4;
+ u8 fadeDirection:1;
+ s8 unk1_5:1;
+ s8 available:1;
+ u32 inUse:1;
+ u8 delayCounter;
+ u8 fadeCycleCounter;
+ struct PulseBlendSettings pulseBlendSettings;
+};
+
+struct PulseBlend
+{
+ u16 usedPulseBlendPalettes;
+ struct PulseBlendPalette pulseBlendPalettes[16];
+};
+
+void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor);
+
+void sub_80D8BE4(struct UnkStruct0 *r0)
+{
+ r0->var00 = 0;
+ r0->var02 = 0;
+ memset(&r0->var04, 0, sizeof(r0->var04));
+}
+
+u8 sub_80D8BF8(struct UnkStruct0 *r0, u8 r1, const struct UnkStruct1 *r2)
+{
+ if (!(r1 < 16) || (r0->var04[r1].var00_7))
+ return 0xFF;
+
+ r0->var04[r1].var04.var00 = r2->var00;
+ r0->var04[r1].var04.var02 = r2->var02;
+ r0->var04[r1].var04.var04 = r2->var04;
+ r0->var04[r1].var04.var05 = r2->var05;
+ r0->var04[r1].var04.var06 = r2->var06;
+ r0->var04[r1].var04.var07_0 = r2->var07_0;
+ r0->var04[r1].var04.var07_5 = r2->var07_5;
+ r0->var04[r1].var04.var07_7 = r2->var07_7;
+ r0->var04[r1].var00_0 = 0;
+ r0->var04[r1].var00_7 = 1;
+ r0->var04[r1].var02 = 0;
+ r0->var04[r1].var01 = 0;
+ if (r0->var04[r1].var04.var07_7 < 0)
+ r0->var04[r1].var03 = 0xFF;
+ else
+ r0->var04[r1].var03 = 1;
+
+ return r1;
+}
+
+u8 sub_80D8C7C(struct UnkStruct0 *r0, u8 r1)
+{
+ if (r1 >= 16)
+ return 0xFF;
+ if (!r0->var04[r1].var00_7)
+ return 0xFF;
+
+ memset(&r0->var04[r1], 0, sizeof(r0->var04[r1]));
+ return r1;
+}
+
+u8 sub_80D8CB0(struct UnkStruct3 *r0)
+{
+ u8 i;
+ u8 returnval;
+
+ for (i = 0; i < r0->var04.var04; i++)
+ {
+ struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[r0->var04.var02 + i];
+ struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[r0->var04.var02 + i];
+
+ switch (r0->var00_0)
+ {
+ case 1:
+ if (faded->r + r0->var03 >= 0 && faded->r + r0->var03 < 32)
+ faded->r += r0->var03;
+ if (faded->g + r0->var03 >= 0 && faded->g + r0->var03 < 32)
+ faded->g += r0->var03;
+ if (faded->b + r0->var03 >= 0 && faded->b + r0->var03 < 32)
+ faded->b += r0->var03;
+ break;
+ case 2:
+ if (r0->var03 < 0)
+ {
+ if (faded->r + r0->var03 >= unfaded->r)
+ faded->r += r0->var03;
+ if (faded->g + r0->var03 >= unfaded->g)
+ faded->g += r0->var03;
+ if (faded->b + r0->var03 >= unfaded->b)
+ faded->b += r0->var03;
+ }
+ else
+ {
+ if (faded->r + r0->var03 <= unfaded->r)
+ faded->r += r0->var03;
+ if (faded->g + r0->var03 <= unfaded->g)
+ faded->g += r0->var03;
+ if (faded->b + r0->var03 <= unfaded->b)
+ faded->b += r0->var03;
+ }
+ break;
+ }
+ }
+ if ((u32)r0->var02++ != r0->var04.var07_0)
+ {
+ returnval = 0;
+ }
+ else
+ {
+ r0->var02 = 0;
+ r0->var03 *= -1;
+ if (r0->var00_0 == 1)
+ r0->var00_0++;
+ else
+ r0->var00_0--;
+ returnval = 1;
+ }
+ return returnval;
+}
+
+u8 sub_80D8EB8(struct UnkStruct3 *r0)
+{
+ u8 rg2 = 0;
+
+ switch (r0->var00_0)
+ {
+ case 1:
+ for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
+ gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00;
+ r0->var00_0++;
+ break;
+ case 2:
+ for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
+ gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2];
+ r0->var00_0--;
+ break;
+ }
+ return 1;
+}
+
+void task_tutorial_controls_fadein(struct UnkStruct0 *r0)
+{
+ u8 i = 0;
+
+ if (r0->var00)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if ((r0->var02 >> i) & 1)
+ {
+ if (--r0->var04[i].var01 == 0xFF) // if underflow ?
+ {
+ if (r0->var04[i].var04.var00 & 0x8000) // PlttData->unused_15 ?
+ sub_80D8CB0(&r0->var04[i]);
+ else
+ sub_80D8EB8(&r0->var04[i]);
+
+ r0->var04[i].var01 = r0->var04[i].var04.var05;
+ }
+ }
+ }
+ }
+}
+
+void sub_80D8FB4(struct UnkStruct0 *r0, u16 r1)
+{
+ u8 i = 0;
+
+ r0->var00++;
+ for (i = 0; i < 16; i++)
+ {
+ if ((r1 >> i) & 1)
+ {
+ if (r0->var04[i].var00_7)
+ {
+ r0->var02 |= 1 << i;
+ r0->var04[i].var00_0 = 1;
+ }
+ }
+ }
+}
+
+void sub_80D9008(struct UnkStruct0 *r0, u16 r1)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if ((r0->var02 >> i) & 1)
+ {
+ if (r0->var04[i].var00_7)
+ {
+ if ((r1 >> i) & 1)
+ {
+ u32 offset = r0->var04[i].var04.var02;
+ u16 *faded = &gPlttBufferFaded[offset];
+ u16 *unfaded = &gPlttBufferUnfaded[offset];
+ memcpy(faded, unfaded, r0->var04[i].var04.var04 * 2);
+ r0->var04[i].var00_0 = 0;
+ r0->var04[i].var02 = 0;
+ r0->var04[i].var01 = 0;
+ if (r0->var04[i].var04.var07_7 < 0)
+ r0->var04[i].var03 = 0xFF;
+ else
+ r0->var04[i].var03 = 0x1;
+ }
+ }
+ }
+ }
+ if (r1 == 0xFFFF)
+ {
+ r0->var00 = 0;
+ r0->var02 = 0;
+ }
+ else
+ {
+ r0->var02 = r0->var02 & ~r1;
+ }
+}
+
+void InitPulseBlend(struct PulseBlend *pulseBlend)
+{
+ u8 i = 0;
+ pulseBlend->usedPulseBlendPalettes = 0;
+ memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes));
+ for (; i < 16; i++)
+ pulseBlend->pulseBlendPalettes[i].paletteSelector = i;
+}
+
+int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings)
+{
+ u8 i = 0;
+ struct PulseBlendPalette *pulseBlendPalette = NULL;
+
+ if (!pulseBlend->pulseBlendPalettes[0].inUse)
+ {
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0];
+ }
+ else
+ {
+ while (++i < 16)
+ {
+ if (!pulseBlend->pulseBlendPalettes[i].inUse)
+ {
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];
+ break;
+ }
+ }
+ }
+
+ if (pulseBlendPalette == NULL)
+ return 0xFF;
+
+ pulseBlendPalette->blendCoeff = 0;
+ pulseBlendPalette->fadeDirection = 0;
+ pulseBlendPalette->available = 1;
+ pulseBlendPalette->inUse = 1;
+ pulseBlendPalette->delayCounter = 0;
+ pulseBlendPalette->fadeCycleCounter = 0;
+ memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings));
+ return i;
+}
+
+static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette)
+{
+ u16 i;
+
+ if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
+ {
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
+ gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
+ }
+
+ memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings));
+ pulseBlendPalette->blendCoeff = 0;
+ pulseBlendPalette->fadeDirection = 0;
+ pulseBlendPalette->unk1_5 = 0;
+ pulseBlendPalette->available = 1;
+ pulseBlendPalette->inUse = 0;
+ pulseBlendPalette->fadeCycleCounter = 0;
+ pulseBlendPalette->delayCounter = 0;
+}
+
+void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
+{
+ u16 i = 0;
+
+ if (!multiSelection)
+ {
+ ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]);
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse)
+ ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]);
+
+ pulseBlendPaletteSelector >>= 1;
+ }
+ }
+}
+
+void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
+{
+ u8 i = 0;
+
+ if (!multiSelection)
+ {
+ i = pulseBlendPaletteSelector & 0xF;
+ pulseBlend->pulseBlendPalettes[i].available = 0;
+ pulseBlend->usedPulseBlendPalettes |= 1 << i;
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available)
+ {
+ pulseBlendPaletteSelector <<= 1;
+ }
+ else
+ {
+ pulseBlend->pulseBlendPalettes[i].available = 0;
+ pulseBlend->usedPulseBlendPalettes |= 1 << i;
+ }
+ }
+ }
+}
+
+void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
+{
+ u16 i;
+ struct PulseBlendPalette *pulseBlendPalette;
+ u8 j = 0;
+
+ if (!multiSelection)
+ {
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF];
+ if (!pulseBlendPalette->available && pulseBlendPalette->inUse)
+ {
+ if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
+ {
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
+ gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
+ }
+
+ pulseBlendPalette->available = 1;
+ pulseBlend->usedPulseBlendPalettes &= ~(1 << j);
+ }
+ }
+ else
+ {
+ for (j = 0; j < 16; j++)
+ {
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j];
+ if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse)
+ {
+ pulseBlendPaletteSelector <<= 1;
+ }
+ else
+ {
+ if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
+ {
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
+ gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
+ }
+
+ pulseBlendPalette->available = 1;
+ pulseBlend->usedPulseBlendPalettes &= ~(1 << j);
+ }
+ }
+ }
+}
+
+void UpdatePulseBlend(struct PulseBlend *pulseBlend)
+{
+ struct PulseBlendPalette *pulseBlendPalette;
+ u8 i = 0;
+
+ if (pulseBlend->usedPulseBlendPalettes)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];
+ if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7))
+ {
+ if (--pulseBlendPalette->delayCounter == 0xFF)
+ {
+ pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay;
+ BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor);
+ switch (pulseBlendPalette->pulseBlendSettings.fadeType)
+ {
+ case 0: // Fade all the way to the max blend amount, then wrap around
+ // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because
+ // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never
+ // reached, anyway, so the bug is not observable in vanilla gameplay.
+ if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff)
+ {
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->blendCoeff = 0;
+ }
+ break;
+ case 1: // Fade in and out
+ if (pulseBlendPalette->fadeDirection)
+ {
+ if (--pulseBlendPalette->blendCoeff == 0)
+ {
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->fadeDirection ^= 1;
+ }
+ }
+ else
+ {
+ u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF;
+ if (pulseBlendPalette->blendCoeff++ == max)
+ {
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->fadeDirection ^= 1;
+ }
+ }
+ break;
+ case 2: // Flip back and forth
+ if (pulseBlendPalette->fadeDirection)
+ pulseBlendPalette->blendCoeff = 0;
+ else
+ pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF;
+
+ pulseBlendPalette->fadeDirection ^= 1;
+ pulseBlendPalette->fadeCycleCounter++;
+ break;
+ }
+
+ if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF
+ && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles)
+ UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE);
+ }
+ }
+ }
+ }
+}
+
+void sub_80D9574(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
+{
+ u16 *_dest;
+ u8 i;
+ u8 j;
+ i = 0;
+ dest = &dest[top * 32 + left];
+ for (; i < height; i++)
+ {
+ _dest = dest + i * 32;
+ for (j = 0; j < width; j++)
+ {
+ *_dest++ = src;
+ }
+ }
+}
+
+void sub_80D95C4(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height)
+{
+ u16 *_dest;
+ u16 *_src = src;
+ u8 i;
+ u8 j;
+ i = 0;
+ dest = &dest[top * 32 + left];
+ for (; i < height; i++)
+ {
+ _dest = dest + i * 32;
+ for (j = 0; j < width; j++)
+ {
+ *_dest++ = *_src++;
+ }
+ }
+}