diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-07-09 13:43:54 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:48 +0200 |
commit | bedb58ea94b44f8b4168fd731339fec38ee21988 (patch) | |
tree | d4078faa96cf33be66c3b975d9ec6b57a97e0ceb | |
parent | 5cc94282b5c8e2b991a443f9e64e91c466cb00f1 (diff) |
arm7: decompile SND_seq
-rw-r--r-- | arm7/asm/SND_seq.s | 549 | ||||
-rw-r--r-- | arm7/asm/SND_unk_037FD440.s | 130 | ||||
-rw-r--r-- | arm7/global.inc | 30 | ||||
-rw-r--r-- | arm7/lib/include/SND_unk_037FD440.h | 22 | ||||
-rw-r--r-- | arm7/lib/src/SND_seq.c | 266 |
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; + } + } +} |