summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/asm/SND_seq.s549
-rw-r--r--arm7/asm/SND_unk_037FD440.s130
-rw-r--r--arm7/global.inc30
-rw-r--r--arm7/lib/include/SND_unk_037FD440.h22
-rw-r--r--arm7/lib/src/SND_seq.c266
5 files changed, 368 insertions, 629 deletions
diff --git a/arm7/asm/SND_seq.s b/arm7/asm/SND_seq.s
deleted file mode 100644
index fcf067df..00000000
--- a/arm7/asm/SND_seq.s
+++ /dev/null
@@ -1,549 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SNDi_SetTrackParam
-SNDi_SetTrackParam: ; 0x037FE9F4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r1
- mov r9, r2
- mov r8, r3
- ldr r7, [sp, #40] ; 0x28
- ldr r2, _037FEA94 ; =_038084AC
- mov r1, #36 ; 0x24
- mla fp, r0, r1, r2
- mov r6, #0
- mov r0, r8, lsl #16
- mov r4, r0, lsr #16
- and r5, r8, #255 ; 0xff
- b _037FEA78
-_037FEA2C:
- ands r0, sl, #1
- beq _037FEA70
- mov r0, fp
- mov r1, r6
- bl FUN_037FE460
- cmp r0, #0
- beq _037FEA70
- cmp r7, #1
- beq _037FEA64
- cmp r7, #2
- beq _037FEA6C
- cmp r7, #4
- streq r8, [r0, r9]
- b _037FEA70
-_037FEA64:
- strb r5, [r0, r9]
- b _037FEA70
-_037FEA6C:
- strh r4, [r0, r9]
-_037FEA70:
- add r6, r6, #1
- mov sl, sl, lsr #1
-_037FEA78:
- cmp r6, #16
- bge _037FEA88
- cmp sl, #0
- bne _037FEA2C
-_037FEA88:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FEA94: .word (SNDi_Work + 0x540)
-
- arm_func_start SNDi_SetPlayerParam
-SNDi_SetPlayerParam: ; 0x037FEA98
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr lr, _037FEAE0 ; =_038084AC
- mov ip, #36 ; 0x24
- mla ip, r0, ip, lr
- cmp r3, #1
- beq _037FEAC8
- cmp r3, #2
- beq _037FEAD0
- cmp r3, #4
- streq r2, [ip, r1]
- b _037FEAD4
-_037FEAC8:
- strb r2, [ip, r1]
- b _037FEAD4
-_037FEAD0:
- strh r2, [ip, r1]
-_037FEAD4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FEAE0: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_InvalidateBank
-SND_InvalidateBank: ; 0x037FEAE4
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r7, r0
- mov r6, r1
- mov r5, #0
- ldr r4, _037FEB40 ; =_038084AC
- mov r8, #36 ; 0x24
-_037FEAFC:
- mul r1, r5, r8
- add r0, r4, r1
- ldrb r1, [r4, r1]
- mov r1, r1, lsl #31
- movs r1, r1, lsr #31
- beq _037FEB2C
- ldr r1, [r0, #32]
- cmp r7, r1
- bhi _037FEB2C
- cmp r1, r6
- bhi _037FEB2C
- bl FUN_037FE3AC
-_037FEB2C:
- add r5, r5, #1
- cmp r5, #16
- blt _037FEAFC
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FEB40: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_InvalidateSeq
-SND_InvalidateSeq: ; 0x037FEB44
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov r9, r1
- mov r7, #0
- mov r5, r7
- ldr fp, _037FEBDC ; =_038084AC
- mov r4, #36 ; 0x24
-_037FEB64:
- mul r0, r7, r4
- add r8, fp, r0
- ldrb r0, [fp, r0]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- beq _037FEBC4
- mov r6, r5
- b _037FEBBC
-_037FEB84:
- mov r0, r8
- mov r1, r6
- bl FUN_037FE460
- cmp r0, #0
- beq _037FEBB8
- ldr r0, [r0, #40] ; 0x28
- cmp sl, r0
- bhi _037FEBB8
- cmp r0, r9
- bhi _037FEBB8
- mov r0, r8
- bl FUN_037FE3AC
- b _037FEBC4
-_037FEBB8:
- add r6, r6, #1
-_037FEBBC:
- cmp r6, #16
- blt _037FEB84
-_037FEBC4:
- add r7, r7, #1
- cmp r7, #16
- blt _037FEB64
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FEBDC: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_SetTrackAllocatableChannel
-SND_SetTrackAllocatableChannel: ; 0x037FEBE0
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r1
- ldr r3, _037FEC54 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r3
- mov r4, #0
- mov r0, r2, lsl #16
- mov r7, r0, lsr #16
- b _037FEC38
-_037FEC08:
- ands r0, r6, #1
- beq _037FEC30
- mov r0, r5
- mov r1, r4
- bl FUN_037FE460
- cmp r0, #0
- strneh r7, [r0, #30]
- ldrneb r1, [r0]
- orrne r1, r1, #128 ; 0x80
- strneb r1, [r0]
-_037FEC30:
- add r4, r4, #1
- mov r6, r6, lsr #1
-_037FEC38:
- cmp r4, #16
- bge _037FEC48
- cmp r6, #0
- bne _037FEC08
-_037FEC48:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FEC54: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_SetTrackMute
-SND_SetTrackMute: ; 0x037FEC58
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r1
- mov r6, r2
- ldr r2, _037FECC8 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r2
- mov r4, #0
- b _037FECAC
-_037FEC7C:
- ands r0, r7, #1
- beq _037FECA4
- mov r0, r5
- mov r1, r4
- bl FUN_037FE460
- cmp r0, #0
- beq _037FECA4
- mov r1, r5
- mov r2, r6
- bl FUN_037FD440
-_037FECA4:
- add r4, r4, #1
- mov r7, r7, lsr #1
-_037FECAC:
- cmp r4, #16
- bge _037FECBC
- cmp r7, #0
- bne _037FEC7C
-_037FECBC:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FECC8: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_SkipSeq
-SND_SkipSeq: ; 0x037FECCC
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r6, r1
- ldr r2, _037FED90 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r2
- mov r8, #0
- mov r4, #127 ; 0x7f
-_037FECE8:
- mov r0, r5
- mov r1, r8
- bl FUN_037FE460
- movs r7, r0
- beq _037FED10
- mov r1, r5
- mov r2, r4
- bl FUN_037FE588
- mov r0, r7
- bl FUN_037FE54C
-_037FED10:
- add r8, r8, #1
- cmp r8, #16
- blt _037FECE8
- bl SND_StopIntervalTimer
- mov r4, #0
- mov r7, r4
- b _037FED50
-_037FED2C:
- mov r0, r5
- mov r1, r7
- bl FUN_037FD548
- cmp r0, #0
- beq _037FED4C
- mov r0, r5
- bl FUN_037FE3AC
- b _037FED58
-_037FED4C:
- add r4, r4, #1
-_037FED50:
- cmp r4, r6
- bcc _037FED2C
-_037FED58:
- bl SND_StartIntervalTimer
- ldr r0, _037FED94 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- beq _037FED88
- add r3, r0, #64 ; 0x40
- ldrb r1, [r5, #1]
- mov r0, #36 ; 0x24
- mul r2, r1, r0
- ldr r0, [r3, r2]
- add r0, r0, r4
- str r0, [r3, r2]
-_037FED88:
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FED90: .word (SNDi_Work + 0x540)
-_037FED94: .word SNDi_SharedWork
-
- arm_func_start SND_PauseSeq
-SND_PauseSeq: ; 0x037FED98
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- ldr r5, _037FEE18 ; =_038084AC
- mov r2, #36 ; 0x24
- mul r3, r0, r2
- add r4, r5, r3
- ldrb r0, [r5, r3]
- bic r2, r0, #4
- and r0, r1, #255 ; 0xff
- and r0, r0, #1
- orr r0, r2, r0, lsl #2
- strb r0, [r5, r3]
- cmp r1, #0
- beq _037FEE0C
- mov r7, #0
- mov r5, #127 ; 0x7f
-_037FEDD8:
- mov r0, r4
- mov r1, r7
- bl FUN_037FE460
- movs r6, r0
- beq _037FEE00
- mov r1, r4
- mov r2, r5
- bl FUN_037FE588
- mov r0, r6
- bl FUN_037FE54C
-_037FEE00:
- add r7, r7, #1
- cmp r7, #16
- blt _037FEDD8
-_037FEE0C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FEE18: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_StopSeq
-SND_StopSeq: ; 0x037FEE1C
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r2, _037FEE70 ; =_038084AC
- mov r0, #36 ; 0x24
- mul r1, r4, r0
- add r0, r2, r1
- ldrb r1, [r2, r1]
- mov r1, r1, lsl #31
- movs r1, r1, lsr #31
- beq _037FEE68
- bl FUN_037FE3AC
- ldr r0, _037FEE74 ; =SNDi_SharedWork
- ldr r2, [r0]
- cmp r2, #0
- ldrne r1, [r2, #4]
- movne r0, #1
- mvnne r0, r0, lsl r4
- andne r0, r1, r0
- strne r0, [r2, #4]
-_037FEE68:
- ldmia sp!, {r4, lr}
- bx lr
-_037FEE70: .word (SNDi_Work + 0x540)
-_037FEE74: .word SNDi_SharedWork
-
- arm_func_start SND_StartSeq
-SND_StartSeq: ; 0x037FEE78
- stmdb sp!, {r4, lr}
- mov r4, r0
- bl SND_PrepareSeq
- mov r0, r4
- bl SND_StartPreparedSeq
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_StartPreparedSeq
-SND_StartPreparedSeq: ; 0x037FEE94
- ldr r2, _037FEEB0 ; =_038084AC
- mov r1, #36 ; 0x24
- mul r1, r0, r1
- ldrb r0, [r2, r1]
- orr r0, r0, #2
- strb r0, [r2, r1]
- bx lr
-_037FEEB0: .word (SNDi_Work + 0x540)
-
- arm_func_start SND_PrepareSeq
-SND_PrepareSeq: ; 0x037FEEB4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r4, r0
- mov r8, r1
- mov r6, r2
- mov r5, r3
- ldr r1, _037FEFFC ; =_038084AC
- mov r0, #36 ; 0x24
- mul r0, r4, r0
- add r7, r1, r0
- ldrb r0, [r1, r0]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- beq _037FEEF4
- mov r0, r7
- bl FUN_037FE3AC
-_037FEEF4:
- mov r0, r7
- mov r1, r5
- bl FUN_037FE5F8
- bl FUN_037FD4C0
- movs r9, r0
- bmi _037FEFF0
- ldr r0, _037FF000 ; =_038086EC
- add r5, r0, r9, lsl #6
- mov r0, r5
- bl FUN_037FE6BC
- mov r0, r5
- mov r1, r8
- mov r2, r6
- bl FUN_037FE6A8
- strb r9, [r7, #8]
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE9B8
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
- add r2, r5, #40 ; 0x28
- ldr r1, [r5, #40] ; 0x28
- add r1, r1, #1
- str r1, [r5, #40] ; 0x28
- cmp r0, #254 ; 0xfe
- ldrne r0, [r2]
- subne r0, r0, #1
- strne r0, [r2]
- bne _037FEFB8
- mov r0, r5
- bl FUN_037FE918
- mov r0, r0, lsl #15
- mov r5, r0, lsr #16
- mov r6, #1
- ldr r8, _037FF000 ; =_038086EC
- b _037FEFB0
-_037FEF80:
- ands r0, r5, #1
- beq _037FEFA4
- bl FUN_037FD4C0
- movs r9, r0
- bmi _037FEFB8
- add r0, r8, r9, lsl #6
- bl FUN_037FE6BC
- add r0, r7, r6
- strb r9, [r0, #8]
-_037FEFA4:
- add r6, r6, #1
- mov r0, r5, lsl #15
- mov r5, r0, lsr #16
-_037FEFB0:
- cmp r5, #0
- bne _037FEF80
-_037FEFB8:
- ldrb r0, [r7]
- bic r0, r0, #1
- orr r0, r0, #1
- strb r0, [r7]
- ldrb r0, [r7]
- bic r0, r0, #2
- strb r0, [r7]
- ldr r0, _037FF004 ; =SNDi_SharedWork
- ldr r2, [r0]
- cmp r2, #0
- ldrne r1, [r2, #4]
- movne r0, #1
- orrne r0, r1, r0, lsl r4
- strne r0, [r2, #4]
-_037FEFF0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FEFFC: .word (SNDi_Work + 0x540)
-_037FF000: .word (SNDi_Work + 0x780)
-_037FF004: .word SNDi_SharedWork
-
- arm_func_start SND_SeqMain
-SND_SeqMain: ; 0x037FF008
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- mov r8, r0
- mov r5, #0
- mov r6, r5
- mov sl, #1
- ldr r4, _037FF0A0 ; =_038084AC
- mov r9, #36 ; 0x24
-_037FF024:
- mul r0, r6, r9
- add r7, r4, r0
- ldrb r1, [r4, r0]
- mov r0, r1, lsl #31
- movs r0, r0, lsr #31
- beq _037FF07C
- mov r0, r1, lsl #30
- movs r0, r0, lsr #31
- beq _037FF06C
- cmp r8, #0
- beq _037FF064
- mov r0, r1, lsl #29
- movs r0, r0, lsr #31
- bne _037FF064
- mov r0, r7
- bl FUN_037FE48C
-_037FF064:
- mov r0, r7
- bl FUN_037FE1A0
-_037FF06C:
- ldrb r0, [r7]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- orrne r5, r5, sl, lsl r6
-_037FF07C:
- add r6, r6, #1
- cmp r6, #16
- blt _037FF024
- ldr r0, _037FF0A4 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- strne r5, [r0, #4]
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_037FF0A0: .word (SNDi_Work + 0x540)
-_037FF0A4: .word SNDi_SharedWork
-
- arm_func_start SND_SeqInit
-SND_SeqInit: ; 0x037FF0A8
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov lr, #0
- ldr r3, _037FF10C ; =_038084AC
- mov r0, #36 ; 0x24
-_037FF0BC:
- mul r2, lr, r0
- add ip, r3, r2
- ldrb r1, [r3, r2]
- bic r1, r1, #1
- strb r1, [r3, r2]
- strb lr, [ip, #1]
- add lr, lr, #1
- cmp lr, #16
- blt _037FF0BC
- mov r2, #0
- ldr r1, _037FF110 ; =_038086EC
-_037FF0E8:
- ldrb r0, [r1, r2, lsl #6]
- bic r0, r0, #1
- strb r0, [r1, r2, lsl #6]
- add r2, r2, #1
- cmp r2, #32
- blt _037FF0E8
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FF10C: .word (SNDi_Work + 0x540)
-_037FF110: .word (SNDi_Work + 0x780)
diff --git a/arm7/asm/SND_unk_037FD440.s b/arm7/asm/SND_unk_037FD440.s
index 1ba24f28..2ca56045 100644
--- a/arm7/asm/SND_unk_037FD440.s
+++ b/arm7/asm/SND_unk_037FD440.s
@@ -18,8 +18,8 @@ _03807F58: ;0x03807F58
.section .text
- arm_func_start FUN_037FD440
-FUN_037FD440: ; 0x037FD440
+ arm_func_start TrackMute
+TrackMute: ; 0x037FD440
stmdb sp!, {r4, lr}
mov r4, r0
cmp r2, #3
@@ -44,22 +44,22 @@ _037FD484:
orr r2, r2, #4
strb r2, [r4]
mvn r2, #0
- bl FUN_037FE588
+ bl TrackReleaseChannels
b _037FD4B8
_037FD49C:
ldrb r2, [r4]
orr r2, r2, #4
strb r2, [r4]
mov r2, #127 ; 0x7f
- bl FUN_037FE588
+ bl TrackReleaseChannels
mov r0, r4
- bl FUN_037FE54C
+ bl TrackFreeChannels
_037FD4B8:
ldmia sp!, {r4, lr}
bx lr
- arm_func_start FUN_037FD4C0
-FUN_037FD4C0: ; 0x037FD4C0
+ arm_func_start AllocateTrack
+AllocateTrack: ; 0x037FD4C0
mov r0, #0
ldr r3, _037FD500 ; =_038086EC
b _037FD4F0
@@ -100,8 +100,8 @@ FUN_037FD504: ; 0x037FD504
bx lr
_037FD544: .word SNDi_SharedWork
- arm_func_start FUN_037FD548
-FUN_037FD548: ; 0x037FD548
+ arm_func_start PlayerStepTicks
+PlayerStepTicks: ; 0x037FD548
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r8, r0
mov r7, r1
@@ -111,7 +111,7 @@ FUN_037FD548: ; 0x037FD548
_037FD560:
mov r0, r8
mov r1, r5
- bl FUN_037FE460
+ bl PlayerGetTrack
cmp r0, #0
beq _037FD5A8
ldr r1, [r0, #40] ; 0x28
@@ -187,7 +187,7 @@ _037FD64C:
bgt _037FDF84
_037FD670:
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE9B8
+ bl SeqCacheFetch
add r0, r9, #40 ; 0x28
str r0, [sp, #28]
mov r0, #2
@@ -207,7 +207,7 @@ _037FD6B4:
mov r4, fp
mov r6, sl
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r7, r0
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -215,7 +215,7 @@ _037FD6B4:
cmp r7, #162 ; 0xa2
bne _037FD700
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r7, r0
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -227,7 +227,7 @@ _037FD700:
cmp r7, #160 ; 0xa0
bne _037FD72C
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r7, r0
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -239,7 +239,7 @@ _037FD72C:
cmp r7, #161 ; 0xa1
bne _037FD758
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r7, r0
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -251,7 +251,7 @@ _037FD758:
ands r0, r7, #128 ; 0x80
bne _037FD82C
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
str r0, [sp, #12]
ldr r0, [sp, #28]
ldr r0, [r0]
@@ -363,7 +363,7 @@ _037FD8D8:
b _037FDF64
_037FD8F4:
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r4, r0
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -375,7 +375,7 @@ _037FD8F4:
beq _037FDF64
mov r0, r8
mov r1, r4
- bl FUN_037FE460
+ bl PlayerGetTrack
movs r4, r0
beq _037FDF64
cmp r4, r9
@@ -385,7 +385,7 @@ _037FD8F4:
mov r0, r4
ldr r1, [r9, #36] ; 0x24
mov r2, r5
- bl FUN_037FE6A8
+ bl TrackSetSeq
b _037FDF64
_037FD958:
mov r0, r9
@@ -540,15 +540,15 @@ _037FDB48:
mov r0, r9
mov r1, r8
ldr r2, [sp, #40] ; 0x28
- bl FUN_037FE588
+ bl TrackReleaseChannels
mov r0, r9
- bl FUN_037FE54C
+ bl TrackFreeChannels
b _037FDF64
_037FDB7C:
mov r0, r9
mov r1, r8
ldrb r2, [sp, #44] ; 0x2c
- bl FUN_037FD440
+ bl TrackMute
b _037FDF64
_037FDB90:
ldrb r1, [sp, #44] ; 0x2c
@@ -615,7 +615,7 @@ _037FDC60:
b _037FDF64
_037FDC68:
ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
str r0, [sp, #16]
ldr r0, [r9, #40] ; 0x28
add r0, r0, #1
@@ -989,8 +989,8 @@ _037FE18C:
_037FE198: .word 0x0000FFFF
_037FE19C: .word FUN_037FE344
- arm_func_start FUN_037FE1A0
-FUN_037FE1A0: ; 0x037FE1A0
+ arm_func_start PlayerUpdateChannelVolume
+PlayerUpdateChannelVolume: ; 0x037FE1A0
stmdb sp!, {r4, r5, r6, lr}
mov r6, r0
mov r5, #0
@@ -998,7 +998,7 @@ FUN_037FE1A0: ; 0x037FE1A0
_037FE1B0:
mov r0, r6
mov r1, r5
- bl FUN_037FE460
+ bl PlayerGetTrack
cmp r0, #0
beq _037FE1D0
mov r1, r6
@@ -1139,8 +1139,8 @@ _037FE3A0:
ldmia sp!, {r4, r5, lr}
bx lr
- arm_func_start FUN_037FE3AC
-FUN_037FE3AC: ; 0x037FE3AC
+ arm_func_start PlayerStop
+PlayerStop: ; 0x037FE3AC
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
@@ -1165,7 +1165,7 @@ FUN_037FE3EC: ; 0x037FE3EC
sub sp, sp, #4
mov r5, r0
mov r4, r1
- bl FUN_037FE460
+ bl PlayerGetTrack
cmp r0, #0
beq _037FE430
mov r1, r5
@@ -1189,14 +1189,14 @@ FUN_037FE440: ; 0x037FE440
stmdb sp!, {r4, lr}
mov r4, r0
mvn r2, #0
- bl FUN_037FE588
+ bl TrackReleaseChannels
mov r0, r4
- bl FUN_037FE54C
+ bl TrackFreeChannels
ldmia sp!, {r4, lr}
bx lr
- arm_func_start FUN_037FE460
-FUN_037FE460: ; 0x037FE460
+ arm_func_start PlayerGetTrack
+PlayerGetTrack: ; 0x037FE460
cmp r1, #15
movgt r0, #0
bxgt lr
@@ -1209,8 +1209,8 @@ FUN_037FE460: ; 0x037FE460
bx lr
_037FE488: .word (SNDi_Work + 0x780)
- arm_func_start FUN_037FE48C
-FUN_037FE48C: ; 0x037FE48C
+ arm_func_start PlayerSeqMain
+PlayerSeqMain: ; 0x037FE48C
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r6, r0
@@ -1232,11 +1232,11 @@ _037FE4B4:
_037FE4CC:
mov r0, r6
mov r1, r7
- bl FUN_037FD548
+ bl PlayerStepTicks
cmp r0, #0
beq _037FE4EC
mov r0, r6
- bl FUN_037FE3AC
+ bl PlayerStop
b _037FE4F8
_037FE4EC:
add r4, r4, #1
@@ -1267,8 +1267,8 @@ _037FE524:
bx lr
_037FE548: .word SNDi_SharedWork
- arm_func_start FUN_037FE54C
-FUN_037FE54C: ; 0x037FE54C
+ arm_func_start TrackFreeChannels
+TrackFreeChannels: ; 0x037FE54C
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
@@ -1287,8 +1287,8 @@ _037FE56C:
ldmia sp!, {r4, r5, lr}
bx lr
- arm_func_start FUN_037FE588
-FUN_037FE588: ; 0x037FE588
+ arm_func_start TrackReleaseChannels
+TrackReleaseChannels: ; 0x037FE588
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r4, r0
@@ -1322,8 +1322,8 @@ _037FE5E4:
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
- arm_func_start FUN_037FE5F8
-FUN_037FE5F8: ; 0x037FE5F8
+ arm_func_start PlayerSetBank
+PlayerSetBank: ; 0x037FE5F8
stmdb sp!, {r4, lr}
ldrb r2, [r0]
bic r2, r2, #4
@@ -1372,16 +1372,16 @@ _037FE69C:
bx lr
_037FE6A4: .word SNDi_SharedWork
- arm_func_start FUN_037FE6A8
-FUN_037FE6A8: ; 0x037FE6A8
+ arm_func_start TrackSetSeq
+TrackSetSeq: ; 0x037FE6A8
str r1, [r0, #36] ; 0x24
ldr r1, [r0, #36] ; 0x24
add r1, r1, r2
str r1, [r0, #40] ; 0x28
bx lr
- arm_func_start FUN_037FE6BC
-FUN_037FE6BC: ; 0x037FE6BC
+ arm_func_start TrackInit
+TrackInit: ; 0x037FE6BC
stmdb sp!, {r4, lr}
mov r4, r0
mov r0, #0
@@ -1459,14 +1459,14 @@ FUN_037FE7B0: ; 0x037FE7B0
b _037FE810
_037FE7DC:
ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r5, r0
ldr r0, [r4, #40] ; 0x28
add r0, r0, #1
str r0, [r4, #40] ; 0x28
b _037FE86C
_037FE7F8:
- bl FUN_037FE918
+ bl TrackReadHword
mov r5, r0
b _037FE86C
_037FE804:
@@ -1475,7 +1475,7 @@ _037FE804:
b _037FE86C
_037FE810:
ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r1, r0
ldr r0, [r4, #40] ; 0x28
add r0, r0, #1
@@ -1486,10 +1486,10 @@ _037FE810:
ldrnesh r5, [r0]
b _037FE86C
_037FE83C:
- bl FUN_037FE918
+ bl TrackReadHword
mov r5, r0, lsl #16
mov r0, r4
- bl FUN_037FE918
+ bl TrackReadHword
mov r0, r0, lsl #16
mov r4, r0, asr #16
bl SND_CalcRandom
@@ -1511,7 +1511,7 @@ FUN_037FE878: ; 0x037FE878
add r4, r6, #40 ; 0x28
_037FE888:
ldr r0, [r6, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
ldr r1, [r4]
add r1, r1, #1
str r1, [r4]
@@ -1529,19 +1529,19 @@ FUN_037FE8B8: ; 0x037FE8B8
sub sp, sp, #4
mov r4, r0
ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r5, r0
ldr r0, [r4, #40] ; 0x28
add r0, r0, #1
str r0, [r4, #40] ; 0x28
ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
ldr r1, [r4, #40] ; 0x28
add r1, r1, #1
str r1, [r4, #40] ; 0x28
orr r5, r5, r0, lsl #8
ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
ldr r1, [r4, #40] ; 0x28
add r1, r1, #1
str r1, [r4, #40] ; 0x28
@@ -1550,19 +1550,19 @@ FUN_037FE8B8: ; 0x037FE8B8
ldmia sp!, {r4, r5, lr}
bx lr
- arm_func_start FUN_037FE918
-FUN_037FE918: ; 0x037FE918
+ arm_func_start TrackReadHword
+TrackReadHword: ; 0x037FE918
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
mov r4, r0
ldr r0, [r5, #40] ; 0x28
add r0, r0, #1
str r0, [r5, #40] ; 0x28
ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
+ bl SeqReadByte
ldr r1, [r5, #40] ; 0x28
add r1, r1, #1
str r1, [r5, #40] ; 0x28
@@ -1573,8 +1573,8 @@ FUN_037FE918: ; 0x037FE918
ldmia sp!, {r4, r5, lr}
bx lr
- arm_func_start FUN_037FE968
-FUN_037FE968: ; 0x037FE968
+ arm_func_start SeqReadByte
+SeqReadByte: ; 0x037FE968
stmdb sp!, {r4, lr}
mov r4, r0
ldr r0, _037FE9B0 ; =_03807F50
@@ -1586,7 +1586,7 @@ FUN_037FE968: ; 0x037FE968
bcc _037FE994
_037FE98C:
mov r0, r4
- bl FUN_037FE9B8
+ bl SeqCacheFetch
_037FE994:
ldr r0, _037FE9B0 ; =_03807F50
ldr r0, [r0]
@@ -1598,8 +1598,8 @@ _037FE994:
_037FE9B0: .word _03807F50
_037FE9B4: .word _03807F58
- arm_func_start FUN_037FE9B8
-FUN_037FE9B8: ; 0x037FE9B8
+ arm_func_start SeqCacheFetch
+SeqCacheFetch: ; 0x037FE9B8
bic r2, r0, #3
ldr r0, _037FE9F0 ; =_03807F50
str r2, [r0]
diff --git a/arm7/global.inc b/arm7/global.inc
index d7f446e1..9702d548 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -208,21 +208,21 @@
.extern ExChannelVolumeCmp
.extern ExChannelStart
.extern ExChannelSetup
-.extern FUN_037FD440
-.extern FUN_037FD4C0
-.extern FUN_037FD548
-.extern FUN_037FE1A0
-.extern FUN_037FE3AC
-.extern FUN_037FE460
-.extern FUN_037FE48C
-.extern FUN_037FE54C
-.extern FUN_037FE588
-.extern FUN_037FE5F8
-.extern FUN_037FE6A8
-.extern FUN_037FE6BC
-.extern FUN_037FE918
-.extern FUN_037FE968
-.extern FUN_037FE9B8
+.extern TrackMute
+.extern AllocateTrack
+.extern PlayerStepTicks
+.extern PlayerUpdateChannelVolume
+.extern PlayerStop
+.extern PlayerGetTrack
+.extern PlayerSeqMain
+.extern TrackFreeChannels
+.extern TrackReleaseChannels
+.extern PlayerSetBank
+.extern TrackSetSeq
+.extern TrackInit
+.extern TrackReadHword
+.extern SeqReadByte
+.extern SeqCacheFetch
.extern SPIi_CheckEntry
.extern SPIi_CheckException
.extern SPIi_GetException
diff --git a/arm7/lib/include/SND_unk_037FD440.h b/arm7/lib/include/SND_unk_037FD440.h
new file mode 100644
index 00000000..460217c6
--- /dev/null
+++ b/arm7/lib/include/SND_unk_037FD440.h
@@ -0,0 +1,22 @@
+#ifndef GUARD_SND_UNK_H
+#define GUARD_SND_UNK_H
+
+#include "nitro/types.h"
+
+struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track);
+void PlayerStop(struct SNDPlayer *);
+void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode);
+void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release);
+void TrackFreeChannels(struct SNDTrack *track);
+BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks);
+void PlayerSetBank(struct SNDPlayer *player, struct SNDBankData *bankData);
+int AllocateTrack(void);
+void TrackInit(struct SNDTrack *track);
+void TrackSetSeq(struct SNDTrack *track, const void *seq, u32 offset);
+void SeqCacheFetch(const void *addr);
+u8 SeqReadByte(const void *addr);
+u16 TrackReadHword(struct SNDTrack *track);
+void PlayerSeqMain(struct SNDPlayer *player);
+void PlayerUpdateChannelVolume(struct SNDPlayer *player);
+
+#endif //GUARD_SND_UNK_H
diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c
new file mode 100644
index 00000000..3153c392
--- /dev/null
+++ b/arm7/lib/src/SND_seq.c
@@ -0,0 +1,266 @@
+#include "SND_seq.h"
+
+#include "SND_main.h"
+#include "SND_work.h"
+#include "SND_unk_037FD440.h"
+
+void SND_SeqInit(void) {
+ for (int i = 0; i < SND_PLAYER_COUNT; i++) {
+ struct SNDPlayer *ply = &SNDi_Work.players[i];
+
+ ply->flags.active = FALSE;
+ ply->playerId = (u8)i;
+ }
+
+ for (int i = 0; i < SND_TRACK_COUNT; i++) {
+ struct SNDTrack *trk = &SNDi_Work.tracks[i];
+
+ trk->flags.active = FALSE;
+ }
+}
+
+void SND_SeqMain(BOOL step) {
+ struct SNDPlayer *ply;
+ int i;
+ u32 playerStatus = 0;
+
+ for (i = 0; i < SND_PLAYER_COUNT; i++) {
+ ply = &SNDi_Work.players[i];
+
+ if (!ply->flags.active)
+ continue;
+
+ if (ply->flags.prepared) {
+ if (step && !ply->flags.paused)
+ PlayerSeqMain(ply);
+ PlayerUpdateChannelVolume(ply);
+ }
+
+ if (ply->flags.active)
+ playerStatus |= 1 << i;
+ }
+
+ if (SNDi_SharedWork)
+ SNDi_SharedWork->playerStatus = playerStatus;
+}
+
+void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ if (ply->flags.active)
+ PlayerStop(ply);
+
+ PlayerSetBank(ply, bankData);
+
+ int allocTrkIdx = AllocateTrack();
+
+ if (allocTrkIdx < 0)
+ return;
+
+ struct SNDTrack *trk = &SNDi_Work.tracks[allocTrkIdx];
+ TrackInit(trk);
+ TrackSetSeq(trk, seq, offset);
+ ply->tracks[0] = (u8)allocTrkIdx;
+ SeqCacheFetch(trk->cur);
+
+ u8 cmd = SeqReadByte(trk->cur);
+
+ trk->cur++;
+
+ if (cmd != 0xFE) {
+ trk->cur--;
+ } else {
+ int track;
+ u16 trackMask;
+
+ for (trackMask = (u16)(TrackReadHword(trk) >> 1), track = 1; trackMask != 0; track++, trackMask >>= 1) {
+ if (trackMask & 1) {
+ allocTrkIdx = AllocateTrack();
+ if (allocTrkIdx < 0)
+ break;
+ TrackInit(&SNDi_Work.tracks[allocTrkIdx]);
+ ply->tracks[track] = (u8)allocTrkIdx;
+ }
+ }
+ }
+
+ ply->flags.active = TRUE;
+ ply->flags.prepared = FALSE;
+
+ if (SNDi_SharedWork) {
+ SNDi_SharedWork->playerStatus |= 1 << player;
+ }
+}
+
+void SND_StartPreparedSeq(int player) {
+ SNDi_Work.players[player].flags.prepared = TRUE;
+}
+
+void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) {
+ SND_PrepareSeq(player, seq, offset, bankData);
+ SND_StartPreparedSeq(player);
+}
+
+void SND_StopSeq(int player) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ if (ply->flags.active) {
+ PlayerStop(ply);
+
+ if (SNDi_SharedWork) {
+ SNDi_SharedWork->playerStatus &= ~(1 << player);
+ }
+ }
+}
+
+void SND_PauseSeq(int player, BOOL flag) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ ply->flags.paused = flag;
+
+ if (flag) {
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk) {
+ TrackReleaseChannels(trk, ply, 127);
+ TrackFreeChannels(trk);
+ }
+ }
+ }
+}
+
+void SND_SkipSeq(int player, u32 ticks) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk) {
+ TrackReleaseChannels(trk, ply, 127);
+ TrackFreeChannels(trk);
+ }
+ }
+
+ SND_StopIntervalTimer();
+
+ u32 i;
+ for (i = 0; i < ticks; i++) {
+ if (PlayerStepTicks(ply, 0)) {
+ PlayerStop(ply);
+ break;
+ }
+ }
+
+ SND_StartIntervalTimer();
+
+ if (SNDi_SharedWork) {
+ SNDi_SharedWork->players[ply->playerId].tickCounter += i;
+ }
+}
+
+void SND_SetTrackMute(int player, u32 trackMask, int muteMode) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) {
+ if (trackMask & 1) {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk) {
+ TrackMute(trk, ply, muteMode);
+ }
+ }
+ }
+}
+
+void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) {
+ if (trackMask & 1) {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk) {
+ trk->channelMask = (u16)channelMask;
+ trk->flags.channelMask = TRUE;
+ }
+ }
+ }
+}
+
+void SND_InvalidateSeq(const void *start, const void *end) {
+ struct SNDPlayer *ply;
+ struct SNDTrack *trk;
+ int i;
+ int j;
+
+ for (i = 0; i < SND_PLAYER_COUNT; i++) {
+ ply = &SNDi_Work.players[i];
+
+ if (!ply->flags.active)
+ continue;
+
+ for (j = 0; j < SND_TRACK_COUNT_PER_PLAYER; j++) {
+ trk = PlayerGetTrack(ply, j);
+
+ if (!trk)
+ continue;
+
+ if (start <= trk->cur && trk->cur <= end) {
+ PlayerStop(ply);
+ break;
+ }
+ }
+ }
+}
+
+void SND_InvalidateBank(const void *start, const void *end) {
+ for (int i = 0; i < SND_PLAYER_COUNT; i++) {
+ struct SNDPlayer *ply = &SNDi_Work.players[i];
+
+ if (ply->flags.active && start <= ply->bank && ply->bank <= end)
+ PlayerStop(ply);
+ }
+}
+
+void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ switch (size) {
+ case 1:
+ *(u8 *)((u8 *)ply + offset) = (u8)data;
+ break;
+ case 2:
+ *(u16 *)((u8 *)ply + offset) = (u16)data;
+ break;
+ case 4:
+ *(u32 *)((u8 *)ply + offset) = (u32)data;
+ break;
+ }
+}
+
+void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size) {
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) {
+ if (!(trackMask & 1))
+ continue;
+
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (!trk)
+ continue;
+
+ switch (size) {
+ case 1:
+ *(u8 *)((u8 *)trk + offset) = (u8)data;
+ break;
+ case 2:
+ *(u16 *)((u8 *)trk + offset) = (u16)data;
+ break;
+ case 4:
+ *(u32 *)((u8 *)trk + offset) = (u32)data;
+ break;
+ }
+ }
+}