diff options
author | YamaArashi <shadow962@live.com> | 2016-05-12 23:30:01 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-05-15 01:55:33 -0700 |
commit | eaa9f37ca97c1c546fa3386d4389a45ebbc60b18 (patch) | |
tree | 6547b53434a5d76526150422f7673e1fbbf0e1fa | |
parent | 237c967a98ce664705df9d1ff9c77a409f71d60f (diff) |
m4a lib; use fewer iwram syms
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | asm/libmks4agb.s | 5292 | ||||
-rw-r--r-- | asm/m4a_1.s | 1908 | ||||
-rw-r--r-- | asm/m4a_3.s | 574 | ||||
-rw-r--r-- | asm/rom1.s | 4 | ||||
-rw-r--r-- | asm/rom3.s | 28 | ||||
-rw-r--r-- | asm/rom4.s | 46 | ||||
-rw-r--r-- | asm/rom5.s | 34 | ||||
-rw-r--r-- | constants/gba_constants.s | 68 | ||||
-rw-r--r-- | constants/m4a_constants.s | 127 | ||||
-rw-r--r-- | data/data2.s | 88 | ||||
-rw-r--r-- | data/sound_data.s | 45 | ||||
-rw-r--r-- | include/gba/gba.h | 5 | ||||
-rw-r--r-- | include/gba/io_reg.h | 20 | ||||
-rw-r--r-- | include/gba/m4a_internal.h | 442 | ||||
-rw-r--r-- | iwram_syms.txt | 11 | ||||
-rw-r--r-- | ld_script.txt | 21 | ||||
-rw-r--r-- | src/agb_flash.c | 8 | ||||
-rw-r--r-- | src/m4a_2.c | 911 | ||||
-rw-r--r-- | src/m4a_4.c | 545 | ||||
-rw-r--r-- | src/m4a_tables.c | 306 | ||||
-rw-r--r-- | src/siirtc.c | 55 |
24 files changed, 5069 insertions, 5478 deletions
diff --git a/.gitattributes b/.gitattributes index 10b00f541..5229f0d3f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,6 +7,7 @@ Makefile text eol=lf *.c text eol=lf *.h text eol=lf *.pl text eol=lf +*.inc text eol=lf *.png binary *.bin binary diff --git a/.gitignore b/.gitignore index f144a1aba..ee1909710 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ pokeas pokeld pokeobjcopy src/*.s +tools/agbcc @@ -36,9 +36,9 @@ C_SRCS := $(wildcard src/*.c) C_OBJS := $(C_SRCS:%.c=%.o) ASM_OBJS := asm/crt0.o asm/rom1.o asm/rom2.o asm/rom3.o asm/rom4.o asm/rom5.o \ - asm/libgcnmultiboot.o asm/libmks4agb.o asm/libagbsyscall.o asm/libc.o + asm/libgcnmultiboot.o asm/m4a_1.o asm/m4a_3.o asm/libagbsyscall.o asm/libc.o -DATA_ASM_OBJS := data/data1.o data/data2.o data/graphics.o +DATA_ASM_OBJS := data/data1.o data/data2.o data/graphics.o data/sound_data.o OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) @@ -72,6 +72,9 @@ src/agb_flash.o: CFLAGS := -O -mthumb-interwork src/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork src/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork +src/m4a_2.o: CC1 := tools/agbcc/bin/old_agbcc +src/m4a_4.o: CC1 := tools/agbcc/bin/old_agbcc + $(C_OBJS): %.o : %.c $(CPP) $(CPPFLAGS) $< | $(CC1) $(CFLAGS) -o $*.s echo -e ".text\n\t.align\t2, 0\n" >> $*.s diff --git a/asm/libmks4agb.s b/asm/libmks4agb.s deleted file mode 100644 index 545660669..000000000 --- a/asm/libmks4agb.s +++ /dev/null @@ -1,5292 +0,0 @@ - .include "asm/macros.s" - - .syntax unified - - .text - - thumb_func_start umul3232H32 -umul3232H32: @ 81DCE14 - adr r2, _081DCE18 - bx r2 - .arm -_081DCE18: - umull r2, r3, r0, r1 - add r0, r3, 0 - bx lr - thumb_func_end umul3232H32 - - thumb_func_start SoundMain -SoundMain: @ 81DCE24 - ldr r0, _081DCE90 - ldr r0, [r0] - ldr r2, _081DCE94 - ldr r3, [r0] - cmp r2, r3 - beq _081DCE32 - bx lr -_081DCE32: - adds r3, 0x1 - str r3, [r0] - push {r4-r7,lr} - mov r1, r8 - mov r2, r9 - mov r3, r10 - mov r4, r11 - push {r0-r4} - sub sp, 0x18 - ldrb r1, [r0, 0xC] - cmp r1, 0 - beq _081DCE56 - ldr r2, _081DCE9C - ldrb r2, [r2] - cmp r2, 0xA0 - bcs _081DCE54 - adds r2, 0xE4 -_081DCE54: - adds r1, r2 -_081DCE56: - str r1, [sp, 0x14] - ldr r3, [r0, 0x20] - cmp r3, 0 - beq _081DCE66 - ldr r0, [r0, 0x24] - bl _081DD25E - ldr r0, [sp, 0x18] -_081DCE66: - ldr r3, [r0, 0x28] - bl _081DD25E - ldr r0, [sp, 0x18] - ldr r3, [r0, 0x10] - mov r8, r3 - ldr r5, _081DCEA0 - adds r5, r0 - ldrb r4, [r0, 0x4] - subs r7, r4, 0x1 - bls _081DCE86 - ldrb r1, [r0, 0xB] - subs r1, r7 - mov r2, r8 - muls r2, r1 - adds r5, r2 -_081DCE86: - str r5, [sp, 0x8] - ldr r6, _081DCEA4 - ldr r3, _081DCE98 - bx r3 - .align 2, 0 -_081DCE90: .4byte 0x03007ff0 -_081DCE94: .4byte 0x68736d53 -_081DCE98: .4byte 0x03000f61 -_081DCE9C: .4byte 0x04000006 -_081DCEA0: .4byte 0x00000350 -_081DCEA4: .4byte 0x00000630 - thumb_func_end SoundMain - - thumb_func_start SoundMainRAM -SoundMainRAM: @ 81DCEA8 - ldrb r3, [r0, 0x5] - cmp r3, 0 - beq _081DCF08 - adr r1, _081DCEB4 - bx r1 - .arm -_081DCEB4: - cmp r4, 0x2 - addeq r7, r0, 0x350 - addne r7, r5, r8 - mov r4, r8 -_081DCEC4: - ldrsb r0, [r5, r6] - ldrsb r1, [r5] - add r0, r0, r1 - ldrsb r1, [r7, r6] - add r0, r0, r1 - ldrsb r1, [r7], 0x1 - add r0, r0, r1 - mul r1, r0, r3 - mov r0, r1, asr 9 - tst r0, 0x80 - addne r0, r0, 0x1 - strb r0, [r5, r6] - strb r0, [r5], 0x1 - subs r4, r4, 0x1 - bgt _081DCEC4 - add r0, pc, 0x2F - bx r0 - .thumb -_081DCF08: - movs r0, 0 - mov r1, r8 - adds r6, r5 - lsrs r1, 3 - bcc _081DCF16 - stm r5!, {r0} - stm r6!, {r0} -_081DCF16: - lsrs r1, 1 - bcc _081DCF22 - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} -_081DCF22: - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - subs r1, 0x1 - bgt _081DCF22 - ldr r4, [sp, 0x18] - ldr r0, [r4, 0x18] - mov r12, r0 - ldrb r0, [r4, 0x6] - adds r4, 0x50 -_081DCF40: - str r0, [sp, 0x4] - ldr r3, [r4, 0x24] - ldr r0, [sp, 0x14] - cmp r0, 0 - beq _081DCF60 - ldr r1, _081DCF5C - ldrb r1, [r1] - cmp r1, 0xA0 - bcs _081DCF54 - adds r1, 0xE4 -_081DCF54: - cmp r1, r0 - bcc _081DCF60 - b _081DD24A - .align 2, 0 -_081DCF5C: .4byte 0x04000006 -_081DCF60: - ldrb r6, [r4] - movs r0, 0xC7 - tst r0, r6 - bne _081DCF6A - b _081DD240 -_081DCF6A: - movs r0, 0x80 - tst r0, r6 - beq _081DCFA0 - movs r0, 0x40 - tst r0, r6 - bne _081DCFB0 - movs r6, 0x3 - strb r6, [r4] - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r4, 0x18] - adds r0, r1 - str r0, [r4, 0x28] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [r4, 0x18] - movs r5, 0 - strb r5, [r4, 0x9] - str r5, [r4, 0x1C] - ldrb r2, [r3, 0x3] - movs r0, 0xC0 - tst r0, r2 - beq _081DCFF8 - movs r0, 0x10 - orrs r6, r0 - strb r6, [r4] - b _081DCFF8 -_081DCFA0: - ldrb r5, [r4, 0x9] - movs r0, 0x4 - tst r0, r6 - beq _081DCFB6 - ldrb r0, [r4, 0xD] - subs r0, 0x1 - strb r0, [r4, 0xD] - bhi _081DD006 -_081DCFB0: - movs r0, 0 - strb r0, [r4] - b _081DD240 -_081DCFB6: - movs r0, 0x40 - tst r0, r6 - beq _081DCFD6 - ldrb r0, [r4, 0x7] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, 0xC] - cmp r5, r0 - bhi _081DD006 -_081DCFC8: - ldrb r5, [r4, 0xC] - cmp r5, 0 - beq _081DCFB0 - movs r0, 0x4 - orrs r6, r0 - strb r6, [r4] - b _081DD006 -_081DCFD6: - movs r2, 0x3 - ands r2, r6 - cmp r2, 0x2 - bne _081DCFF4 - ldrb r0, [r4, 0x5] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, 0x6] - cmp r5, r0 - bhi _081DD006 - adds r5, r0, 0 - beq _081DCFC8 - subs r6, 0x1 - strb r6, [r4] - b _081DD006 -_081DCFF4: - cmp r2, 0x3 - bne _081DD006 -_081DCFF8: - ldrb r0, [r4, 0x4] - adds r5, r0 - cmp r5, 0xFF - bcc _081DD006 - movs r5, 0xFF - subs r6, 0x1 - strb r6, [r4] -_081DD006: - strb r5, [r4, 0x9] - ldr r0, [sp, 0x18] - ldrb r0, [r0, 0x7] - adds r0, 0x1 - muls r0, r5 - lsrs r5, r0, 4 - ldrb r0, [r4, 0x2] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, 0xA] - ldrb r0, [r4, 0x3] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, 0xB] - movs r0, 0x10 - ands r0, r6 - str r0, [sp, 0x10] - beq _081DD03A - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r3, 0x8] - adds r0, r1 - str r0, [sp, 0xC] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [sp, 0x10] -_081DD03A: - ldr r5, [sp, 0x8] - ldr r2, [r4, 0x18] - ldr r3, [r4, 0x28] - adr r0, _081DD044 - bx r0 - .arm -_081DD044: - str r8, [sp] - ldr r9, [r4, 0x1C] - ldrb r10, [r4, 0xA] - ldrb r11, [r4, 0xB] - ldrb r0, [r4, 0x1] - tst r0, 0x30 - beq _081DD068 - bl sub_81DD264 - b _081DD228 -_081DD068: - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldrb r0, [r4, 0x1] - tst r0, 0x8 - beq _081DD19C -_081DD07C: - cmp r2, 0x4 - ble _081DD0EC - subs r2, r2, r8 - movgt r9, 0 - bgt _081DD0A8 - mov r9, r8 - add r2, r2, r8 - sub r8, r2, 0x4 - sub r9, r9, r8 - ands r2, r2, 0x3 - moveq r2, 0x4 -_081DD0A8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0B0: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - adds r5, r5, 0x40000000 - bcc _081DD0B0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD0A8 - adds r8, r8, r9 - beq _081DD22C -_081DD0EC: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0F4: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - subs r2, r2, 0x1 - beq _081DD164 -_081DD118: - adds r5, r5, 0x40000000 - bcc _081DD0F4 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD07C - b _081DD22C -_081DD134: - ldr r0, [sp, 0x18] - cmp r0, 0 - beq _081DD158 - ldr r3, [sp, 0x14] - rsb lr, r2, 0 -_081DD148: - adds r2, r0, r2 - bgt _081DD1FC - sub lr, lr, r0 - b _081DD148 -_081DD158: - ldmia sp!, {r4,r12} - mov r2, 0 - b _081DD174 -_081DD164: - ldr r2, [sp, 0x10] - cmp r2, 0 - ldrne r3, [sp, 0xC] - bne _081DD118 -_081DD174: - strb r2, [r4] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - b _081DD234 -_081DD19C: - stmdb sp!, {r4,r12} - ldr r1, [r4, 0x20] - mul r4, r12, r1 - ldrsb r0, [r3] - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD1B4: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD1BC: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r4 - movs lr, r9, lsr 23 - beq _081DD208 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD134 - subs lr, lr, 0x1 - addeq r0, r0, r1 -_081DD1FC: - ldrsbne r0, [r3, lr]! - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD208: - adds r5, r5, 0x40000000 - bcc _081DD1BC - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD1B4 - sub r3, r3, 0x1 - ldmia sp!, {r4,r12} -_081DD228: - str r9, [r4, 0x1C] -_081DD22C: - str r2, [r4, 0x18] - str r3, [r4, 0x28] -_081DD234: - ldr r8, [sp] - add r0, pc, 0x1 - bx r0 - .thumb -_081DD240: - ldr r0, [sp, 0x4] - subs r0, 0x1 - ble _081DD24A - adds r4, 0x40 - b _081DCF40 -_081DD24A: - ldr r0, [sp, 0x18] - ldr r3, _081DD260 - str r3, [r0] - add sp, 0x1C - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} -_081DD25E: - bx r3 - .align 2, 0 -_081DD260: .4byte 0x68736d53 - thumb_func_end SoundMainRAM - - arm_func_start sub_81DD264 -sub_81DD264: @ 81DD264 - ldr r6, [r4, 0x24] - ldrb r0, [r4] - tst r0, 0x20 - bne _081DD2B4 - orr r0, r0, 0x20 - strb r0, [r4] - ldrb r0, [r4, 0x1] - tst r0, 0x10 - beq _081DD29C - ldr r1, [r6, 0xC] - add r1, r1, r6, lsl 1 - add r1, r1, 0x20 - sub r3, r1, r3 - str r3, [r4, 0x28] -_081DD29C: - ldrh r0, [r6] - cmp r0, 0 - beq _081DD2B4 - sub r3, r3, r6 - sub r3, r3, 0x10 - str r3, [r4, 0x28] -_081DD2B4: - stmdb sp!, {r8,r12,lr} - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldr r1, [r4, 0x20] - ldrb r0, [r4, 0x1] - tst r0, 0x8 - movne r8, 0x800000 - muleq r8, r12, r1 - ldrh r0, [r6] - cmp r0, 0 - beq _081DD468 - mov r0, 0xFF000000 - str r0, [r4, 0x3C] - ldrb r0, [r4, 0x1] - tst r0, 0x10 - bne _081DD3C0 - bl sub_81DD520 - mov r0, r1 - add r3, r3, 0x1 - bl sub_81DD520 - sub r1, r1, r0 -_081DD308: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD310: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD370 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD398 - subs lr, lr, 0x1 - bne _081DD358 - add r0, r0, r1 - b _081DD364 -_081DD358: - add r3, r3, lr - bl sub_81DD520 - mov r0, r1 -_081DD364: - add r3, r3, 0x1 - bl sub_81DD520 - sub r1, r1, r0 -_081DD370: - adds r5, r5, 0x40000000 - bcc _081DD310 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD308 - sub r3, r3, 0x1 - b _081DD4F0 -_081DD398: - ldr r0, [sp, 0x1C] - cmp r0, 0 - beq _081DD4F4 - ldr r3, [r4, 0x24] - ldr r3, [r3, 0x8] - rsb lr, r2, 0 -_081DD3B0: - adds r2, r2, r0 - bgt _081DD358 - sub lr, lr, r0 - b _081DD3B0 -_081DD3C0: - sub r3, r3, 0x1 - bl sub_81DD520 - mov r0, r1 - sub r3, r3, 0x1 - bl sub_81DD520 - sub r1, r1, r0 -_081DD3D8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD3E0: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD440 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - subs lr, lr, 0x1 - bne _081DD428 - add r0, r0, r1 - b _081DD434 -_081DD428: - sub r3, r3, lr - bl sub_81DD520 - mov r0, r1 -_081DD434: - sub r3, r3, 0x1 - bl sub_81DD520 - sub r1, r1, r0 -_081DD440: - adds r5, r5, 0x40000000 - bcc _081DD3E0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD3D8 - add r3, r3, 0x2 - b _081DD4F0 -_081DD468: - ldrb r0, [r4, 0x1] - tst r0, 0x10 - beq _081DD4F0 - ldrsb r0, [r3, -0x1]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD480: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD488: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD4CC - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - ldrsb r0, [r3, -lr]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD4CC: - adds r5, r5, 0x40000000 - bcc _081DD488 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD480 - add r3, r3, 0x1 -_081DD4F0: - ldmia sp!, {r8,r12,pc} -_081DD4F4: - mov r2, 0 - strb r2, [r4] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldmia sp!, {r8,r12,pc} - arm_func_end sub_81DD264 - - arm_func_start sub_81DD520 -sub_81DD520: @ 81DD520 - stmdb sp!, {r0,r2,r5-r7,lr} - mov r0, r3, lsr 6 - ldr r1, [r4, 0x3C] - cmp r0, r1 - beq _081DD594 - str r0, [r4, 0x3C] - mov r1, 0x21 - mul r2, r1, r0 - ldr r1, [r4, 0x24] - add r2, r2, r1 - add r2, r2, 0x10 - ldr r5, _081DD5A4 - ldr r6, _081DD5A8 - mov r7, 0x40 - ldrb lr, [r2], 0x1 - strb lr, [r5], 0x1 - ldrb r1, [r2], 0x1 - b _081DD57C -_081DD568: - ldrb r1, [r2], 0x1 - mov r0, r1, lsr 4 - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 0x1 -_081DD57C: - and r0, r1, 0xF - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 0x1 - subs r7, r7, 0x2 - bgt _081DD568 -_081DD594: - ldr r5, _081DD5A4 - and r0, r3, 0x3F - ldrsb r1, [r5, r0] - ldmia sp!, {r0,r2,r5-r7,pc} - .align 2, 0 -_081DD5A4: .4byte 0x030007b8 -_081DD5A8: .4byte gUnknown_0842F9F4 - arm_func_end sub_81DD520 - - thumb_func_start SoundMainBTM -SoundMainBTM: @ 81DD5AC - mov r12, r4 - movs r1, 0 - movs r2, 0 - movs r3, 0 - movs r4, 0 - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - mov r4, r12 - bx lr - thumb_func_end SoundMainBTM - - thumb_func_start ClearChain -ClearChain: @ 81DD5C4 - ldr r3, [r0, 0x2C] - cmp r3, 0 - beq _081DD5E2 - ldr r1, [r0, 0x34] - ldr r2, [r0, 0x30] - cmp r2, 0 - beq _081DD5D6 - str r1, [r2, 0x34] - b _081DD5D8 -_081DD5D6: - str r1, [r3, 0x20] -_081DD5D8: - cmp r1, 0 - beq _081DD5DE - str r2, [r1, 0x30] -_081DD5DE: - movs r1, 0 - str r1, [r0, 0x2C] -_081DD5E2: - bx lr - thumb_func_end ClearChain - - thumb_func_start ply_fine -ply_fine: @ 81DD5E4 - push {r4,r5,lr} - adds r5, r1, 0 - ldr r4, [r5, 0x20] - cmp r4, 0 - beq _081DD608 -_081DD5EE: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DD5FC - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] -_081DD5FC: - adds r0, r4, 0 - bl ClearChain - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DD5EE -_081DD608: - movs r0, 0 - strb r0, [r5] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end ply_fine - - thumb_func_start MPlyJmpTblCopy -MPlyJmpTblCopy: @ 81DD614 - mov r12, lr - movs r1, 0x24 - ldr r2, _081DD644 -_081DD61A: - ldr r3, [r2] - bl chk_adr_r2 - stm r0!, {r3} - adds r2, 0x4 - subs r1, 0x1 - bgt _081DD61A - bx r12 - thumb_func_end MPlyJmpTblCopy - - thumb_func_start ldrb_r3_r2 -ldrb_r3_r2: @ 81DD62C - ldrb r3, [r2] - thumb_func_end ldrb_r3_r2 - - non_word_aligned_thumb_func_start chk_adr_r2 -chk_adr_r2: @ 81DD62E - push {r0} - lsrs r0, r2, 25 - bne _081DD640 - ldr r0, _081DD644 - cmp r2, r0 - bcc _081DD63E - lsrs r0, r2, 14 - beq _081DD640 -_081DD63E: - movs r3, 0 -_081DD640: - pop {r0} - bx lr - .align 2, 0 -_081DD644: .4byte gUnknown_0842F964 - thumb_func_end chk_adr_r2 - - thumb_func_start ld_r3_tp_adr_i -ld_r3_tp_adr_i: @ 81DD648 - ldr r2, [r1, 0x40] -_081DD64A: - adds r3, r2, 0x1 - str r3, [r1, 0x40] - ldrb r3, [r2] - b chk_adr_r2 - thumb_func_end ld_r3_tp_adr_i - - thumb_func_start ply_goto -ply_goto: @ 81DD654 - push {lr} -_081DD656: - ldr r2, [r1, 0x40] - ldrb r0, [r2, 0x3] - lsls r0, 8 - ldrb r3, [r2, 0x2] - orrs r0, r3 - lsls r0, 8 - ldrb r3, [r2, 0x1] - orrs r0, r3 - lsls r0, 8 - bl ldrb_r3_r2 - orrs r0, r3 - str r0, [r1, 0x40] - pop {r0} - bx r0 - thumb_func_end ply_goto - - thumb_func_start ply_patt -ply_patt: @ 81DD674 - ldrb r2, [r1, 0x2] - cmp r2, 0x3 - bcs _081DD68C - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r1, 0x40] - adds r2, 0x4 - str r2, [r3, 0x44] - ldrb r2, [r1, 0x2] - adds r2, 0x1 - strb r2, [r1, 0x2] - b ply_goto -_081DD68C: - b ply_fine - thumb_func_end ply_patt - - thumb_func_start play_pend -play_pend: @ 81DD690 - ldrb r2, [r1, 0x2] - cmp r2, 0 - beq _081DD6A2 - subs r2, 0x1 - strb r2, [r1, 0x2] - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r3, 0x44] - str r2, [r1, 0x40] -_081DD6A2: - bx lr - thumb_func_end play_pend - - thumb_func_start ply_rept -ply_rept: @ 81DD6A4 - push {lr} - ldr r2, [r1, 0x40] - ldrb r3, [r2] - cmp r3, 0 - bne _081DD6B4 - adds r2, 0x1 - str r2, [r1, 0x40] - b _081DD656 -_081DD6B4: - ldrb r3, [r1, 0x3] - adds r3, 0x1 - strb r3, [r1, 0x3] - mov r12, r3 - bl ld_r3_tp_adr_i - cmp r12, r3 - bcs _081DD6C6 - b _081DD656 -_081DD6C6: - movs r3, 0 - strb r3, [r1, 0x3] - adds r2, 0x5 - str r2, [r1, 0x40] - pop {r0} - bx r0 - thumb_func_end ply_rept - - thumb_func_start ply_prio -ply_prio: @ 81DD6D4 - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, 0x1D] - bx r12 - thumb_func_end ply_prio - - thumb_func_start ply_tempo -ply_tempo: @ 81DD6E0 - mov r12, lr - bl ld_r3_tp_adr_i - lsls r3, 1 - strh r3, [r0, 0x1C] - ldrh r2, [r0, 0x1E] - muls r3, r2 - lsrs r3, 8 - strh r3, [r0, 0x20] - bx r12 - thumb_func_end ply_tempo - - thumb_func_start ply_keysh -ply_keysh: @ 81DD6F4 - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, 0xA] - ldrb r3, [r1] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_keysh - - thumb_func_start ply_voice -ply_voice: @ 81DD708 - mov r12, lr - ldr r2, [r1, 0x40] - ldrb r3, [r2] - adds r2, 0x1 - str r2, [r1, 0x40] - lsls r2, r3, 1 - adds r2, r3 - lsls r2, 2 - ldr r3, [r0, 0x30] - adds r2, r3 - ldr r3, [r2] - bl chk_adr_r2 - str r3, [r1, 0x24] - ldr r3, [r2, 0x4] - bl chk_adr_r2 - str r3, [r1, 0x28] - ldr r3, [r2, 0x8] - bl chk_adr_r2 - str r3, [r1, 0x2C] - bx r12 - thumb_func_end ply_voice - - thumb_func_start ply_vol -ply_vol: @ 81DD738 - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, 0x12] - ldrb r3, [r1] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_vol - - thumb_func_start ply_pan -ply_pan: @ 81DD74C - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, 0x14] - ldrb r3, [r1] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_pan - - thumb_func_start ply_bend -ply_bend: @ 81DD760 - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, 0xE] - ldrb r3, [r1] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_bend - - thumb_func_start ply_bendr -ply_bendr: @ 81DD774 - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, 0xF] - ldrb r3, [r1] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_bendr - - thumb_func_start ply_lfodl -ply_lfodl: @ 81DD788 - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, 0x1B] - bx r12 - thumb_func_end ply_lfodl - - thumb_func_start ply_modt -ply_modt: @ 81DD794 - mov r12, lr - bl ld_r3_tp_adr_i - ldrb r0, [r1, 0x18] - cmp r0, r3 - beq _081DD7AA - strb r3, [r1, 0x18] - ldrb r3, [r1] - movs r2, 0xF - orrs r3, r2 - strb r3, [r1] -_081DD7AA: - bx r12 - thumb_func_end ply_modt - - thumb_func_start ply_tune -ply_tune: @ 81DD7AC - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, 0xC] - ldrb r3, [r1] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1] - bx r12 - thumb_func_end ply_tune - - thumb_func_start ply_port -ply_port: @ 81DD7C0 - mov r12, lr - ldr r2, [r1, 0x40] - ldrb r3, [r2] - adds r2, 0x1 - ldr r0, _081DD7D4 - adds r0, r3 - bl _081DD64A - strb r3, [r0] - bx r12 - .align 2, 0 -_081DD7D4: .4byte 0x04000060 - thumb_func_end ply_port - - thumb_func_start SoundVSync_rev01 -SoundVSync_rev01: @ 81DD7D8 - ldr r0, _081DDA84 - ldr r0, [r0] - ldr r2, _081DDA88 - ldr r3, [r0] - subs r3, r2 - cmp r3, 0x1 - bhi _081DD818 - ldrb r1, [r0, 0x4] - subs r1, 0x1 - strb r1, [r0, 0x4] - bgt _081DD818 - ldrb r1, [r0, 0xB] - strb r1, [r0, 0x4] - ldr r2, _081DD81C - ldr r1, [r2, 0x8] - lsls r1, 7 - bcc _081DD7FE - ldr r1, _081DD820 - str r1, [r2, 0x8] -_081DD7FE: - ldr r1, [r2, 0x14] - lsls r1, 7 - bcc _081DD808 - ldr r1, _081DD820 - str r1, [r2, 0x14] -_081DD808: - movs r1, 0x4 - lsls r1, 8 - strh r1, [r2, 0xA] - strh r1, [r2, 0x16] - movs r1, 0xB6 - lsls r1, 8 - strh r1, [r2, 0xA] - strh r1, [r2, 0x16] -_081DD818: - bx lr - .align 2, 0 -_081DD81C: .4byte 0x040000bc -_081DD820: .4byte 0x84400004 - thumb_func_end SoundVSync_rev01 - - thumb_func_start MPlayMain_rev01 -MPlayMain_rev01: @ 81DD824 - ldr r2, _081DDA88 - ldr r3, [r0, 0x34] - cmp r2, r3 - beq _081DD82E - bx lr -_081DD82E: - adds r3, 0x1 - str r3, [r0, 0x34] - push {r0,lr} - ldr r3, [r0, 0x38] - cmp r3, 0 - beq _081DD840 - ldr r0, [r0, 0x3C] - bl _081DDA7C -_081DD840: - pop {r0} - push {r4-r7} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - adds r7, r0, 0 - ldr r0, [r7, 0x4] - cmp r0, 0 - bge _081DD858 - b _081DDA6C -_081DD858: - ldr r0, _081DDA84 - ldr r0, [r0] - mov r8, r0 - adds r0, r7, 0 - bl FadeOutBody_rev01 - ldr r0, [r7, 0x4] - cmp r0, 0 - bge _081DD86C - b _081DDA6C -_081DD86C: - ldrh r0, [r7, 0x22] - ldrh r1, [r7, 0x20] - adds r0, r1 - b _081DD9BC -_081DD874: - ldrb r6, [r7, 0x8] - ldr r5, [r7, 0x2C] - movs r3, 0x1 - movs r4, 0 -_081DD87C: - ldrb r0, [r5] - movs r1, 0x80 - tst r1, r0 - bne _081DD886 - b _081DD998 -_081DD886: - mov r10, r3 - orrs r4, r3 - mov r11, r4 - ldr r4, [r5, 0x20] - cmp r4, 0 - beq _081DD8BA -_081DD892: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DD8AE - ldrb r0, [r4, 0x10] - cmp r0, 0 - beq _081DD8B4 - subs r0, 0x1 - strb r0, [r4, 0x10] - bne _081DD8B4 - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] - b _081DD8B4 -_081DD8AE: - adds r0, r4, 0 - bl ClearChain_rev -_081DD8B4: - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DD892 -_081DD8BA: - ldrb r3, [r5] - movs r0, 0x40 - tst r0, r3 - beq _081DD938 - adds r0, r5, 0 - bl Clear64byte_rev - movs r0, 0x80 - strb r0, [r5] - movs r0, 0x2 - strb r0, [r5, 0xF] - movs r0, 0x40 - strb r0, [r5, 0x13] - movs r0, 0x16 - strb r0, [r5, 0x19] - movs r0, 0x1 - adds r1, r5, 0x6 - strb r0, [r1, 0x1E] - b _081DD938 -_081DD8E0: - ldr r2, [r5, 0x40] - ldrb r1, [r2] - cmp r1, 0x80 - bcs _081DD8EC - ldrb r1, [r5, 0x7] - b _081DD8F6 -_081DD8EC: - adds r2, 0x1 - str r2, [r5, 0x40] - cmp r1, 0xBD - bcc _081DD8F6 - strb r1, [r5, 0x7] -_081DD8F6: - cmp r1, 0xCF - bcc _081DD90C - mov r0, r8 - ldr r3, [r0, 0x38] - adds r0, r1, 0 - subs r0, 0xCF - adds r1, r7, 0 - adds r2, r5, 0 - bl _081DDA7C - b _081DD938 -_081DD90C: - cmp r1, 0xB0 - bls _081DD92E - adds r0, r1, 0 - subs r0, 0xB1 - strb r0, [r7, 0xA] - mov r3, r8 - ldr r3, [r3, 0x34] - lsls r0, 2 - ldr r3, [r3, r0] - adds r0, r7, 0 - adds r1, r5, 0 - bl _081DDA7C - ldrb r0, [r5] - cmp r0, 0 - beq _081DD994 - b _081DD938 -_081DD92E: - ldr r0, _081DDA80 - subs r1, 0x80 - adds r1, r0 - ldrb r0, [r1] - strb r0, [r5, 0x1] -_081DD938: - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _081DD8E0 - subs r0, 0x1 - strb r0, [r5, 0x1] - ldrb r1, [r5, 0x19] - cmp r1, 0 - beq _081DD994 - ldrb r0, [r5, 0x17] - cmp r0, 0 - beq _081DD994 - ldrb r0, [r5, 0x1C] - cmp r0, 0 - beq _081DD95A - subs r0, 0x1 - strb r0, [r5, 0x1C] - b _081DD994 -_081DD95A: - ldrb r0, [r5, 0x1A] - adds r0, r1 - strb r0, [r5, 0x1A] - adds r1, r0, 0 - subs r0, 0x40 - lsls r0, 24 - bpl _081DD96E - lsls r2, r1, 24 - asrs r2, 24 - b _081DD972 -_081DD96E: - movs r0, 0x80 - subs r2, r0, r1 -_081DD972: - ldrb r0, [r5, 0x17] - muls r0, r2 - asrs r2, r0, 6 - ldrb r0, [r5, 0x16] - eors r0, r2 - lsls r0, 24 - beq _081DD994 - strb r2, [r5, 0x16] - ldrb r0, [r5] - ldrb r1, [r5, 0x18] - cmp r1, 0 - bne _081DD98E - movs r1, 0xC - b _081DD990 -_081DD98E: - movs r1, 0x3 -_081DD990: - orrs r0, r1 - strb r0, [r5] -_081DD994: - mov r3, r10 - mov r4, r11 -_081DD998: - subs r6, 0x1 - ble _081DD9A4 - movs r0, 0x50 - adds r5, r0 - lsls r3, 1 - b _081DD87C -_081DD9A4: - ldr r0, [r7, 0xC] - adds r0, 0x1 - str r0, [r7, 0xC] - cmp r4, 0 - bne _081DD9B6 - movs r0, 0x80 - lsls r0, 24 - str r0, [r7, 0x4] - b _081DDA6C -_081DD9B6: - str r4, [r7, 0x4] - ldrh r0, [r7, 0x22] - subs r0, 0x96 -_081DD9BC: - strh r0, [r7, 0x22] - cmp r0, 0x96 - bcc _081DD9C4 - b _081DD874 -_081DD9C4: - ldrb r2, [r7, 0x8] - ldr r5, [r7, 0x2C] -_081DD9C8: - ldrb r0, [r5] - movs r1, 0x80 - tst r1, r0 - beq _081DDA62 - movs r1, 0xF - tst r1, r0 - beq _081DDA62 - mov r9, r2 - adds r0, r7, 0 - adds r1, r5, 0 - bl TrkVolPitSet_rev01 - ldr r4, [r5, 0x20] - cmp r4, 0 - beq _081DDA58 -_081DD9E6: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - bne _081DD9F6 - adds r0, r4, 0 - bl ClearChain_rev - b _081DDA52 -_081DD9F6: - ldrb r0, [r4, 0x1] - movs r6, 0x7 - ands r6, r0 - ldrb r3, [r5] - movs r0, 0x3 - tst r0, r3 - beq _081DDA14 - bl ChnVolSetAsm - cmp r6, 0 - beq _081DDA14 - ldrb r0, [r4, 0x1D] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r4, 0x1D] -_081DDA14: - ldrb r3, [r5] - movs r0, 0xC - tst r0, r3 - beq _081DDA52 - ldrb r1, [r4, 0x8] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r2, r1, r0 - bpl _081DDA28 - movs r2, 0 -_081DDA28: - cmp r6, 0 - beq _081DDA46 - mov r0, r8 - ldr r3, [r0, 0x30] - adds r1, r2, 0 - ldrb r2, [r5, 0x9] - adds r0, r6, 0 - bl _081DDA7C - str r0, [r4, 0x20] - ldrb r0, [r4, 0x1D] - movs r1, 0x2 - orrs r0, r1 - strb r0, [r4, 0x1D] - b _081DDA52 -_081DDA46: - adds r1, r2, 0 - ldrb r2, [r5, 0x9] - ldr r0, [r4, 0x24] - bl MidiKey2fr - str r0, [r4, 0x20] -_081DDA52: - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DD9E6 -_081DDA58: - ldrb r0, [r5] - movs r1, 0xF0 - ands r0, r1 - strb r0, [r5] - mov r2, r9 -_081DDA62: - subs r2, 0x1 - ble _081DDA6C - movs r0, 0x50 - adds r5, r0 - bgt _081DD9C8 -_081DDA6C: - ldr r0, _081DDA88 - str r0, [r7, 0x34] - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} -_081DDA7C: - bx r3 - .align 2, 0 -_081DDA80: .4byte gUnknown_0842FBE8 -_081DDA84: .4byte 0x03007ff0 -_081DDA88: .4byte 0x68736d53 - thumb_func_end MPlayMain_rev01 - - thumb_func_start TrackStop_rev01 -TrackStop_rev01: @ 81DDA8C - push {r4-r6,lr} - adds r5, r1, 0 - ldrb r1, [r5] - movs r0, 0x80 - tst r0, r1 - beq _081DDAC4 - ldr r4, [r5, 0x20] - cmp r4, 0 - beq _081DDAC2 - movs r6, 0 -_081DDAA0: - ldrb r0, [r4] - cmp r0, 0 - beq _081DDABA - ldrb r0, [r4, 0x1] - movs r3, 0x7 - ands r0, r3 - beq _081DDAB8 - ldr r3, _081DDACC - ldr r3, [r3] - ldr r3, [r3, 0x2C] - bl _081DDA7C -_081DDAB8: - strb r6, [r4] -_081DDABA: - str r6, [r4, 0x2C] - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DDAA0 -_081DDAC2: - str r4, [r5, 0x20] -_081DDAC4: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DDACC: .4byte 0x03007ff0 - thumb_func_end TrackStop_rev01 - - thumb_func_start ChnVolSetAsm -ChnVolSetAsm: @ 81DDAD0 - ldrb r1, [r4, 0x12] - movs r0, 0x14 - ldrsb r2, [r4, r0] - movs r3, 0x80 - adds r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x10] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAE8 - movs r0, 0xFF -_081DDAE8: - strb r0, [r4, 0x2] - movs r3, 0x7F - subs r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x11] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAFC - movs r0, 0xFF -_081DDAFC: - strb r0, [r4, 0x3] - bx lr - thumb_func_end ChnVolSetAsm - - thumb_func_start ply_note_rev01 -ply_note_rev01: @ 81DDB00 - push {r4-r7,lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - sub sp, 0x18 - str r1, [sp] - adds r5, r2, 0 - ldr r1, _081DDCFC - ldr r1, [r1] - str r1, [sp, 0x4] - ldr r1, _081DDD00 - adds r0, r1 - ldrb r0, [r0] - strb r0, [r5, 0x4] - ldr r3, [r5, 0x40] - ldrb r0, [r3] - cmp r0, 0x80 - bcs _081DDB46 - strb r0, [r5, 0x5] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bcs _081DDB44 - strb r0, [r5, 0x6] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bcs _081DDB44 - ldrb r1, [r5, 0x4] - adds r1, r0 - strb r1, [r5, 0x4] - adds r3, 0x1 -_081DDB44: - str r3, [r5, 0x40] -_081DDB46: - movs r0, 0 - str r0, [sp, 0x14] - adds r4, r5, 0 - adds r4, 0x24 - ldrb r2, [r4] - movs r0, 0xC0 - tst r0, r2 - beq _081DDB98 - ldrb r3, [r5, 0x5] - movs r0, 0x40 - tst r0, r2 - beq _081DDB66 - ldr r1, [r5, 0x2C] - adds r1, r3 - ldrb r0, [r1] - b _081DDB68 -_081DDB66: - adds r0, r3, 0 -_081DDB68: - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - ldr r0, [r5, 0x28] - adds r1, r0 - mov r9, r1 - mov r6, r9 - ldrb r1, [r6] - movs r0, 0xC0 - tst r0, r1 - beq _081DDB80 - b _081DDCEA -_081DDB80: - movs r0, 0x80 - tst r0, r2 - beq _081DDB9C - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - beq _081DDB94 - subs r1, 0xC0 - lsls r1, 1 - str r1, [sp, 0x14] -_081DDB94: - ldrb r3, [r6, 0x1] - b _081DDB9C -_081DDB98: - mov r9, r4 - ldrb r3, [r5, 0x5] -_081DDB9C: - str r3, [sp, 0x8] - ldr r6, [sp] - ldrb r1, [r6, 0x9] - ldrb r0, [r5, 0x1D] - adds r0, r1 - cmp r0, 0xFF - bls _081DDBAC - movs r0, 0xFF -_081DDBAC: - str r0, [sp, 0x10] - mov r6, r9 - ldrb r0, [r6] - movs r6, 0x7 - ands r6, r0 - str r6, [sp, 0xC] - beq _081DDBEC - ldr r0, [sp, 0x4] - ldr r4, [r0, 0x1C] - cmp r4, 0 - bne _081DDBC4 - b _081DDCEA -_081DDBC4: - subs r6, 0x1 - lsls r0, r6, 6 - adds r4, r0 - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - bne _081DDC40 - ldrb r1, [r4, 0x13] - ldr r0, [sp, 0x10] - cmp r1, r0 - bcc _081DDC40 - beq _081DDBE4 - b _081DDCEA -_081DDBE4: - ldr r0, [r4, 0x2C] - cmp r0, r5 - bcs _081DDC40 - b _081DDCEA -_081DDBEC: - ldr r6, [sp, 0x10] - adds r7, r5, 0 - movs r2, 0 - mov r8, r2 - ldr r4, [sp, 0x4] - ldrb r3, [r4, 0x6] - adds r4, 0x50 -_081DDBFA: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - beq _081DDC14 - cmp r2, 0 - bne _081DDC18 - adds r2, 0x1 - ldrb r6, [r4, 0x13] - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC14: - cmp r2, 0 - bne _081DDC34 -_081DDC18: - ldrb r0, [r4, 0x13] - cmp r0, r6 - bcs _081DDC24 - adds r6, r0, 0 - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC24: - bhi _081DDC34 - ldr r0, [r4, 0x2C] - cmp r0, r7 - bls _081DDC30 - adds r7, r0, 0 - b _081DDC32 -_081DDC30: - bcc _081DDC34 -_081DDC32: - mov r8, r4 -_081DDC34: - adds r4, 0x40 - subs r3, 0x1 - bgt _081DDBFA - mov r4, r8 - cmp r4, 0 - beq _081DDCEA -_081DDC40: - adds r0, r4, 0 - bl ClearChain_rev - movs r1, 0 - str r1, [r4, 0x30] - ldr r3, [r5, 0x20] - str r3, [r4, 0x34] - cmp r3, 0 - beq _081DDC54 - str r4, [r3, 0x30] -_081DDC54: - str r4, [r5, 0x20] - str r5, [r4, 0x2C] - ldrb r0, [r5, 0x1B] - strb r0, [r5, 0x1C] - cmp r0, r1 - beq _081DDC66 - adds r1, r5, 0 - bl clear_modM -_081DDC66: - ldr r0, [sp] - adds r1, r5, 0 - bl TrkVolPitSet_rev01 - ldr r0, [r5, 0x4] - str r0, [r4, 0x10] - ldr r0, [sp, 0x10] - strb r0, [r4, 0x13] - ldr r0, [sp, 0x8] - strb r0, [r4, 0x8] - ldr r0, [sp, 0x14] - strb r0, [r4, 0x14] - mov r6, r9 - ldrb r0, [r6] - strb r0, [r4, 0x1] - ldr r7, [r6, 0x4] - str r7, [r4, 0x24] - ldr r0, [r6, 0x8] - str r0, [r4, 0x4] - ldrh r0, [r5, 0x1E] - strh r0, [r4, 0xC] - bl ChnVolSetAsm - ldrb r1, [r4, 0x8] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r3, r1, r0 - bpl _081DDCA0 - movs r3, 0 -_081DDCA0: - ldr r6, [sp, 0xC] - cmp r6, 0 - beq _081DDCCE - mov r6, r9 - ldrb r0, [r6, 0x2] - strb r0, [r4, 0x1E] - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - bne _081DDCBA - movs r0, 0x70 - tst r0, r1 - bne _081DDCBC -_081DDCBA: - movs r1, 0x8 -_081DDCBC: - strb r1, [r4, 0x1F] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - ldr r0, [sp, 0xC] - ldr r3, [sp, 0x4] - ldr r3, [r3, 0x30] - bl _081DDA7C - b _081DDCDC -_081DDCCE: - ldr r0, [r5, 0x3C] - str r0, [r4, 0x18] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - adds r0, r7, 0 - bl MidiKey2fr -_081DDCDC: - str r0, [r4, 0x20] - movs r0, 0x80 - strb r0, [r4] - ldrb r1, [r5] - movs r0, 0xF0 - ands r0, r1 - strb r0, [r5] -_081DDCEA: - add sp, 0x18 - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r0} - bx r0 - .align 2, 0 -_081DDCFC: .4byte 0x03007ff0 -_081DDD00: .4byte gUnknown_0842FBE8 - thumb_func_end ply_note_rev01 - - thumb_func_start ply_endtie_rev01 -ply_endtie_rev01: @ 81DDD04 - push {r4,r5} - ldr r2, [r1, 0x40] - ldrb r3, [r2] - cmp r3, 0x80 - bcs _081DDD16 - strb r3, [r1, 0x5] - adds r2, 0x1 - str r2, [r1, 0x40] - b _081DDD18 -_081DDD16: - ldrb r3, [r1, 0x5] -_081DDD18: - ldr r1, [r1, 0x20] - cmp r1, 0 - beq _081DDD40 - movs r4, 0x83 - movs r5, 0x40 -_081DDD22: - ldrb r2, [r1] - tst r2, r4 - beq _081DDD3A - tst r2, r5 - bne _081DDD3A - ldrb r0, [r1, 0x11] - cmp r0, r3 - bne _081DDD3A - movs r0, 0x40 - orrs r2, r0 - strb r2, [r1] - b _081DDD40 -_081DDD3A: - ldr r1, [r1, 0x34] - cmp r1, 0 - bne _081DDD22 -_081DDD40: - pop {r4,r5} - bx lr - thumb_func_end ply_endtie_rev01 - - thumb_func_start clear_modM -clear_modM: @ 81DDD44 - movs r2, 0 - strb r2, [r1, 0x16] - strb r2, [r1, 0x1A] - ldrb r2, [r1, 0x18] - cmp r2, 0 - bne _081DDD54 - movs r2, 0xC - b _081DDD56 -_081DDD54: - movs r2, 0x3 -_081DDD56: - ldrb r3, [r1] - orrs r3, r2 - strb r3, [r1] - bx lr - thumb_func_end clear_modM - - thumb_func_start ld_r3_tp_adr_i_rev -ld_r3_tp_adr_i_rev: @ 81DDD60 - ldr r2, [r1, 0x40] - adds r3, r2, 0x1 - str r3, [r1, 0x40] - ldrb r3, [r2] - bx lr - thumb_func_end ld_r3_tp_adr_i_rev - - thumb_func_start ply_lfos_rev01 -ply_lfos_rev01: @ 81DDD6C - mov r12, lr - bl ld_r3_tp_adr_i_rev - strb r3, [r1, 0x19] - cmp r3, 0 - bne _081DDD7C - bl clear_modM -_081DDD7C: - bx r12 - thumb_func_end ply_lfos_rev01 - - thumb_func_start ply_mod_rev01 -ply_mod_rev01: @ 81DDD80 - mov r12, lr - bl ld_r3_tp_adr_i_rev - strb r3, [r1, 0x17] - cmp r3, 0 - bne _081DDD90 - bl clear_modM -_081DDD90: - bx r12 - thumb_func_end ply_mod_rev01 - - thumb_func_start MidiKey2fr -MidiKey2fr: @ 81DDD94 - push {r4-r7,lr} - mov r12, r0 - lsls r1, 24 - lsrs r6, r1, 24 - lsls r7, r2, 24 - cmp r6, 0xB2 - bls _081DDDA8 - movs r6, 0xB2 - movs r7, 0xFF - lsls r7, 24 -_081DDDA8: - ldr r3, _081DDDF0 - adds r0, r6, r3 - ldrb r5, [r0] - ldr r4, _081DDDF4 - movs r2, 0xF - adds r0, r5, 0 - ands r0, r2 - lsls r0, 2 - adds r0, r4 - lsrs r1, r5, 4 - ldr r5, [r0] - lsrs r5, r1 - adds r0, r6, 0x1 - adds r0, r3 - ldrb r1, [r0] - adds r0, r1, 0 - ands r0, r2 - lsls r0, 2 - adds r0, r4 - lsrs r1, 4 - ldr r0, [r0] - lsrs r0, r1 - mov r1, r12 - ldr r4, [r1, 0x4] - subs r0, r5 - adds r1, r7, 0 - bl umul3232H32 - adds r1, r0, 0 - adds r1, r5, r1 - adds r0, r4, 0 - bl umul3232H32 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081DDDF0: .4byte gUnknown_0842FA04 -_081DDDF4: .4byte gUnknown_0842FAB8 - thumb_func_end MidiKey2fr - - thumb_func_start DummyFunc -DummyFunc: @ 81DDDF8 - bx lr - thumb_func_end DummyFunc - - thumb_func_start MPlayContinue -MPlayContinue: @ 81DDDFC - adds r2, r0, 0 - ldr r3, [r2, 0x34] - ldr r0, _081DDE10 - cmp r3, r0 - bne _081DDE0E - ldr r0, [r2, 0x4] - ldr r1, _081DDE14 - ands r0, r1 - str r0, [r2, 0x4] -_081DDE0E: - bx lr - .align 2, 0 -_081DDE10: .4byte 0x68736d53 -_081DDE14: .4byte 0x7fffffff - thumb_func_end MPlayContinue - - thumb_func_start MPlayFadeOut -@ void MPlayFadeOut(mplay_table_entry *a1, s16 a2) -MPlayFadeOut: @ 81DDE18 - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - ldr r3, [r2, 0x34] - ldr r0, _081DDE34 - cmp r3, r0 - bne _081DDE30 - strh r1, [r2, 0x26] - strh r1, [r2, 0x24] - movs r0, 0x80 - lsls r0, 1 - strh r0, [r2, 0x28] -_081DDE30: - bx lr - .align 2, 0 -_081DDE34: .4byte 0x68736d53 - thumb_func_end MPlayFadeOut - - thumb_func_start m4aSoundInit -m4aSoundInit: @ 81DDE38 - push {r4-r6,lr} - ldr r0, _081DDEB8 - movs r1, 0x2 - negs r1, r1 - ands r0, r1 - ldr r1, _081DDEBC - ldr r2, _081DDEC0 - bl CpuSet - ldr r0, _081DDEC4 - bl SoundInit_rev01 - ldr r0, _081DDEC8 - bl MPlayExtender - ldr r0, _081DDECC - bl SoundMode_rev01 - ldr r0, _081DDED0 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _081DDE86 - ldr r6, _081DDED4 - adds r5, r0, 0 -_081DDE6A: - ldr r4, [r6] - ldr r1, [r6, 0x4] - ldrb r2, [r6, 0x8] - adds r0, r4, 0 - bl MPlayOpen_rev01 - ldrh r0, [r6, 0xA] - strb r0, [r4, 0xB] - ldr r0, _081DDED8 - str r0, [r4, 0x18] - adds r6, 0xC - subs r5, 0x1 - cmp r5, 0 - bne _081DDE6A -_081DDE86: - ldr r0, _081DDEDC - ldr r1, _081DDEE0 - movs r2, 0x34 - bl memcpy - movs r5, 0 - movs r6, 0 -_081DDE94: - lsls r0, r5, 6 - ldr r1, _081DDEE4 - adds r0, r1 - ldr r4, _081DDEE8 - adds r4, r6, r4 - adds r1, r4, 0 - movs r2, 0x2 - bl MPlayOpen_rev01 - movs r0, 0 - str r0, [r4, 0x20] - adds r6, 0xA0 - adds r5, 0x1 - cmp r5, 0x1 - ble _081DDE94 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DDEB8: .4byte SoundMainRAM -_081DDEBC: .4byte 0x03000f60 -_081DDEC0: .4byte 0x04000200 -_081DDEC4: .4byte 0x03005fd0 -_081DDEC8: .4byte 0x03007100 -_081DDECC: .4byte 0x0094c500 -_081DDED0: .4byte 0x00000004 -_081DDED4: .4byte gUnknown_0845545C -_081DDED8: .4byte 0x03007440 -_081DDEDC: .4byte 0x03007340 -_081DDEE0: .4byte gUnknown_0842FC1C -_081DDEE4: .4byte 0x03006ff0 -_081DDEE8: .4byte 0x03007200 - thumb_func_end m4aSoundInit - - thumb_func_start m4aSoundMain -m4aSoundMain: @ 81DDEEC - push {lr} - bl SoundMain - pop {r0} - bx r0 - thumb_func_end m4aSoundMain - - thumb_func_start m4aSongNumStart -m4aSongNumStart: @ 81DDEF8 - push {lr} - lsls r0, 16 - ldr r2, _081DDF1C - ldr r1, _081DDF20 - lsrs r0, 13 - adds r0, r1 - ldrh r3, [r0, 0x4] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r2 - ldr r2, [r1] - ldr r1, [r0] - adds r0, r2, 0 - bl MPlayStart_rev01 - pop {r0} - bx r0 - .align 2, 0 -_081DDF1C: .4byte gUnknown_0845545C -_081DDF20: .4byte gUnknown_0845548C - thumb_func_end m4aSongNumStart - - thumb_func_start m4aSongNumStartOrChange -m4aSongNumStartOrChange: @ 81DDF24 - push {lr} - lsls r0, 16 - ldr r2, _081DDF50 - ldr r1, _081DDF54 - lsrs r0, 13 - adds r0, r1 - ldrh r3, [r0, 0x4] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r2 - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r0] - cmp r3, r2 - beq _081DDF58 - adds r0, r1, 0 - adds r1, r2, 0 - bl MPlayStart_rev01 - b _081DDF6C - .align 2, 0 -_081DDF50: .4byte gUnknown_0845545C -_081DDF54: .4byte gUnknown_0845548C -_081DDF58: - ldr r2, [r1, 0x4] - ldrh r0, [r1, 0x4] - cmp r0, 0 - beq _081DDF64 - cmp r2, 0 - bge _081DDF6C -_081DDF64: - adds r0, r1, 0 - adds r1, r3, 0 - bl MPlayStart_rev01 -_081DDF6C: - pop {r0} - bx r0 - thumb_func_end m4aSongNumStartOrChange - - thumb_func_start m4aSongNumStartOrContinue -m4aSongNumStartOrContinue: @ 81DDF70 - push {lr} - lsls r0, 16 - ldr r2, _081DDF9C - ldr r1, _081DDFA0 - lsrs r0, 13 - adds r0, r1 - ldrh r3, [r0, 0x4] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r2 - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r0] - cmp r3, r2 - beq _081DDFA4 - adds r0, r1, 0 - adds r1, r2, 0 - bl MPlayStart_rev01 - b _081DDFC0 - .align 2, 0 -_081DDF9C: .4byte gUnknown_0845545C -_081DDFA0: .4byte gUnknown_0845548C -_081DDFA4: - ldr r2, [r1, 0x4] - ldrh r0, [r1, 0x4] - cmp r0, 0 - bne _081DDFB6 - adds r0, r1, 0 - adds r1, r3, 0 - bl MPlayStart_rev01 - b _081DDFC0 -_081DDFB6: - cmp r2, 0 - bge _081DDFC0 - adds r0, r1, 0 - bl MPlayContinue -_081DDFC0: - pop {r0} - bx r0 - thumb_func_end m4aSongNumStartOrContinue - - thumb_func_start m4aSongNumStop -m4aSongNumStop: @ 81DDFC4 - push {lr} - lsls r0, 16 - ldr r2, _081DDFF0 - ldr r1, _081DDFF4 - lsrs r0, 13 - adds r0, r1 - ldrh r3, [r0, 0x4] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r2 - ldr r2, [r1] - ldr r1, [r2] - ldr r0, [r0] - cmp r1, r0 - bne _081DDFEA - adds r0, r2, 0 - bl MPlayStop_rev01 -_081DDFEA: - pop {r0} - bx r0 - .align 2, 0 -_081DDFF0: .4byte gUnknown_0845545C -_081DDFF4: .4byte gUnknown_0845548C - thumb_func_end m4aSongNumStop - - thumb_func_start m4aSongNumContinue -m4aSongNumContinue: @ 81DDFF8 - push {lr} - lsls r0, 16 - ldr r2, _081DE024 - ldr r1, _081DE028 - lsrs r0, 13 - adds r0, r1 - ldrh r3, [r0, 0x4] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r2 - ldr r2, [r1] - ldr r1, [r2] - ldr r0, [r0] - cmp r1, r0 - bne _081DE01E - adds r0, r2, 0 - bl MPlayContinue -_081DE01E: - pop {r0} - bx r0 - .align 2, 0 -_081DE024: .4byte gUnknown_0845545C -_081DE028: .4byte gUnknown_0845548C - thumb_func_end m4aSongNumContinue - - thumb_func_start m4aMPlayAllStop -m4aMPlayAllStop: @ 81DE02C - push {r4,r5,lr} - ldr r0, _081DE064 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _081DE04A - ldr r5, _081DE068 - adds r4, r0, 0 -_081DE03C: - ldr r0, [r5] - bl MPlayStop_rev01 - adds r5, 0xC - subs r4, 0x1 - cmp r4, 0 - bne _081DE03C -_081DE04A: - ldr r5, _081DE06C - movs r4, 0x1 -_081DE04E: - adds r0, r5, 0 - bl MPlayStop_rev01 - adds r5, 0x40 - subs r4, 0x1 - cmp r4, 0 - bge _081DE04E - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DE064: .4byte 0x00000004 -_081DE068: .4byte gUnknown_0845545C -_081DE06C: .4byte 0x03006ff0 - thumb_func_end m4aMPlayAllStop - - thumb_func_start m4aMPlayContinue -m4aMPlayContinue: @ 81DE070 - push {lr} - bl MPlayContinue - pop {r0} - bx r0 - thumb_func_end m4aMPlayContinue - - thumb_func_start m4aMPlayAllContinue -m4aMPlayAllContinue: @ 81DE07A - push {r4,r5,lr} - ldr r0, _081DE0B4 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _081DE09A - ldr r5, _081DE0B8 - adds r4, r0, 0 -_081DE08C: - ldr r0, [r5] - bl MPlayContinue - adds r5, 0xC - subs r4, 0x1 - cmp r4, 0 - bne _081DE08C -_081DE09A: - ldr r5, _081DE0BC - movs r4, 0x1 -_081DE09E: - adds r0, r5, 0 - bl MPlayContinue - adds r5, 0x40 - subs r4, 0x1 - cmp r4, 0 - bge _081DE09E - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DE0B4: .4byte 0x00000004 -_081DE0B8: .4byte gUnknown_0845545C -_081DE0BC: .4byte 0x03006ff0 - thumb_func_end m4aMPlayAllContinue - - thumb_func_start m4aMPlayFadeOut -@ void m4aMPlayFadeOut(mplay_table_entry *a1, u16 a2) -m4aMPlayFadeOut: @ 81DE0C0 - push {lr} - lsls r1, 16 - lsrs r1, 16 - bl MPlayFadeOut - pop {r0} - bx r0 - thumb_func_end m4aMPlayFadeOut - - thumb_func_start sub_81DE0D0 -sub_81DE0D0: @ 81DE0D0 - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - ldr r3, [r2, 0x34] - ldr r0, _081DE0E8 - cmp r3, r0 - bne _081DE0E6 - strh r1, [r2, 0x26] - strh r1, [r2, 0x24] - ldr r0, _081DE0EC - strh r0, [r2, 0x28] -_081DE0E6: - bx lr - .align 2, 0 -_081DE0E8: .4byte 0x68736d53 -_081DE0EC: .4byte 0x00000101 - thumb_func_end sub_81DE0D0 - - thumb_func_start sub_81DE0F0 -sub_81DE0F0: @ 81DE0F0 - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - ldr r3, [r2, 0x34] - ldr r0, _081DE110 - cmp r3, r0 - bne _081DE10E - strh r1, [r2, 0x26] - strh r1, [r2, 0x24] - movs r0, 0x2 - strh r0, [r2, 0x28] - ldr r0, [r2, 0x4] - ldr r1, _081DE114 - ands r0, r1 - str r0, [r2, 0x4] -_081DE10E: - bx lr - .align 2, 0 -_081DE110: .4byte 0x68736d53 -_081DE114: .4byte 0x7fffffff - thumb_func_end sub_81DE0F0 - - thumb_func_start m4aMPlayImmInit -m4aMPlayImmInit: @ 81DE118 - push {r4-r7,lr} - ldrb r5, [r0, 0x8] - ldr r4, [r0, 0x2C] - cmp r5, 0 - ble _081DE15A - movs r7, 0x80 -_081DE124: - ldrb r1, [r4] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _081DE152 - movs r6, 0x40 - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _081DE152 - adds r0, r4, 0 - bl Clear64byte_rev - strb r7, [r4] - movs r0, 0x2 - strb r0, [r4, 0xF] - strb r6, [r4, 0x13] - movs r0, 0x16 - strb r0, [r4, 0x19] - adds r1, r4, 0 - adds r1, 0x24 - movs r0, 0x1 - strb r0, [r1] -_081DE152: - subs r5, 0x1 - adds r4, 0x50 - cmp r5, 0 - bgt _081DE124 -_081DE15A: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end m4aMPlayImmInit - - thumb_func_start MPlayExtender -@ int MPlayExtender(void *dest) -MPlayExtender: @ 81DE160 - push {r4-r6,lr} - sub sp, 0x4 - adds r5, r0, 0 - ldr r1, _081DE228 - movs r0, 0x8F - strh r0, [r1] - ldr r3, _081DE22C - movs r2, 0 - strh r2, [r3] - ldr r0, _081DE230 - movs r1, 0x8 - strb r1, [r0] - adds r0, 0x6 - strb r1, [r0] - adds r0, 0x10 - strb r1, [r0] - subs r0, 0x14 - movs r1, 0x80 - strb r1, [r0] - adds r0, 0x8 - strb r1, [r0] - adds r0, 0x10 - strb r1, [r0] - subs r0, 0xD - strb r2, [r0] - movs r0, 0x77 - strb r0, [r3] - ldr r0, _081DE234 - ldr r4, [r0] - ldr r6, [r4] - ldr r0, _081DE238 - cmp r6, r0 - bne _081DE220 - adds r0, r6, 0x1 - str r0, [r4] - ldr r1, _081DE23C - ldr r0, _081DE240 - str r0, [r1, 0x20] - ldr r0, _081DE244 - str r0, [r1, 0x44] - ldr r0, _081DE248 - str r0, [r1, 0x4C] - ldr r0, _081DE24C - str r0, [r1, 0x70] - ldr r0, _081DE250 - str r0, [r1, 0x74] - ldr r0, _081DE254 - str r0, [r1, 0x78] - ldr r0, _081DE258 - str r0, [r1, 0x7C] - adds r2, r1, 0 - adds r2, 0x80 - ldr r0, _081DE25C - str r0, [r2] - adds r1, 0x84 - ldr r0, _081DE260 - str r0, [r1] - str r5, [r4, 0x1C] - ldr r0, _081DE264 - str r0, [r4, 0x28] - ldr r0, _081DE268 - str r0, [r4, 0x2C] - ldr r0, _081DE26C - str r0, [r4, 0x30] - ldr r0, _081DE270 - movs r1, 0 - strb r0, [r4, 0xC] - str r1, [sp] - ldr r2, _081DE274 - mov r0, sp - adds r1, r5, 0 - bl CpuSet - movs r0, 0x1 - strb r0, [r5, 0x1] - movs r0, 0x11 - strb r0, [r5, 0x1C] - adds r1, r5, 0 - adds r1, 0x41 - movs r0, 0x2 - strb r0, [r1] - adds r1, 0x1B - movs r0, 0x22 - strb r0, [r1] - adds r1, 0x25 - movs r0, 0x3 - strb r0, [r1] - adds r1, 0x1B - movs r0, 0x44 - strb r0, [r1] - adds r1, 0x24 - movs r0, 0x4 - strb r0, [r1, 0x1] - movs r0, 0x88 - strb r0, [r1, 0x1C] - str r6, [r4] -_081DE220: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DE228: .4byte 0x04000084 -_081DE22C: .4byte 0x04000080 -_081DE230: .4byte 0x04000063 -_081DE234: .4byte 0x03007ff0 -_081DE238: .4byte 0x68736d53 -_081DE23C: .4byte 0x03007070 -_081DE240: .4byte ply_memacc -_081DE244: .4byte ply_lfos_rev01 -_081DE248: .4byte ply_mod_rev01 -_081DE24C: .4byte ply_xcmd -_081DE250: .4byte ply_endtie_rev01 -_081DE254: .4byte SampFreqSet_rev01 -_081DE258: .4byte TrackStop_rev01 -_081DE25C: .4byte FadeOutBody_rev01 -_081DE260: .4byte TrkVolPitSet_rev01 -_081DE264: .4byte CgbSound -_081DE268: .4byte CgbOscOff -_081DE26C: .4byte MidiKey2CgbFr -_081DE270: .4byte 0x0000003c -_081DE274: .4byte 0x05000040 - thumb_func_end MPlayExtender - - thumb_func_start MusicPlayerJumpTableCopy -MusicPlayerJumpTableCopy: @ 81DE278 - swi 0x2A - bx lr - thumb_func_end MusicPlayerJumpTableCopy - - thumb_func_start ClearChain_rev -ClearChain_rev: @ 81DE27C - push {lr} - ldr r1, _081DE28C - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_081DE28C: .4byte 0x030070f8 - thumb_func_end ClearChain_rev - - thumb_func_start Clear64byte_rev -Clear64byte_rev: @ 81DE290 - push {lr} - ldr r1, _081DE2A0 - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_081DE2A0: .4byte 0x030070fc - thumb_func_end Clear64byte_rev - - thumb_func_start SoundInit_rev01 -@ int SoundInit_rev01(void *dest) -SoundInit_rev01: @ 81DE2A4 - push {r4,r5,lr} - sub sp, 0x4 - adds r5, r0, 0 - movs r3, 0 - str r3, [r5] - ldr r1, _081DE35C - ldr r0, [r1] - movs r2, 0x80 - lsls r2, 18 - ands r0, r2 - cmp r0, 0 - beq _081DE2C0 - ldr r0, _081DE360 - str r0, [r1] -_081DE2C0: - ldr r1, _081DE364 - ldr r0, [r1] - ands r0, r2 - cmp r0, 0 - beq _081DE2CE - ldr r0, _081DE360 - str r0, [r1] -_081DE2CE: - ldr r0, _081DE368 - movs r2, 0x80 - lsls r2, 3 - adds r1, r2, 0 - strh r1, [r0] - adds r0, 0xC - strh r1, [r0] - ldr r1, _081DE36C - movs r0, 0x8F - strh r0, [r1] - subs r1, 0x2 - ldr r2, _081DE370 - adds r0, r2, 0 - strh r0, [r1] - ldr r2, _081DE374 - ldrb r1, [r2] - movs r0, 0x3F - ands r0, r1 - movs r1, 0x40 - orrs r0, r1 - strb r0, [r2] - ldr r1, _081DE378 - movs r2, 0xD4 - lsls r2, 2 - adds r0, r5, r2 - str r0, [r1] - adds r1, 0x4 - ldr r0, _081DE37C - str r0, [r1] - adds r1, 0x8 - movs r2, 0x98 - lsls r2, 4 - adds r0, r5, r2 - str r0, [r1] - adds r1, 0x4 - ldr r0, _081DE380 - str r0, [r1] - ldr r0, _081DE384 - str r5, [r0] - str r3, [sp] - ldr r2, _081DE388 - mov r0, sp - adds r1, r5, 0 - bl CpuSet - movs r0, 0x8 - strb r0, [r5, 0x6] - movs r0, 0xF - strb r0, [r5, 0x7] - ldr r0, _081DE38C - str r0, [r5, 0x38] - ldr r0, _081DE390 - str r0, [r5, 0x28] - str r0, [r5, 0x2C] - str r0, [r5, 0x30] - str r0, [r5, 0x3C] - ldr r4, _081DE394 - adds r0, r4, 0 - bl MPlyJmpTblCopy - str r4, [r5, 0x34] - movs r0, 0x80 - lsls r0, 11 - bl SampFreqSet_rev01 - ldr r0, _081DE398 - str r0, [r5] - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DE35C: .4byte 0x040000c4 -_081DE360: .4byte 0x84400004 -_081DE364: .4byte 0x040000d0 -_081DE368: .4byte 0x040000c6 -_081DE36C: .4byte 0x04000084 -_081DE370: .4byte 0x0000a90e -_081DE374: .4byte 0x04000089 -_081DE378: .4byte 0x040000bc -_081DE37C: .4byte 0x040000a0 -_081DE380: .4byte 0x040000a4 -_081DE384: .4byte 0x03007ff0 -_081DE388: .4byte 0x050003ec -_081DE38C: .4byte ply_note_rev01 -_081DE390: .4byte DummyFunc_rev -_081DE394: .4byte 0x03007070 -_081DE398: .4byte 0x68736d53 - thumb_func_end SoundInit_rev01 - - thumb_func_start SampFreqSet_rev01 -SampFreqSet_rev01: @ 81DE39C - push {r4-r6,lr} - adds r2, r0, 0 - ldr r0, _081DE41C - ldr r4, [r0] - movs r0, 0xF0 - lsls r0, 12 - ands r0, r2 - lsrs r2, r0, 16 - movs r6, 0 - strb r2, [r4, 0x8] - ldr r1, _081DE420 - subs r0, r2, 0x1 - lsls r0, 1 - adds r0, r1 - ldrh r5, [r0] - str r5, [r4, 0x10] - movs r0, 0xC6 - lsls r0, 3 - adds r1, r5, 0 - bl __divsi3 - strb r0, [r4, 0xB] - ldr r0, _081DE424 - muls r0, r5 - ldr r1, _081DE428 - adds r0, r1 - ldr r1, _081DE42C - bl __divsi3 - adds r1, r0, 0 - str r1, [r4, 0x14] - movs r0, 0x80 - lsls r0, 17 - bl __divsi3 - adds r0, 0x1 - asrs r0, 1 - str r0, [r4, 0x18] - ldr r0, _081DE430 - strh r6, [r0] - ldr r4, _081DE434 - ldr r0, _081DE438 - adds r1, r5, 0 - bl __divsi3 - negs r0, r0 - strh r0, [r4] - bl SoundVSyncOn_rev01 - ldr r1, _081DE43C -_081DE400: - ldrb r0, [r1] - cmp r0, 0x9F - beq _081DE400 - ldr r1, _081DE43C -_081DE408: - ldrb r0, [r1] - cmp r0, 0x9F - bne _081DE408 - ldr r1, _081DE430 - movs r0, 0x80 - strh r0, [r1] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DE41C: .4byte 0x03007ff0 -_081DE420: .4byte gUnknown_0842FAE8 -_081DE424: .4byte 0x00091d1b -_081DE428: .4byte 0x00001388 -_081DE42C: .4byte 0x00002710 -_081DE430: .4byte 0x04000102 -_081DE434: .4byte 0x04000100 -_081DE438: .4byte 0x00044940 -_081DE43C: .4byte 0x04000006 - thumb_func_end SampFreqSet_rev01 - - thumb_func_start SoundMode_rev01 -SoundMode_rev01: @ 81DE440 - push {r4,r5,lr} - adds r3, r0, 0 - ldr r0, _081DE4CC - ldr r5, [r0] - ldr r1, [r5] - ldr r0, _081DE4D0 - cmp r1, r0 - bne _081DE4C6 - adds r0, r1, 0x1 - str r0, [r5] - movs r4, 0xFF - ands r4, r3 - cmp r4, 0 - beq _081DE462 - movs r0, 0x7F - ands r4, r0 - strb r4, [r5, 0x5] -_081DE462: - movs r4, 0xF0 - lsls r4, 4 - ands r4, r3 - cmp r4, 0 - beq _081DE482 - lsrs r0, r4, 8 - strb r0, [r5, 0x6] - movs r4, 0xC - adds r0, r5, 0 - adds r0, 0x50 - movs r1, 0 -_081DE478: - strb r1, [r0] - subs r4, 0x1 - adds r0, 0x40 - cmp r4, 0 - bne _081DE478 -_081DE482: - movs r4, 0xF0 - lsls r4, 8 - ands r4, r3 - cmp r4, 0 - beq _081DE490 - lsrs r0, r4, 12 - strb r0, [r5, 0x7] -_081DE490: - movs r4, 0xB0 - lsls r4, 16 - ands r4, r3 - cmp r4, 0 - beq _081DE4AE - movs r0, 0xC0 - lsls r0, 14 - ands r0, r4 - lsrs r4, r0, 14 - ldr r2, _081DE4D4 - ldrb r1, [r2] - movs r0, 0x3F - ands r0, r1 - orrs r0, r4 - strb r0, [r2] -_081DE4AE: - movs r4, 0xF0 - lsls r4, 12 - ands r4, r3 - cmp r4, 0 - beq _081DE4C2 - bl SoundVSyncOff_rev01 - adds r0, r4, 0 - bl SampFreqSet_rev01 -_081DE4C2: - ldr r0, _081DE4D0 - str r0, [r5] -_081DE4C6: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DE4CC: .4byte 0x03007ff0 -_081DE4D0: .4byte 0x68736d53 -_081DE4D4: .4byte 0x04000089 - thumb_func_end SoundMode_rev01 - - thumb_func_start SoundClear_rev01 -SoundClear_rev01: @ 81DE4D8 - push {r4-r7,lr} - ldr r0, _081DE524 - ldr r6, [r0] - ldr r1, [r6] - ldr r0, _081DE528 - cmp r1, r0 - bne _081DE51E - adds r0, r1, 0x1 - str r0, [r6] - movs r5, 0xC - adds r4, r6, 0 - adds r4, 0x50 - movs r0, 0 -_081DE4F2: - strb r0, [r4] - subs r5, 0x1 - adds r4, 0x40 - cmp r5, 0 - bgt _081DE4F2 - ldr r4, [r6, 0x1C] - cmp r4, 0 - beq _081DE51A - movs r5, 0x1 - movs r7, 0 -_081DE506: - lsls r0, r5, 24 - lsrs r0, 24 - ldr r1, [r6, 0x2C] - bl _call_via_r1 - strb r7, [r4] - adds r5, 0x1 - adds r4, 0x40 - cmp r5, 0x4 - ble _081DE506 -_081DE51A: - ldr r0, _081DE528 - str r0, [r6] -_081DE51E: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DE524: .4byte 0x03007ff0 -_081DE528: .4byte 0x68736d53 - thumb_func_end SoundClear_rev01 - - thumb_func_start SoundVSyncOff_rev01 -SoundVSyncOff_rev01: @ 81DE52C - push {lr} - sub sp, 0x4 - ldr r0, _081DE58C - ldr r2, [r0] - ldr r1, [r2] - ldr r3, _081DE590 - adds r0, r1, r3 - cmp r0, 0x1 - bhi _081DE584 - adds r0, r1, 0 - adds r0, 0xA - str r0, [r2] - ldr r1, _081DE594 - ldr r0, [r1] - movs r3, 0x80 - lsls r3, 18 - ands r0, r3 - cmp r0, 0 - beq _081DE556 - ldr r0, _081DE598 - str r0, [r1] -_081DE556: - ldr r1, _081DE59C - ldr r0, [r1] - ands r0, r3 - cmp r0, 0 - beq _081DE564 - ldr r0, _081DE598 - str r0, [r1] -_081DE564: - ldr r0, _081DE5A0 - movs r3, 0x80 - lsls r3, 3 - adds r1, r3, 0 - strh r1, [r0] - adds r0, 0xC - strh r1, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xD4 - lsls r0, 2 - adds r1, r2, r0 - ldr r2, _081DE5A4 - mov r0, sp - bl CpuSet -_081DE584: - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_081DE58C: .4byte 0x03007ff0 -_081DE590: .4byte 0x978c92ad -_081DE594: .4byte 0x040000c4 -_081DE598: .4byte 0x84400004 -_081DE59C: .4byte 0x040000d0 -_081DE5A0: .4byte 0x040000c6 -_081DE5A4: .4byte 0x05000318 - thumb_func_end SoundVSyncOff_rev01 - - thumb_func_start SoundVSyncOn_rev01 -SoundVSyncOn_rev01: @ 81DE5A8 - push {r4,lr} - ldr r0, _081DE5D8 - ldr r2, [r0] - ldr r3, [r2] - ldr r0, _081DE5DC - cmp r3, r0 - beq _081DE5D0 - ldr r0, _081DE5E0 - movs r4, 0xB6 - lsls r4, 8 - adds r1, r4, 0 - strh r1, [r0] - adds r0, 0xC - strh r1, [r0] - ldrb r0, [r2, 0x4] - movs r0, 0 - strb r0, [r2, 0x4] - adds r0, r3, 0 - subs r0, 0xA - str r0, [r2] -_081DE5D0: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DE5D8: .4byte 0x03007ff0 -_081DE5DC: .4byte 0x68736d53 -_081DE5E0: .4byte 0x040000c6 - thumb_func_end SoundVSyncOn_rev01 - - thumb_func_start MPlayOpen_rev01 -MPlayOpen_rev01: @ 81DE5E4 - push {r4-r7,lr} - adds r7, r0, 0 - adds r6, r1, 0 - lsls r2, 24 - lsrs r4, r2, 24 - cmp r4, 0 - beq _081DE648 - cmp r4, 0x10 - bls _081DE5F8 - movs r4, 0x10 -_081DE5F8: - ldr r0, _081DE650 - ldr r5, [r0] - ldr r1, [r5] - ldr r0, _081DE654 - cmp r1, r0 - bne _081DE648 - adds r0, r1, 0x1 - str r0, [r5] - adds r0, r7, 0 - bl Clear64byte_rev - str r6, [r7, 0x2C] - strb r4, [r7, 0x8] - movs r0, 0x80 - lsls r0, 24 - str r0, [r7, 0x4] - cmp r4, 0 - beq _081DE62C - movs r1, 0 -_081DE61E: - strb r1, [r6] - subs r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - adds r6, 0x50 - cmp r4, 0 - bne _081DE61E -_081DE62C: - ldr r0, [r5, 0x20] - cmp r0, 0 - beq _081DE63C - str r0, [r7, 0x38] - ldr r0, [r5, 0x24] - str r0, [r7, 0x3C] - movs r0, 0 - str r0, [r5, 0x20] -_081DE63C: - str r7, [r5, 0x24] - ldr r0, _081DE658 - str r0, [r5, 0x20] - ldr r0, _081DE654 - str r0, [r5] - str r0, [r7, 0x34] -_081DE648: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DE650: .4byte 0x03007ff0 -_081DE654: .4byte 0x68736d53 -_081DE658: .4byte MPlayMain_rev01 - thumb_func_end MPlayOpen_rev01 - - thumb_func_start MPlayStart_rev01 -MPlayStart_rev01: @ 81DE65C - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r5, r0, 0 - adds r7, r1, 0 - ldr r1, [r5, 0x34] - ldr r0, _081DE73C - cmp r1, r0 - bne _081DE732 - ldrb r0, [r5, 0xB] - ldrb r2, [r7, 0x2] - cmp r0, 0 - beq _081DE69E - ldr r0, [r5] - cmp r0, 0 - beq _081DE688 - ldr r1, [r5, 0x2C] - movs r0, 0x40 - ldrb r1, [r1] - ands r0, r1 - cmp r0, 0 - bne _081DE694 -_081DE688: - ldr r1, [r5, 0x4] - ldrh r0, [r5, 0x4] - cmp r0, 0 - beq _081DE69E - cmp r1, 0 - blt _081DE69E -_081DE694: - ldrb r0, [r7, 0x2] - adds r2, r0, 0 - ldrb r0, [r5, 0x9] - cmp r0, r2 - bhi _081DE732 -_081DE69E: - ldr r0, [r5, 0x34] - adds r0, 0x1 - str r0, [r5, 0x34] - movs r1, 0 - str r1, [r5, 0x4] - str r7, [r5] - ldr r0, [r7, 0x4] - str r0, [r5, 0x30] - strb r2, [r5, 0x9] - str r1, [r5, 0xC] - movs r0, 0x96 - strh r0, [r5, 0x1C] - strh r0, [r5, 0x20] - adds r0, 0x6A - strh r0, [r5, 0x1E] - strh r1, [r5, 0x22] - strh r1, [r5, 0x24] - movs r6, 0 - ldr r4, [r5, 0x2C] - ldrb r1, [r7] - cmp r6, r1 - bge _081DE6FE - ldrb r0, [r5, 0x8] - cmp r6, r0 - bge _081DE71E - mov r8, r6 -_081DE6D2: - adds r0, r5, 0 - adds r1, r4, 0 - bl TrackStop_rev01 - movs r0, 0xC0 - strb r0, [r4] - mov r1, r8 - str r1, [r4, 0x20] - lsls r1, r6, 2 - adds r0, r7, 0 - adds r0, 0x8 - adds r0, r1 - ldr r0, [r0] - str r0, [r4, 0x40] - adds r6, 0x1 - adds r4, 0x50 - ldrb r0, [r7] - cmp r6, r0 - bge _081DE6FE - ldrb r1, [r5, 0x8] - cmp r6, r1 - blt _081DE6D2 -_081DE6FE: - ldrb r0, [r5, 0x8] - cmp r6, r0 - bge _081DE71E - movs r1, 0 - mov r8, r1 -_081DE708: - adds r0, r5, 0 - adds r1, r4, 0 - bl TrackStop_rev01 - mov r0, r8 - strb r0, [r4] - adds r6, 0x1 - adds r4, 0x50 - ldrb r1, [r5, 0x8] - cmp r6, r1 - blt _081DE708 -_081DE71E: - movs r0, 0x80 - ldrb r1, [r7, 0x3] - ands r0, r1 - cmp r0, 0 - beq _081DE72E - ldrb r0, [r7, 0x3] - bl SoundMode_rev01 -_081DE72E: - ldr r0, _081DE73C - str r0, [r5, 0x34] -_081DE732: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DE73C: .4byte 0x68736d53 - thumb_func_end MPlayStart_rev01 - - thumb_func_start MPlayStop_rev01 -MPlayStop_rev01: @ 81DE740 - push {r4-r6,lr} - adds r6, r0, 0 - ldr r1, [r6, 0x34] - ldr r0, _081DE77C - cmp r1, r0 - bne _081DE776 - adds r0, r1, 0x1 - str r0, [r6, 0x34] - ldr r0, [r6, 0x4] - movs r1, 0x80 - lsls r1, 24 - orrs r0, r1 - str r0, [r6, 0x4] - ldrb r4, [r6, 0x8] - ldr r5, [r6, 0x2C] - cmp r4, 0 - ble _081DE772 -_081DE762: - adds r0, r6, 0 - adds r1, r5, 0 - bl TrackStop_rev01 - subs r4, 0x1 - adds r5, 0x50 - cmp r4, 0 - bgt _081DE762 -_081DE772: - ldr r0, _081DE77C - str r0, [r6, 0x34] -_081DE776: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DE77C: .4byte 0x68736d53 - thumb_func_end MPlayStop_rev01 - - thumb_func_start FadeOutBody_rev01 -FadeOutBody_rev01: @ 81DE780 - push {r4-r7,lr} - adds r6, r0, 0 - ldrh r1, [r6, 0x24] - cmp r1, 0 - beq _081DE842 - ldrh r0, [r6, 0x26] - subs r0, 0x1 - strh r0, [r6, 0x26] - ldr r3, _081DE7C0 - adds r2, r3, 0 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0 - bne _081DE842 - strh r1, [r6, 0x26] - ldrh r1, [r6, 0x28] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _081DE7C4 - adds r0, r1, 0 - adds r0, 0x10 - strh r0, [r6, 0x28] - ands r0, r2 - cmp r0, 0xFF - bls _081DE816 - movs r0, 0x80 - lsls r0, 1 - strh r0, [r6, 0x28] - strh r3, [r6, 0x24] - b _081DE816 - .align 2, 0 -_081DE7C0: .4byte 0x0000ffff -_081DE7C4: - adds r0, r1, 0 - subs r0, 0x10 - strh r0, [r6, 0x28] - ands r0, r2 - lsls r0, 16 - cmp r0, 0 - bgt _081DE816 - ldrb r5, [r6, 0x8] - ldr r4, [r6, 0x2C] - cmp r5, 0 - ble _081DE7F6 -_081DE7DA: - adds r0, r6, 0 - adds r1, r4, 0 - bl TrackStop_rev01 - movs r0, 0x1 - ldrh r7, [r6, 0x28] - ands r0, r7 - cmp r0, 0 - bne _081DE7EE - strb r0, [r4] -_081DE7EE: - subs r5, 0x1 - adds r4, 0x50 - cmp r5, 0 - bgt _081DE7DA -_081DE7F6: - movs r0, 0x1 - ldrh r1, [r6, 0x28] - ands r0, r1 - cmp r0, 0 - beq _081DE80A - ldr r0, [r6, 0x4] - movs r1, 0x80 - lsls r1, 24 - orrs r0, r1 - b _081DE80E -_081DE80A: - movs r0, 0x80 - lsls r0, 24 -_081DE80E: - str r0, [r6, 0x4] - movs r0, 0 - strh r0, [r6, 0x24] - b _081DE842 -_081DE816: - ldrb r5, [r6, 0x8] - ldr r4, [r6, 0x2C] - cmp r5, 0 - ble _081DE842 - movs r3, 0x80 - movs r7, 0 - movs r2, 0x3 -_081DE824: - ldrb r1, [r4] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _081DE83A - ldrh r7, [r6, 0x28] - lsrs r0, r7, 2 - strb r0, [r4, 0x13] - adds r0, r1, 0 - orrs r0, r2 - strb r0, [r4] -_081DE83A: - subs r5, 0x1 - adds r4, 0x50 - cmp r5, 0 - bgt _081DE824 -_081DE842: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end FadeOutBody_rev01 - - thumb_func_start TrkVolPitSet_rev01 -TrkVolPitSet_rev01: @ 81DE848 - push {r4,lr} - adds r2, r1, 0 - movs r0, 0x1 - ldrb r1, [r2] - ands r0, r1 - cmp r0, 0 - beq _081DE8AC - ldrb r3, [r2, 0x13] - ldrb r1, [r2, 0x12] - adds r0, r3, 0 - muls r0, r1 - lsrs r3, r0, 5 - ldrb r4, [r2, 0x18] - cmp r4, 0x1 - bne _081DE870 - movs r0, 0x16 - ldrsb r0, [r2, r0] - adds r0, 0x80 - muls r0, r3 - lsrs r3, r0, 7 -_081DE870: - movs r0, 0x14 - ldrsb r0, [r2, r0] - lsls r0, 1 - movs r1, 0x15 - ldrsb r1, [r2, r1] - adds r1, r0, r1 - cmp r4, 0x2 - bne _081DE886 - movs r0, 0x16 - ldrsb r0, [r2, r0] - adds r1, r0 -_081DE886: - movs r0, 0x80 - negs r0, r0 - cmp r1, r0 - bge _081DE892 - adds r1, r0, 0 - b _081DE898 -_081DE892: - cmp r1, 0x7F - ble _081DE898 - movs r1, 0x7F -_081DE898: - adds r0, r1, 0 - adds r0, 0x80 - muls r0, r3 - lsrs r0, 8 - strb r0, [r2, 0x10] - movs r0, 0x7F - subs r0, r1 - muls r0, r3 - lsrs r0, 8 - strb r0, [r2, 0x11] -_081DE8AC: - ldrb r1, [r2] - movs r0, 0x4 - ands r0, r1 - adds r3, r1, 0 - cmp r0, 0 - beq _081DE8F0 - movs r0, 0xE - ldrsb r0, [r2, r0] - ldrb r1, [r2, 0xF] - muls r0, r1 - movs r1, 0xC - ldrsb r1, [r2, r1] - adds r1, r0 - lsls r1, 2 - movs r0, 0xA - ldrsb r0, [r2, r0] - lsls r0, 8 - adds r1, r0 - movs r0, 0xB - ldrsb r0, [r2, r0] - lsls r0, 8 - adds r1, r0 - ldrb r0, [r2, 0xD] - adds r1, r0, r1 - ldrb r0, [r2, 0x18] - cmp r0, 0 - bne _081DE8EA - movs r0, 0x16 - ldrsb r0, [r2, r0] - lsls r0, 4 - adds r1, r0 -_081DE8EA: - asrs r0, r1, 8 - strb r0, [r2, 0x8] - strb r1, [r2, 0x9] -_081DE8F0: - movs r0, 0xFA - ands r0, r3 - strb r0, [r2] - pop {r4} - pop {r0} - bx r0 - thumb_func_end TrkVolPitSet_rev01 - - thumb_func_start MidiKey2CgbFr -MidiKey2CgbFr: @ 81DE8FC - push {r4-r7,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - lsls r2, 24 - lsrs r2, 24 - mov r12, r2 - cmp r0, 0x4 - bne _081DE934 - cmp r5, 0x14 - bhi _081DE918 - movs r5, 0 - b _081DE926 -_081DE918: - adds r0, r5, 0 - subs r0, 0x15 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3B - bls _081DE926 - movs r5, 0x3B -_081DE926: - ldr r0, _081DE930 - adds r0, r5, r0 - ldrb r0, [r0] - b _081DE996 - .align 2, 0 -_081DE930: .4byte gUnknown_0842FB9C -_081DE934: - cmp r5, 0x23 - bhi _081DE940 - movs r0, 0 - mov r12, r0 - movs r5, 0 - b _081DE952 -_081DE940: - adds r0, r5, 0 - subs r0, 0x24 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x82 - bls _081DE952 - movs r5, 0x82 - movs r1, 0xFF - mov r12, r1 -_081DE952: - ldr r3, _081DE99C - adds r0, r5, r3 - ldrb r6, [r0] - ldr r4, _081DE9A0 - movs r2, 0xF - adds r0, r6, 0 - ands r0, r2 - lsls r0, 1 - adds r0, r4 - movs r7, 0 - ldrsh r1, [r0, r7] - asrs r0, r6, 4 - adds r6, r1, 0 - asrs r6, r0 - adds r0, r5, 0x1 - adds r0, r3 - ldrb r1, [r0] - adds r0, r1, 0 - ands r0, r2 - lsls r0, 1 - adds r0, r4 - movs r2, 0 - ldrsh r0, [r0, r2] - asrs r1, 4 - asrs r0, r1 - subs r0, r6 - mov r7, r12 - muls r7, r0 - adds r0, r7, 0 - asrs r0, 8 - adds r0, r6, r0 - movs r1, 0x80 - lsls r1, 4 - adds r0, r1 -_081DE996: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081DE99C: .4byte gUnknown_0842FB00 -_081DE9A0: .4byte gUnknown_0842FB84 - thumb_func_end MidiKey2CgbFr - - thumb_func_start CgbOscOff -CgbOscOff: @ 81DE9A4 - lsls r0, 24 - lsrs r0, 24 - adds r1, r0, 0 - cmp r0, 0x2 - beq _081DE9CC - cmp r0, 0x2 - bgt _081DE9B8 - cmp r0, 0x1 - beq _081DE9BE - b _081DE9E0 -_081DE9B8: - cmp r1, 0x3 - beq _081DE9D4 - b _081DE9E0 -_081DE9BE: - ldr r1, _081DE9C8 - movs r0, 0x8 - strb r0, [r1] - adds r1, 0x2 - b _081DE9E8 - .align 2, 0 -_081DE9C8: .4byte 0x04000063 -_081DE9CC: - ldr r1, _081DE9D0 - b _081DE9E2 - .align 2, 0 -_081DE9D0: .4byte 0x04000069 -_081DE9D4: - ldr r1, _081DE9DC - movs r0, 0 - b _081DE9EA - .align 2, 0 -_081DE9DC: .4byte 0x04000070 -_081DE9E0: - ldr r1, _081DE9F0 -_081DE9E2: - movs r0, 0x8 - strb r0, [r1] - adds r1, 0x4 -_081DE9E8: - movs r0, 0x80 -_081DE9EA: - strb r0, [r1] - bx lr - .align 2, 0 -_081DE9F0: .4byte 0x04000079 - thumb_func_end CgbOscOff - - thumb_func_start CgbModVol -CgbModVol: @ 81DE9F4 - push {r4,lr} - adds r2, r0, 0 - ldr r0, _081DEA24 - ldr r1, [r0] - movs r0, 0x1 - ldrb r1, [r1, 0x9] - ands r0, r1 - cmp r0, 0 - bne _081DEA34 - ldrb r0, [r2, 0x2] - lsls r1, r0, 24 - lsrs r4, r1, 24 - ldrb r3, [r2, 0x3] - lsls r0, r3, 24 - lsrs r3, r0, 24 - cmp r4, r3 - bcc _081DEA28 - lsrs r0, r1, 25 - cmp r0, r3 - bcc _081DEA34 - movs r0, 0xF - strb r0, [r2, 0x1B] - b _081DEA42 - .align 2, 0 -_081DEA24: .4byte 0x03007ff0 -_081DEA28: - lsrs r0, 25 - cmp r0, r4 - bcc _081DEA34 - movs r0, 0xF0 - strb r0, [r2, 0x1B] - b _081DEA42 -_081DEA34: - movs r0, 0xFF - strb r0, [r2, 0x1B] - ldrb r1, [r2, 0x3] - ldrb r3, [r2, 0x2] - adds r0, r1, r3 - lsrs r0, 4 - b _081DEA52 -_081DEA42: - ldrb r1, [r2, 0x3] - ldrb r3, [r2, 0x2] - adds r0, r1, r3 - lsrs r0, 4 - strb r0, [r2, 0xA] - cmp r0, 0xF - bls _081DEA54 - movs r0, 0xF -_081DEA52: - strb r0, [r2, 0xA] -_081DEA54: - ldrb r1, [r2, 0x6] - ldrb r3, [r2, 0xA] - adds r0, r1, 0 - muls r0, r3 - adds r0, 0xF - asrs r0, 4 - strb r0, [r2, 0x19] - ldrb r0, [r2, 0x1C] - ldrb r1, [r2, 0x1B] - ands r0, r1 - strb r0, [r2, 0x1B] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CgbModVol - - thumb_func_start CgbSound -CgbSound: @ 81DEA70 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - ldr r0, _081DEA90 - ldr r0, [r0] - str r0, [sp, 0x4] - ldrb r0, [r0, 0xA] - cmp r0, 0 - beq _081DEA94 - subs r0, 0x1 - ldr r1, [sp, 0x4] - strb r0, [r1, 0xA] - b _081DEA9A - .align 2, 0 -_081DEA90: .4byte 0x03007ff0 -_081DEA94: - movs r0, 0xE - ldr r2, [sp, 0x4] - strb r0, [r2, 0xA] -_081DEA9A: - movs r6, 0x1 - ldr r0, [sp, 0x4] - ldr r4, [r0, 0x1C] -_081DEAA0: - ldrb r1, [r4] - movs r0, 0xC7 - ands r0, r1 - adds r2, r6, 0x1 - mov r10, r2 - movs r2, 0x40 - adds r2, r4 - mov r9, r2 - cmp r0, 0 - bne _081DEAB6 - b _081DEEA0 -_081DEAB6: - cmp r6, 0x2 - beq _081DEAE8 - cmp r6, 0x2 - bgt _081DEAC4 - cmp r6, 0x1 - beq _081DEACA - b _081DEB20 -_081DEAC4: - cmp r6, 0x3 - beq _081DEB00 - b _081DEB20 -_081DEACA: - ldr r0, _081DEADC - str r0, [sp, 0x8] - ldr r7, _081DEAE0 - ldr r2, _081DEAE4 - str r2, [sp, 0xC] - adds r0, 0x4 - str r0, [sp, 0x10] - adds r2, 0x2 - b _081DEB30 - .align 2, 0 -_081DEADC: .4byte 0x04000060 -_081DEAE0: .4byte 0x04000062 -_081DEAE4: .4byte 0x04000063 -_081DEAE8: - ldr r0, _081DEAF4 - str r0, [sp, 0x8] - ldr r7, _081DEAF8 - ldr r2, _081DEAFC - b _081DEB28 - .align 2, 0 -_081DEAF4: .4byte 0x04000061 -_081DEAF8: .4byte 0x04000068 -_081DEAFC: .4byte 0x04000069 -_081DEB00: - ldr r0, _081DEB14 - str r0, [sp, 0x8] - ldr r7, _081DEB18 - ldr r2, _081DEB1C - str r2, [sp, 0xC] - adds r0, 0x4 - str r0, [sp, 0x10] - adds r2, 0x2 - b _081DEB30 - .align 2, 0 -_081DEB14: .4byte 0x04000070 -_081DEB18: .4byte 0x04000072 -_081DEB1C: .4byte 0x04000073 -_081DEB20: - ldr r0, _081DEB80 - str r0, [sp, 0x8] - ldr r7, _081DEB84 - ldr r2, _081DEB88 -_081DEB28: - str r2, [sp, 0xC] - adds r0, 0xB - str r0, [sp, 0x10] - adds r2, 0x4 -_081DEB30: - str r2, [sp, 0x14] - ldr r0, [sp, 0x4] - ldrb r0, [r0, 0xA] - str r0, [sp] - ldr r2, [sp, 0xC] - ldrb r0, [r2] - mov r8, r0 - adds r2, r1, 0 - movs r0, 0x80 - ands r0, r2 - cmp r0, 0 - beq _081DEC26 - movs r3, 0x40 - adds r0, r3, 0 - ands r0, r2 - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r6, 0x1 - mov r10, r0 - movs r1, 0x40 - adds r1, r4 - mov r9, r1 - cmp r5, 0 - bne _081DEC4A - movs r0, 0x3 - strb r0, [r4] - strb r0, [r4, 0x1D] - adds r0, r4, 0 - str r3, [sp, 0x18] - bl CgbModVol - ldr r3, [sp, 0x18] - cmp r6, 0x2 - beq _081DEB98 - cmp r6, 0x2 - bgt _081DEB8C - cmp r6, 0x1 - beq _081DEB92 - b _081DEBEC - .align 2, 0 -_081DEB80: .4byte 0x04000071 -_081DEB84: .4byte 0x04000078 -_081DEB88: .4byte 0x04000079 -_081DEB8C: - cmp r6, 0x3 - beq _081DEBA4 - b _081DEBEC -_081DEB92: - ldrb r0, [r4, 0x1F] - ldr r2, [sp, 0x8] - strb r0, [r2] -_081DEB98: - ldr r0, [r4, 0x24] - lsls r0, 6 - ldrb r1, [r4, 0x1E] - adds r0, r1, r0 - strb r0, [r7] - b _081DEBF8 -_081DEBA4: - ldr r1, [r4, 0x24] - ldr r0, [r4, 0x28] - cmp r1, r0 - beq _081DEBCC - ldr r2, [sp, 0x8] - strb r3, [r2] - ldr r1, _081DEBE0 - ldr r2, [r4, 0x24] - ldr r0, [r2] - str r0, [r1] - adds r1, 0x4 - ldr r0, [r2, 0x4] - str r0, [r1] - adds r1, 0x4 - ldr r0, [r2, 0x8] - str r0, [r1] - adds r1, 0x4 - ldr r0, [r2, 0xC] - str r0, [r1] - str r2, [r4, 0x28] -_081DEBCC: - ldr r0, [sp, 0x8] - strb r5, [r0] - ldrb r0, [r4, 0x1E] - strb r0, [r7] - ldrb r0, [r4, 0x1E] - cmp r0, 0 - beq _081DEBE4 - movs r0, 0xC0 - b _081DEC06 - .align 2, 0 -_081DEBE0: .4byte 0x04000090 -_081DEBE4: - movs r1, 0x80 - negs r1, r1 - strb r1, [r4, 0x1A] - b _081DEC08 -_081DEBEC: - ldrb r0, [r4, 0x1E] - strb r0, [r7] - ldr r0, [r4, 0x24] - lsls r0, 3 - ldr r2, [sp, 0x10] - strb r0, [r2] -_081DEBF8: - ldrb r0, [r4, 0x4] - adds r0, 0x8 - mov r8, r0 - ldrb r0, [r4, 0x1E] - cmp r0, 0 - beq _081DEC06 - movs r0, 0x40 -_081DEC06: - strb r0, [r4, 0x1A] -_081DEC08: - ldrb r1, [r4, 0x4] - movs r2, 0 - strb r1, [r4, 0xB] - movs r0, 0xFF - ands r0, r1 - adds r1, r6, 0x1 - mov r10, r1 - movs r1, 0x40 - adds r1, r4 - mov r9, r1 - cmp r0, 0 - bne _081DEC22 - b _081DED5E -_081DEC22: - strb r2, [r4, 0x9] - b _081DED8C -_081DEC26: - movs r0, 0x4 - ands r0, r2 - cmp r0, 0 - beq _081DEC58 - ldrb r0, [r4, 0xD] - subs r0, 0x1 - strb r0, [r4, 0xD] - movs r2, 0xFF - ands r0, r2 - lsls r0, 24 - adds r1, r6, 0x1 - mov r10, r1 - movs r2, 0x40 - adds r2, r4 - mov r9, r2 - cmp r0, 0 - ble _081DEC4A - b _081DED9E -_081DEC4A: - lsls r0, r6, 24 - lsrs r0, 24 - bl CgbOscOff - movs r0, 0 - strb r0, [r4] - b _081DEE9C -_081DEC58: - movs r0, 0x40 - ands r0, r1 - adds r2, r6, 0x1 - mov r10, r2 - movs r2, 0x40 - adds r2, r4 - mov r9, r2 - cmp r0, 0 - beq _081DEC98 - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _081DEC98 - movs r0, 0xFC - ands r0, r1 - movs r2, 0 - strb r0, [r4] - ldrb r1, [r4, 0x7] - strb r1, [r4, 0xB] - movs r0, 0xFF - ands r0, r1 - cmp r0, 0 - beq _081DECCA - movs r0, 0x1 - ldrb r1, [r4, 0x1D] - orrs r0, r1 - strb r0, [r4, 0x1D] - cmp r6, 0x3 - beq _081DED8C - ldrb r2, [r4, 0x7] - mov r8, r2 - b _081DED8C -_081DEC98: - ldrb r0, [r4, 0xB] - cmp r0, 0 - bne _081DED8C - cmp r6, 0x3 - bne _081DECAA - movs r0, 0x1 - ldrb r1, [r4, 0x1D] - orrs r0, r1 - strb r0, [r4, 0x1D] -_081DECAA: - adds r0, r4, 0 - bl CgbModVol - movs r0, 0x3 - ldrb r2, [r4] - ands r0, r2 - cmp r0, 0 - bne _081DECFE - ldrb r0, [r4, 0x9] - subs r0, 0x1 - strb r0, [r4, 0x9] - movs r1, 0xFF - ands r0, r1 - lsls r0, 24 - cmp r0, 0 - bgt _081DECFA -_081DECCA: - ldrb r2, [r4, 0xC] - ldrb r1, [r4, 0xA] - adds r0, r2, 0 - muls r0, r1 - adds r0, 0xFF - asrs r0, 8 - movs r1, 0 - strb r0, [r4, 0x9] - lsls r0, 24 - cmp r0, 0 - beq _081DEC4A - movs r0, 0x4 - ldrb r2, [r4] - orrs r0, r2 - strb r0, [r4] - movs r0, 0x1 - ldrb r1, [r4, 0x1D] - orrs r0, r1 - strb r0, [r4, 0x1D] - cmp r6, 0x3 - beq _081DED9E - movs r2, 0x8 - mov r8, r2 - b _081DED9E -_081DECFA: - ldrb r0, [r4, 0x7] - b _081DED8A -_081DECFE: - cmp r0, 0x1 - bne _081DED0A -_081DED02: - ldrb r0, [r4, 0x19] - strb r0, [r4, 0x9] - movs r0, 0x7 - b _081DED8A -_081DED0A: - cmp r0, 0x2 - bne _081DED4E - ldrb r0, [r4, 0x9] - subs r0, 0x1 - strb r0, [r4, 0x9] - movs r1, 0xFF - ands r0, r1 - lsls r0, 24 - ldrb r2, [r4, 0x19] - lsls r1, r2, 24 - cmp r0, r1 - bgt _081DED4A -_081DED22: - ldrb r0, [r4, 0x6] - cmp r0, 0 - bne _081DED32 - movs r0, 0xFC - ldrb r1, [r4] - ands r0, r1 - strb r0, [r4] - b _081DECCA -_081DED32: - ldrb r0, [r4] - subs r0, 0x1 - strb r0, [r4] - movs r0, 0x1 - ldrb r2, [r4, 0x1D] - orrs r0, r2 - strb r0, [r4, 0x1D] - cmp r6, 0x3 - beq _081DED02 - movs r0, 0x8 - mov r8, r0 - b _081DED02 -_081DED4A: - ldrb r0, [r4, 0x5] - b _081DED8A -_081DED4E: - ldrb r0, [r4, 0x9] - adds r0, 0x1 - strb r0, [r4, 0x9] - movs r1, 0xFF - ands r0, r1 - ldrb r2, [r4, 0xA] - cmp r0, r2 - bcc _081DED88 -_081DED5E: - ldrb r0, [r4] - subs r0, 0x1 - movs r2, 0 - strb r0, [r4] - ldrb r1, [r4, 0x5] - strb r1, [r4, 0xB] - movs r0, 0xFF - ands r0, r1 - cmp r0, 0 - beq _081DED22 - movs r0, 0x1 - ldrb r1, [r4, 0x1D] - orrs r0, r1 - strb r0, [r4, 0x1D] - ldrb r0, [r4, 0xA] - strb r0, [r4, 0x9] - cmp r6, 0x3 - beq _081DED8C - ldrb r2, [r4, 0x5] - mov r8, r2 - b _081DED8C -_081DED88: - ldrb r0, [r4, 0x4] -_081DED8A: - strb r0, [r4, 0xB] -_081DED8C: - ldrb r0, [r4, 0xB] - subs r0, 0x1 - strb r0, [r4, 0xB] - ldr r0, [sp] - cmp r0, 0 - bne _081DED9E - subs r0, 0x1 - str r0, [sp] - b _081DEC98 -_081DED9E: - movs r0, 0x2 - ldrb r1, [r4, 0x1D] - ands r0, r1 - cmp r0, 0 - beq _081DEE16 - cmp r6, 0x3 - bgt _081DEDDE - movs r0, 0x8 - ldrb r2, [r4, 0x1] - ands r0, r2 - cmp r0, 0 - beq _081DEDDE - ldr r0, _081DEDC8 - ldrb r0, [r0] - cmp r0, 0x3F - bgt _081DEDD0 - ldr r0, [r4, 0x20] - adds r0, 0x2 - ldr r1, _081DEDCC - b _081DEDDA - .align 2, 0 -_081DEDC8: .4byte 0x04000089 -_081DEDCC: .4byte 0x000007fc -_081DEDD0: - cmp r0, 0x7F - bgt _081DEDDE - ldr r0, [r4, 0x20] - adds r0, 0x1 - ldr r1, _081DEDEC -_081DEDDA: - ands r0, r1 - str r0, [r4, 0x20] -_081DEDDE: - cmp r6, 0x4 - beq _081DEDF0 - ldr r0, [r4, 0x20] - ldr r1, [sp, 0x10] - strb r0, [r1] - b _081DEDFE - .align 2, 0 -_081DEDEC: .4byte 0x000007fe -_081DEDF0: - ldr r2, [sp, 0x10] - ldrb r0, [r2] - movs r1, 0x8 - ands r1, r0 - ldr r0, [r4, 0x20] - orrs r0, r1 - strb r0, [r2] -_081DEDFE: - movs r0, 0xC0 - ldrb r1, [r4, 0x1A] - ands r0, r1 - adds r1, r4, 0 - adds r1, 0x21 - ldrb r1, [r1] - adds r0, r1, r0 - strb r0, [r4, 0x1A] - movs r2, 0xFF - ands r0, r2 - ldr r1, [sp, 0x14] - strb r0, [r1] -_081DEE16: - movs r0, 0x1 - ldrb r2, [r4, 0x1D] - ands r0, r2 - cmp r0, 0 - beq _081DEE9C - ldr r1, _081DEE60 - ldrb r0, [r1] - ldrb r2, [r4, 0x1C] - bics r0, r2 - ldrb r2, [r4, 0x1B] - orrs r0, r2 - strb r0, [r1] - cmp r6, 0x3 - bne _081DEE68 - ldr r0, _081DEE64 - ldrb r1, [r4, 0x9] - adds r0, r1, r0 - ldrb r0, [r0] - ldr r2, [sp, 0xC] - strb r0, [r2] - movs r1, 0x80 - adds r0, r1, 0 - ldrb r2, [r4, 0x1A] - ands r0, r2 - cmp r0, 0 - beq _081DEE9C - ldr r0, [sp, 0x8] - strb r1, [r0] - ldrb r0, [r4, 0x1A] - ldr r1, [sp, 0x14] - strb r0, [r1] - movs r0, 0x7F - ldrb r2, [r4, 0x1A] - ands r0, r2 - strb r0, [r4, 0x1A] - b _081DEE9C - .align 2, 0 -_081DEE60: .4byte 0x04000081 -_081DEE64: .4byte gUnknown_0842FBD8 -_081DEE68: - movs r0, 0xF - mov r1, r8 - ands r1, r0 - mov r8, r1 - ldrb r2, [r4, 0x9] - lsls r0, r2, 4 - add r0, r8 - ldr r1, [sp, 0xC] - strb r0, [r1] - movs r2, 0x80 - ldrb r0, [r4, 0x1A] - orrs r0, r2 - ldr r1, [sp, 0x14] - strb r0, [r1] - cmp r6, 0x1 - bne _081DEE9C - ldr r0, [sp, 0x8] - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - bne _081DEE9C - ldrb r0, [r4, 0x1A] - orrs r0, r2 - ldr r1, [sp, 0x14] - strb r0, [r1] -_081DEE9C: - movs r0, 0 - strb r0, [r4, 0x1D] -_081DEEA0: - mov r6, r10 - mov r4, r9 - cmp r6, 0x4 - bgt _081DEEAA - b _081DEAA0 -_081DEEAA: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end CgbSound - - thumb_func_start MPlayTempoControl -MPlayTempoControl: @ 81DEEBC - push {r4,lr} - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - ldr r3, [r2, 0x34] - ldr r0, _081DEEE0 - cmp r3, r0 - bne _081DEED8 - strh r1, [r2, 0x1E] - ldrh r4, [r2, 0x1C] - adds r0, r1, 0 - muls r0, r4 - asrs r0, 8 - strh r0, [r2, 0x20] -_081DEED8: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DEEE0: .4byte 0x68736d53 - thumb_func_end MPlayTempoControl - - thumb_func_start MPlayVolumeControl -MPlayVolumeControl: @ 81DEEE4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r4, r0, 0 - lsls r1, 16 - lsrs r7, r1, 16 - lsls r6, r2, 16 - ldr r3, [r4, 0x34] - ldr r0, _081DEF48 - cmp r3, r0 - bne _081DEF3C - adds r0, r3, 0x1 - str r0, [r4, 0x34] - ldrb r2, [r4, 0x8] - ldr r1, [r4, 0x2C] - movs r5, 0x1 - cmp r2, 0 - ble _081DEF38 - movs r0, 0x80 - mov r8, r0 - lsrs r6, 18 - movs r0, 0x3 - mov r12, r0 -_081DEF14: - adds r0, r7, 0 - ands r0, r5 - cmp r0, 0 - beq _081DEF2E - ldrb r3, [r1] - mov r0, r8 - ands r0, r3 - cmp r0, 0 - beq _081DEF2E - strb r6, [r1, 0x13] - mov r0, r12 - orrs r0, r3 - strb r0, [r1] -_081DEF2E: - subs r2, 0x1 - adds r1, 0x50 - lsls r5, 1 - cmp r2, 0 - bgt _081DEF14 -_081DEF38: - ldr r0, _081DEF48 - str r0, [r4, 0x34] -_081DEF3C: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DEF48: .4byte 0x68736d53 - thumb_func_end MPlayVolumeControl - - thumb_func_start MPlayPitchControl -MPlayPitchControl: @ 81DEF4C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r4, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r12, r1 - lsls r2, 16 - lsrs r6, r2, 16 - ldr r3, [r4, 0x34] - ldr r0, _081DEFBC - cmp r3, r0 - bne _081DEFAE - adds r0, r3, 0x1 - str r0, [r4, 0x34] - ldrb r2, [r4, 0x8] - ldr r3, [r4, 0x2C] - movs r5, 0x1 - cmp r2, 0 - ble _081DEFAA - movs r0, 0x80 - mov r9, r0 - lsls r0, r6, 16 - asrs r7, r0, 24 - movs r0, 0xC - mov r8, r0 -_081DEF84: - mov r0, r12 - ands r0, r5 - cmp r0, 0 - beq _081DEFA0 - ldrb r1, [r3] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _081DEFA0 - strb r7, [r3, 0xB] - strb r6, [r3, 0xD] - mov r0, r8 - orrs r0, r1 - strb r0, [r3] -_081DEFA0: - subs r2, 0x1 - adds r3, 0x50 - lsls r5, 1 - cmp r2, 0 - bgt _081DEF84 -_081DEFAA: - ldr r0, _081DEFBC - str r0, [r4, 0x34] -_081DEFAE: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DEFBC: .4byte 0x68736d53 - thumb_func_end MPlayPitchControl - - thumb_func_start MPlayPanpotControl -MPlayPanpotControl: @ 81DEFC0 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r4, r0, 0 - lsls r1, 16 - lsrs r7, r1, 16 - lsls r2, 24 - lsrs r6, r2, 24 - ldr r3, [r4, 0x34] - ldr r0, _081DF024 - cmp r3, r0 - bne _081DF018 - adds r0, r3, 0x1 - str r0, [r4, 0x34] - ldrb r2, [r4, 0x8] - ldr r1, [r4, 0x2C] - movs r5, 0x1 - cmp r2, 0 - ble _081DF014 - movs r0, 0x80 - mov r8, r0 - movs r0, 0x3 - mov r12, r0 -_081DEFF0: - adds r0, r7, 0 - ands r0, r5 - cmp r0, 0 - beq _081DF00A - ldrb r3, [r1] - mov r0, r8 - ands r0, r3 - cmp r0, 0 - beq _081DF00A - strb r6, [r1, 0x15] - mov r0, r12 - orrs r0, r3 - strb r0, [r1] -_081DF00A: - subs r2, 0x1 - adds r1, 0x50 - lsls r5, 1 - cmp r2, 0 - bgt _081DEFF0 -_081DF014: - ldr r0, _081DF024 - str r0, [r4, 0x34] -_081DF018: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DF024: .4byte 0x68736d53 - thumb_func_end MPlayPanpotControl - - thumb_func_start MP_clear_modM -MP_clear_modM: @ 81DF028 - adds r1, r0, 0 - movs r2, 0 - movs r0, 0 - strb r0, [r1, 0x1A] - strb r0, [r1, 0x16] - ldrb r0, [r1, 0x18] - cmp r0, 0 - bne _081DF03C - movs r0, 0xC - b _081DF03E -_081DF03C: - movs r0, 0x3 -_081DF03E: - ldrb r2, [r1] - orrs r0, r2 - strb r0, [r1] - bx lr - thumb_func_end MP_clear_modM - - thumb_func_start MPlayModDepthSet -MPlayModDepthSet: @ 81DF048 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - ldr r1, [r6, 0x34] - ldr r0, _081DF0B8 - cmp r1, r0 - bne _081DF0A8 - adds r0, r1, 0x1 - str r0, [r6, 0x34] - ldrb r5, [r6, 0x8] - ldr r4, [r6, 0x2C] - movs r7, 0x1 - cmp r5, 0 - ble _081DF0A4 - mov r9, r8 -_081DF078: - mov r0, r10 - ands r0, r7 - cmp r0, 0 - beq _081DF09A - movs r0, 0x80 - ldrb r1, [r4] - ands r0, r1 - cmp r0, 0 - beq _081DF09A - mov r0, r8 - strb r0, [r4, 0x17] - mov r1, r9 - cmp r1, 0 - bne _081DF09A - adds r0, r4, 0 - bl MP_clear_modM -_081DF09A: - subs r5, 0x1 - adds r4, 0x50 - lsls r7, 1 - cmp r5, 0 - bgt _081DF078 -_081DF0A4: - ldr r0, _081DF0B8 - str r0, [r6, 0x34] -_081DF0A8: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DF0B8: .4byte 0x68736d53 - thumb_func_end MPlayModDepthSet - - thumb_func_start MPlayLFOSpeedSet -MPlayLFOSpeedSet: @ 81DF0BC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - ldr r1, [r6, 0x34] - ldr r0, _081DF12C - cmp r1, r0 - bne _081DF11C - adds r0, r1, 0x1 - str r0, [r6, 0x34] - ldrb r5, [r6, 0x8] - ldr r4, [r6, 0x2C] - movs r7, 0x1 - cmp r5, 0 - ble _081DF118 - mov r9, r8 -_081DF0EC: - mov r0, r10 - ands r0, r7 - cmp r0, 0 - beq _081DF10E - movs r0, 0x80 - ldrb r1, [r4] - ands r0, r1 - cmp r0, 0 - beq _081DF10E - mov r0, r8 - strb r0, [r4, 0x19] - mov r1, r9 - cmp r1, 0 - bne _081DF10E - adds r0, r4, 0 - bl MP_clear_modM -_081DF10E: - subs r5, 0x1 - adds r4, 0x50 - lsls r7, 1 - cmp r5, 0 - bgt _081DF0EC -_081DF118: - ldr r0, _081DF12C - str r0, [r6, 0x34] -_081DF11C: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DF12C: .4byte 0x68736d53 - thumb_func_end MPlayLFOSpeedSet - - thumb_func_start ply_memacc -ply_memacc: @ 81DF130 - push {r4-r6,lr} - adds r4, r0, 0 - adds r6, r1, 0 - ldr r1, [r6, 0x40] - ldrb r5, [r1] - adds r2, r1, 0x1 - str r2, [r6, 0x40] - ldr r0, [r4, 0x18] - ldrb r1, [r1, 0x1] - adds r3, r1, r0 - adds r0, r2, 0x1 - str r0, [r6, 0x40] - ldrb r2, [r2, 0x1] - adds r0, 0x1 - str r0, [r6, 0x40] - cmp r5, 0x11 - bls _081DF154 - b _081DF282 -_081DF154: - lsls r0, r5, 2 - ldr r1, _081DF160 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_081DF160: .4byte _081DF164 - .align 2, 0 -_081DF164: - .4byte _081DF1AC - .4byte _081DF1B0 - .4byte _081DF1B8 - .4byte _081DF1C0 - .4byte _081DF1CA - .4byte _081DF1D8 - .4byte _081DF1E6 - .4byte _081DF1EE - .4byte _081DF1F6 - .4byte _081DF1FE - .4byte _081DF206 - .4byte _081DF20E - .4byte _081DF216 - .4byte _081DF224 - .4byte _081DF232 - .4byte _081DF240 - .4byte _081DF24E - .4byte _081DF25C -_081DF1AC: - strb r2, [r3] - b _081DF282 -_081DF1B0: - ldrb r1, [r3] - adds r0, r1, r2 - strb r0, [r3] - b _081DF282 -_081DF1B8: - ldrb r1, [r3] - subs r0, r1, r2 - strb r0, [r3] - b _081DF282 -_081DF1C0: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r0, [r0] - strb r0, [r3] - b _081DF282 -_081DF1CA: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r1, [r3] - ldrb r0, [r0] - adds r0, r1, r0 - strb r0, [r3] - b _081DF282 -_081DF1D8: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r1, [r3] - ldrb r0, [r0] - subs r0, r1, r0 - strb r0, [r3] - b _081DF282 -_081DF1E6: - ldrb r3, [r3] - cmp r3, r2 - beq _081DF268 - b _081DF27C -_081DF1EE: - ldrb r3, [r3] - cmp r3, r2 - bne _081DF268 - b _081DF27C -_081DF1F6: - ldrb r3, [r3] - cmp r3, r2 - bhi _081DF268 - b _081DF27C -_081DF1FE: - ldrb r3, [r3] - cmp r3, r2 - bcs _081DF268 - b _081DF27C -_081DF206: - ldrb r3, [r3] - cmp r3, r2 - bls _081DF268 - b _081DF27C -_081DF20E: - ldrb r3, [r3] - cmp r3, r2 - bcc _081DF268 - b _081DF27C -_081DF216: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - beq _081DF268 - b _081DF27C -_081DF224: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - bne _081DF268 - b _081DF27C -_081DF232: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - bhi _081DF268 - b _081DF27C -_081DF240: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - bcs _081DF268 - b _081DF27C -_081DF24E: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - bls _081DF268 - b _081DF27C -_081DF25C: - ldr r0, [r4, 0x18] - adds r0, r2 - ldrb r3, [r3] - ldrb r0, [r0] - cmp r3, r0 - bcs _081DF27C -_081DF268: - ldr r0, _081DF278 - ldr r2, [r0] - adds r0, r4, 0 - adds r1, r6, 0 - bl _call_via_r2 - b _081DF282 - .align 2, 0 -_081DF278: .4byte 0x03007074 -_081DF27C: - ldr r0, [r6, 0x40] - adds r0, 0x4 - str r0, [r6, 0x40] -_081DF282: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end ply_memacc - - thumb_func_start ply_xcmd -ply_xcmd: @ 81DF288 - push {lr} - ldr r2, [r1, 0x40] - ldrb r3, [r2] - adds r2, 0x1 - str r2, [r1, 0x40] - ldr r2, _081DF2A4 - lsls r3, 2 - adds r3, r2 - ldr r2, [r3] - bl _call_via_r2 - pop {r0} - bx r0 - .align 2, 0 -_081DF2A4: .4byte gUnknown_0842FC50 - thumb_func_end ply_xcmd - - thumb_func_start ply_xxx -ply_xxx: @ 81DF2A8 - push {lr} - ldr r2, _081DF2B8 - ldr r2, [r2] - bl _call_via_r2 - pop {r0} - bx r0 - .align 2, 0 -_081DF2B8: .4byte 0x03007070 - thumb_func_end ply_xxx - - thumb_func_start ply_xwave -ply_xwave: @ 81DF2BC - push {r4,lr} - ldr r2, [r1, 0x40] - ldr r0, _081DF2F4 - ands r4, r0 - ldrb r0, [r2] - orrs r4, r0 - ldrb r0, [r2, 0x1] - lsls r3, r0, 8 - ldr r0, _081DF2F8 - ands r4, r0 - orrs r4, r3 - ldrb r0, [r2, 0x2] - lsls r3, r0, 16 - ldr r0, _081DF2FC - ands r4, r0 - orrs r4, r3 - ldrb r0, [r2, 0x3] - lsls r3, r0, 24 - ldr r0, _081DF300 - ands r4, r0 - orrs r4, r3 - str r4, [r1, 0x28] - adds r2, 0x4 - str r2, [r1, 0x40] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF2F4: .4byte 0xffffff00 -_081DF2F8: .4byte 0xffff00ff -_081DF2FC: .4byte 0xff00ffff -_081DF300: .4byte 0x00ffffff - thumb_func_end ply_xwave - - thumb_func_start ply_xtype -ply_xtype: @ 81DF304 - ldr r0, [r1, 0x40] - ldrb r2, [r0] - adds r0, r1, 0 - adds r0, 0x24 - strb r2, [r0] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xtype - - thumb_func_start ply_xatta -ply_xatta: @ 81DF318 - ldr r0, [r1, 0x40] - ldrb r2, [r0] - adds r0, r1, 0 - adds r0, 0x2C - strb r2, [r0] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xatta - - thumb_func_start ply_xdeca -ply_xdeca: @ 81DF32C - ldr r0, [r1, 0x40] - ldrb r0, [r0] - adds r2, r1, 0 - adds r2, 0x2D - strb r0, [r2] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xdeca - - thumb_func_start ply_xsust -ply_xsust: @ 81DF340 - ldr r0, [r1, 0x40] - ldrb r0, [r0] - adds r2, r1, 0 - adds r2, 0x2E - strb r0, [r2] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xsust - - thumb_func_start ply_xrele -ply_xrele: @ 81DF354 - ldr r0, [r1, 0x40] - ldrb r0, [r0] - adds r2, r1, 0 - adds r2, 0x2F - strb r0, [r2] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xrele - - thumb_func_start ply_xiecv -ply_xiecv: @ 81DF368 - ldr r0, [r1, 0x40] - ldrb r2, [r0] - strb r2, [r1, 0x1E] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xiecv - - thumb_func_start ply_xiecl -ply_xiecl: @ 81DF374 - ldr r0, [r1, 0x40] - ldrb r2, [r0] - strb r2, [r1, 0x1F] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xiecl - - thumb_func_start ply_xleng -ply_xleng: @ 81DF380 - ldr r0, [r1, 0x40] - ldrb r0, [r0] - adds r2, r1, 0 - adds r2, 0x26 - strb r0, [r2] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xleng - - thumb_func_start ply_xswee -ply_xswee: @ 81DF394 - ldr r0, [r1, 0x40] - ldrb r0, [r0] - adds r2, r1, 0 - adds r2, 0x27 - strb r0, [r2] - ldr r0, [r1, 0x40] - adds r0, 0x1 - str r0, [r1, 0x40] - bx lr - thumb_func_end ply_xswee - - thumb_func_start ply_xcmd0C -ply_xcmd0C: @ 81DF3A8 - push {r4,lr} - adds r3, r1, 0 - ldr r4, [r3, 0x40] - ldr r0, _081DF3D8 - ands r2, r0 - ldrb r0, [r4] - orrs r2, r0 - ldrb r0, [r4, 0x1] - lsls r1, r0, 8 - ldr r0, _081DF3DC - ands r2, r0 - orrs r2, r1 - ldrh r1, [r3, 0x3A] - lsls r0, r2, 16 - lsrs r0, 16 - cmp r1, r0 - bcs _081DF3E0 - adds r0, r1, 0x1 - strh r0, [r3, 0x3A] - subs r0, r4, 0x2 - str r0, [r3, 0x40] - movs r0, 0x1 - strb r0, [r3, 0x1] - b _081DF3E8 - .align 2, 0 -_081DF3D8: .4byte 0xffffff00 -_081DF3DC: .4byte 0xffff00ff -_081DF3E0: - movs r0, 0 - strh r0, [r3, 0x3A] - adds r0, r4, 0x2 - str r0, [r3, 0x40] -_081DF3E8: - pop {r4} - pop {r0} - bx r0 - thumb_func_end ply_xcmd0C - - thumb_func_start ply_xcmd0D -ply_xcmd0D: @ 81DF3F0 - push {r4,lr} - ldr r2, [r1, 0x40] - ldr r0, _081DF428 - ands r4, r0 - ldrb r0, [r2] - orrs r4, r0 - ldrb r0, [r2, 0x1] - lsls r3, r0, 8 - ldr r0, _081DF42C - ands r4, r0 - orrs r4, r3 - ldrb r0, [r2, 0x2] - lsls r3, r0, 16 - ldr r0, _081DF430 - ands r4, r0 - orrs r4, r3 - ldrb r0, [r2, 0x3] - lsls r3, r0, 24 - ldr r0, _081DF434 - ands r4, r0 - orrs r4, r3 - str r4, [r1, 0x3C] - adds r2, 0x4 - str r2, [r1, 0x40] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF428: .4byte 0xffffff00 -_081DF42C: .4byte 0xffff00ff -_081DF430: .4byte 0xff00ffff -_081DF434: .4byte 0x00ffffff - thumb_func_end ply_xcmd0D - - thumb_func_start DummyFunc_rev -DummyFunc_rev: @ 81DF438 - bx lr - thumb_func_end DummyFunc_rev - - thumb_func_start sub_81DF43C -sub_81DF43C: @ 81DF43C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r9, r0 - movs r6, 0 - movs r1, 0 - movs r4, 0 - ldr r0, _081DF4F8 - mov r8, r0 - ldr r7, _081DF4FC - ldr r0, _081DF500 - mov r10, r0 - mov r5, r8 - adds r5, 0xC - movs r3, 0 - ldr r0, _081DF504 - mov r12, r0 -_081DF462: - mov r0, r12 - adds r2, r3, r0 - ldrb r0, [r2] - cmp r0, 0 - bne _081DF478 - ldr r0, [r2, 0x20] - cmp r0, 0 - beq _081DF48E - ldr r0, [r0, 0x2C] - cmp r0, r2 - bne _081DF48E -_081DF478: - ldr r0, [r5] - cmp r6, r0 - bcs _081DF482 - adds r6, r0, 0 - adds r1, r4, 0 -_081DF482: - adds r5, 0x40 - adds r3, 0xA0 - adds r4, 0x1 - cmp r4, 0x1 - ble _081DF462 - adds r4, r1, 0 -_081DF48E: - lsls r5, r4, 6 - add r5, r8 - ldr r0, [r5, 0x34] - adds r0, 0x1 - str r0, [r5, 0x34] - movs r0, 0x34 - muls r4, r0 - adds r6, r4, r7 - adds r0, r6, 0 - mov r1, r10 - movs r2, 0x34 - bl memcpy - adds r0, r7, 0x4 - adds r0, r4, r0 - mov r1, r9 - str r1, [r0] - adds r1, r7, 0 - adds r1, 0x8 - adds r1, r4, r1 - adds r0, r7, 0 - adds r0, 0x11 - adds r0, r4, r0 - str r0, [r1] - adds r1, r7, 0 - adds r1, 0xC - adds r1, r4, r1 - adds r0, r7, 0 - adds r0, 0x18 - adds r0, r4, r0 - str r0, [r1] - adds r0, r7, 0 - adds r0, 0x14 - adds r0, r4, r0 - adds r1, r7, 0 - adds r1, 0x1A - adds r4, r1 - str r4, [r0] - ldr r0, _081DF508 - str r0, [r5, 0x34] - adds r0, r5, 0 - adds r1, r6, 0 - bl MPlayStart_rev01 - adds r0, r5, 0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081DF4F8: .4byte 0x03006ff0 -_081DF4FC: .4byte 0x03006f80 -_081DF500: .4byte 0x03007340 -_081DF504: .4byte 0x03007200 -_081DF508: .4byte 0x68736d53 - thumb_func_end sub_81DF43C - - thumb_func_start sub_81DF50C -sub_81DF50C: @ 81DF50C - lsls r0, 24 - lsrs r0, 24 - ldr r2, _081DF51C - movs r1, 0x7F - ands r0, r1 - strb r0, [r2, 0x1D] - bx lr - .align 2, 0 -_081DF51C: .4byte 0x03007340 - thumb_func_end sub_81DF50C - - thumb_func_start sub_81DF520 -sub_81DF520: @ 81DF520 - ldr r2, _081DF534 - lsls r0, 24 - asrs r0, 24 - adds r0, 0x40 - movs r1, 0x7F - ands r0, r1 - adds r2, 0x28 - strb r0, [r2] - bx lr - .align 2, 0 -_081DF534: .4byte 0x03007340 - thumb_func_end sub_81DF520 - - thumb_func_start sub_81DF538 -sub_81DF538: @ 81DF538 - push {r4-r6,lr} - lsls r0, 16 - ldr r3, _081DF56C - ldrb r2, [r3, 0x19] - ldrb r4, [r3, 0x12] - subs r1, r2, r4 - lsls r1, 24 - lsrs r1, 24 - movs r6, 0x80 - lsls r6, 16 - adds r0, r6 - asrs r2, r0, 24 - movs r5, 0x7F - movs r4, 0x7F - ands r2, r4 - movs r6, 0x2A - strb r2, [r6, r3] - asrs r0, 17 - ands r0, r4 - strb r0, [r3, 0x12] - adds r1, r0 - ands r1, r5 - strb r1, [r3, 0x19] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF56C: .4byte 0x03007340 - thumb_func_end sub_81DF538 - - thumb_func_start sub_81DF570 -sub_81DF570: @ 81DF570 - ldr r1, _081DF578 - strh r0, [r1, 0x2E] - bx lr - .align 2, 0 -_081DF578: .4byte 0x03007340 - thumb_func_end sub_81DF570 - - thumb_func_start sub_81DF57C -sub_81DF57C: @ 81DF57C - ldr r1, _081DF584 - adds r1, 0x26 - strb r0, [r1] - bx lr - .align 2, 0 -_081DF584: .4byte 0x03007340 - thumb_func_end sub_81DF57C - - thumb_func_start sub_81DF588 -sub_81DF588: @ 81DF588 - ldr r1, _081DF590 - str r0, [r1, 0x20] - bx lr - .align 2, 0 -_081DF590: .4byte 0x03007340 - thumb_func_end sub_81DF588 - - thumb_func_start sub_81DF594 -sub_81DF594: @ 81DF594 - ldr r1, [r0, 0x2C] - ldr r0, [r1, 0x20] - cmp r0, 0 - beq _081DF5A6 - ldr r0, [r0, 0x2C] - cmp r0, r1 - bne _081DF5A6 - movs r0, 0x1 - b _081DF5A8 -_081DF5A6: - movs r0, 0 -_081DF5A8: - bx lr - thumb_func_end sub_81DF594 - - thumb_func_start sub_81DF5AC -sub_81DF5AC: @ 81DF5AC - lsls r0, 24 - lsrs r1, r0, 24 - cmp r0, 0 - beq _081DF5CC - ldr r2, _081DF5C8 - movs r0, 0x2 - strb r0, [r2] - ldrb r3, [r2, 0x12] - adds r0, r3, r1 - movs r1, 0x7F - ands r0, r1 - strb r0, [r2, 0x19] - b _081DF5D2 - .align 2, 0 -_081DF5C8: .4byte 0x03007340 -_081DF5CC: - ldr r1, _081DF5D4 - movs r0, 0x1 - strb r0, [r1] -_081DF5D2: - bx lr - .align 2, 0 -_081DF5D4: .4byte 0x03007340 - thumb_func_end sub_81DF5AC - - thumb_func_start sub_81DF5D8 -sub_81DF5D8: @ 81DF5D8 - ldr r1, _081DF5F0 - ldr r2, [r1] - cmp r0, 0 - beq _081DF5FC - ldr r1, _081DF5F4 - ldr r3, _081DF5F8 - adds r0, r3, 0 - strh r0, [r1] - movs r0, 0xFE - ldrb r1, [r2, 0x9] - ands r0, r1 - b _081DF60A - .align 2, 0 -_081DF5F0: .4byte 0x03007ff0 -_081DF5F4: .4byte 0x04000082 -_081DF5F8: .4byte 0x0000210e -_081DF5FC: - ldr r1, _081DF610 - ldr r3, _081DF614 - adds r0, r3, 0 - strh r0, [r1] - movs r0, 0x1 - ldrb r1, [r2, 0x9] - orrs r0, r1 -_081DF60A: - strb r0, [r2, 0x9] - bx lr - .align 2, 0 -_081DF610: .4byte 0x04000082 -_081DF614: .4byte 0x00003302 - thumb_func_end sub_81DF5D8 - - thumb_func_start sub_81DF618 -sub_81DF618: @ 81DF618 - ldr r1, _081DF620 - strb r0, [r1, 0x2] - bx lr - .align 2, 0 -_081DF620: .4byte 0x03007340 - thumb_func_end sub_81DF618 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/m4a_1.s b/asm/m4a_1.s new file mode 100644 index 000000000..3f079d0ec --- /dev/null +++ b/asm/m4a_1.s @@ -0,0 +1,1908 @@ + .include "asm/macros.s" + .include "constants/gba_constants.s" + .include "constants/m4a_constants.s" + + .syntax unified + + .text + + thumb_func_start umul3232H32 +umul3232H32: + adr r2, __umul3232H32 + bx r2 + .arm +__umul3232H32: + umull r2, r3, r0, r1 + add r0, r3, 0 + bx lr + thumb_func_end umul3232H32 + + thumb_func_start SoundMain +SoundMain: + ldr r0, lt_SOUND_INFO_PTR + ldr r0, [r0] + ldr r2, lt_ID_NUMBER + ldr r3, [r0, o_SoundInfo_ident] + cmp r2, r3 + beq SoundMain_1 + bx lr @ Exit the function if ident doesn't match ID_NUMBER. +SoundMain_1: + adds r3, 1 + str r3, [r0, o_SoundInfo_ident] + push {r4-r7,lr} + mov r1, r8 + mov r2, r9 + mov r3, r10 + mov r4, r11 + push {r0-r4} + sub sp, 0x18 + ldrb r1, [r0, o_SoundInfo_maxLines] + cmp r1, 0 @ if maxLines is 0, there is no maximum + beq SoundMain_3 + ldr r2, lt_REG_VCOUNT + ldrb r2, [r2] + cmp r2, VCOUNT_VBLANK + bhs SoundMain_2 + adds r2, TOTAL_SCANLINES +SoundMain_2: + adds r1, r2 +SoundMain_3: + str r1, [sp, 0x14] + ldr r3, [r0, o_SoundInfo_func] + cmp r3, 0 + beq SoundMain_4 + ldr r0, [r0, o_SoundInfo_intp] + bl _081DD25E + ldr r0, [sp, 0x18] +SoundMain_4: + ldr r3, [r0, o_SoundInfo_CgbSound] + bl _081DD25E + ldr r0, [sp, 0x18] + ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] + mov r8, r3 + ldr r5, lt_o_SoundInfo_pcmBuffer + adds r5, r0 + ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] + subs r7, r4, 1 + bls SoundMain_5 + ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] + subs r1, r7 + mov r2, r8 + muls r2, r1 + adds r5, r2 +SoundMain_5: + str r5, [sp, 0x8] + ldr r6, lt_PCM_DMA_BUF_SIZE + ldr r3, lt_SoundMainRAM_Buffer + bx r3 + + .align 2, 0 +lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR +lt_ID_NUMBER: .word ID_NUMBER +lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 +lt_REG_VCOUNT: .word REG_VCOUNT +lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer +lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE + thumb_func_end SoundMain + + thumb_func_start SoundMainRAM +SoundMainRAM: + ldrb r3, [r0, o_SoundInfo_reverb] + cmp r3, 0 + beq SoundMainRAM_NoReverb + adr r1, SoundMainRAM_Reverb + bx r1 + .arm +SoundMainRAM_Reverb: + cmp r4, 0x2 + addeq r7, r0, o_SoundInfo_pcmBuffer + addne r7, r5, r8 + mov r4, r8 +_081DCEC4: + ldrsb r0, [r5, r6] + ldrsb r1, [r5] + add r0, r0, r1 + ldrsb r1, [r7, r6] + add r0, r0, r1 + ldrsb r1, [r7], 0x1 + add r0, r0, r1 + mul r1, r0, r3 + mov r0, r1, asr 9 + tst r0, 0x80 + addne r0, r0, 0x1 + strb r0, [r5, r6] + strb r0, [r5], 0x1 + subs r4, r4, 0x1 + bgt _081DCEC4 + adr r0, _081DCF36 + 1 @ plus 1 because THUMB + bx r0 + .thumb +SoundMainRAM_NoReverb: + movs r0, 0 + mov r1, r8 + adds r6, r5 + lsrs r1, 3 + bcc SoundMainRAM_NoReverb_Ok + stm r5!, {r0} + stm r6!, {r0} +SoundMainRAM_NoReverb_Ok: + lsrs r1, 1 + bcc SoundMainRAM_NoReverb_Loop + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} +SoundMainRAM_NoReverb_Loop: + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + subs r1, 1 + bgt SoundMainRAM_NoReverb_Loop +_081DCF36: + ldr r4, [sp, 0x18] + ldr r0, [r4, o_SoundInfo_divFreq] + mov r12, r0 + ldrb r0, [r4, o_SoundInfo_maxChans] + adds r4, o_SoundInfo_chans + +SoundMainRAM_ChanLoop: + str r0, [sp, 0x4] + ldr r3, [r4, o_SoundChannel_wav] + ldr r0, [sp, 0x14] + cmp r0, 0 + beq _081DCF60 + ldr r1, =REG_VCOUNT + ldrb r1, [r1] + cmp r1, VCOUNT_VBLANK + bhs _081DCF54 + adds r1, TOTAL_SCANLINES +_081DCF54: + cmp r1, r0 + blo _081DCF60 + b _081DD24A + + .pool + +_081DCF60: + ldrb r6, [r4, o_SoundChannel_status] + movs r0, 0xC7 + tst r0, r6 + bne _081DCF6A + b _081DD240 +_081DCF6A: + movs r0, 0x80 + tst r0, r6 + beq _081DCFA0 + movs r0, 0x40 + tst r0, r6 + bne _081DCFB0 + movs r6, 0x3 + strb r6, [r4, o_SoundChannel_status] + adds r0, r3, 0 + adds r0, 0x10 + ldr r1, [r4, o_SoundChannel_ct] + adds r0, r1 + str r0, [r4, o_SoundChannel_cp] + ldr r0, [r3, 0xC] + subs r0, r1 + str r0, [r4, o_SoundChannel_ct] + movs r5, 0 + strb r5, [r4, o_SoundChannel_ev] + str r5, [r4, o_SoundChannel_fw] + ldrb r2, [r3, 0x3] + movs r0, 0xC0 + tst r0, r2 + beq _081DCFF8 + movs r0, 0x10 + orrs r6, r0 + strb r6, [r4, o_SoundChannel_status] + b _081DCFF8 +_081DCFA0: + ldrb r5, [r4, o_SoundChannel_ev] + movs r0, 0x4 + tst r0, r6 + beq _081DCFB6 + ldrb r0, [r4, o_SoundChannel_iel] + subs r0, 1 + strb r0, [r4, o_SoundChannel_iel] + bhi _081DD006 +_081DCFB0: + movs r0, 0 + strb r0, [r4, o_SoundChannel_status] + b _081DD240 +_081DCFB6: + movs r0, 0x40 + tst r0, r6 + beq _081DCFD6 + ldrb r0, [r4, o_SoundChannel_release] + muls r5, r0 + lsrs r5, 8 + ldrb r0, [r4, o_SoundChannel_iev] + cmp r5, r0 + bhi _081DD006 +_081DCFC8: + ldrb r5, [r4, o_SoundChannel_iev] + cmp r5, 0 + beq _081DCFB0 + movs r0, 0x4 + orrs r6, r0 + strb r6, [r4, o_SoundChannel_status] + b _081DD006 +_081DCFD6: + movs r2, 0x3 + ands r2, r6 + cmp r2, 0x2 + bne _081DCFF4 + ldrb r0, [r4, o_SoundChannel_decay] + muls r5, r0 + lsrs r5, 8 + ldrb r0, [r4, o_SoundChannel_sustain] + cmp r5, r0 + bhi _081DD006 + adds r5, r0, 0 + beq _081DCFC8 + subs r6, 0x1 + strb r6, [r4, o_SoundChannel_status] + b _081DD006 +_081DCFF4: + cmp r2, 0x3 + bne _081DD006 +_081DCFF8: + ldrb r0, [r4, o_SoundChannel_attack] + adds r5, r0 + cmp r5, 0xFF + bcc _081DD006 + movs r5, 0xFF + subs r6, 0x1 + strb r6, [r4, o_SoundChannel_status] +_081DD006: + strb r5, [r4, o_SoundChannel_ev] + ldr r0, [sp, 0x18] + ldrb r0, [r0, o_SoundChannel_release] + adds r0, 0x1 + muls r0, r5 + lsrs r5, r0, 4 + ldrb r0, [r4, o_SoundChannel_rightVolume] + muls r0, r5 + lsrs r0, 8 + strb r0, [r4, o_SoundChannel_er] + ldrb r0, [r4, o_SoundChannel_leftVolume] + muls r0, r5 + lsrs r0, 8 + strb r0, [r4, o_SoundChannel_el] + movs r0, 0x10 + ands r0, r6 + str r0, [sp, 0x10] + beq _081DD03A + adds r0, r3, 0 + adds r0, 0x10 + ldr r1, [r3, 0x8] + adds r0, r1 + str r0, [sp, 0xC] + ldr r0, [r3, 0xC] + subs r0, r1 + str r0, [sp, 0x10] +_081DD03A: + ldr r5, [sp, 0x8] + ldr r2, [r4, o_SoundChannel_ct] + ldr r3, [r4, o_SoundChannel_cp] + adr r0, _081DD044 + bx r0 + .arm +_081DD044: + str r8, [sp] + ldr r9, [r4, o_SoundChannel_fw] + ldrb r10, [r4, o_SoundChannel_er] + ldrb r11, [r4, o_SoundChannel_el] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x30 + beq _081DD068 + bl sub_81DD264 + b _081DD228 +_081DD068: + mov r10, r10, lsl 16 + mov r11, r11, lsl 16 + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x8 + beq _081DD19C +_081DD07C: + cmp r2, 0x4 + ble _081DD0EC + subs r2, r2, r8 + movgt r9, 0 + bgt _081DD0A8 + mov r9, r8 + add r2, r2, r8 + sub r8, r2, 0x4 + sub r9, r9, r8 + ands r2, r2, 0x3 + moveq r2, 0x4 +_081DD0A8: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD0B0: + ldrsb r0, [r3], 0x1 + mul r1, r10, r0 + bic r1, r1, 0xFF0000 + add r6, r1, r6, ror 8 + mul r1, r11, r0 + bic r1, r1, 0xFF0000 + add r7, r1, r7, ror 8 + adds r5, r5, 0x40000000 + bcc _081DD0B0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD0A8 + adds r8, r8, r9 + beq _081DD22C +_081DD0EC: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD0F4: + ldrsb r0, [r3], 0x1 + mul r1, r10, r0 + bic r1, r1, 0xFF0000 + add r6, r1, r6, ror 8 + mul r1, r11, r0 + bic r1, r1, 0xFF0000 + add r7, r1, r7, ror 8 + subs r2, r2, 0x1 + beq _081DD164 +_081DD118: + adds r5, r5, 0x40000000 + bcc _081DD0F4 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD07C + b _081DD22C +_081DD134: + ldr r0, [sp, 0x18] + cmp r0, 0 + beq _081DD158 + ldr r3, [sp, 0x14] + rsb lr, r2, 0 +_081DD148: + adds r2, r0, r2 + bgt _081DD1FC + sub lr, lr, r0 + b _081DD148 +_081DD158: + pop {r4,r12} + mov r2, 0 + b _081DD174 +_081DD164: + ldr r2, [sp, 0x10] + cmp r2, 0 + ldrne r3, [sp, 0xC] + bne _081DD118 +_081DD174: + strb r2, [r4, o_SoundChannel_status] + mov r0, r5, lsr 30 + bic r5, r5, 0xC0000000 + rsb r0, r0, 0x3 + mov r0, r0, lsl 3 + mov r6, r6, ror r0 + mov r7, r7, ror r0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + b _081DD234 +_081DD19C: + push {r4,r12} + ldr r1, [r4, o_SoundChannel_freq] + mul r4, r12, r1 + ldrsb r0, [r3] + ldrsb r1, [r3, 0x1]! + sub r1, r1, r0 +_081DD1B4: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD1BC: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r4 + movs lr, r9, lsr 23 + beq _081DD208 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD134 + subs lr, lr, 0x1 + addeq r0, r0, r1 +_081DD1FC: + ldrsbne r0, [r3, lr]! + ldrsb r1, [r3, 0x1]! + sub r1, r1, r0 +_081DD208: + adds r5, r5, 0x40000000 + bcc _081DD1BC + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD1B4 + sub r3, r3, 0x1 + pop {r4,r12} +_081DD228: + str r9, [r4, o_SoundChannel_fw] +_081DD22C: + str r2, [r4, o_SoundChannel_ct] + str r3, [r4, o_SoundChannel_cp] +_081DD234: + ldr r8, [sp] + add r0, pc, 0x1 + bx r0 + .thumb +_081DD240: + ldr r0, [sp, 0x4] + subs r0, 1 + ble _081DD24A + adds r4, SoundChannel_size + b SoundMainRAM_ChanLoop +_081DD24A: + ldr r0, [sp, 0x18] + ldr r3, =ID_NUMBER + str r3, [r0] + add sp, 0x1C + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r3} +_081DD25E: + bx r3 + .pool + thumb_func_end SoundMainRAM + + arm_func_start sub_81DD264 +sub_81DD264: + ldr r6, [r4, o_SoundChannel_wav] + ldrb r0, [r4, o_SoundChannel_status] + tst r0, 0x20 + bne _081DD2B4 + orr r0, r0, 0x20 + strb r0, [r4, o_SoundChannel_status] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + beq _081DD29C + ldr r1, [r6, 0xC] + add r1, r1, r6, lsl 1 + add r1, r1, 0x20 + sub r3, r1, r3 + str r3, [r4, o_SoundChannel_cp] +_081DD29C: + ldrh r0, [r6] + cmp r0, 0 + beq _081DD2B4 + sub r3, r3, r6 + sub r3, r3, 0x10 + str r3, [r4, o_SoundChannel_cp] +_081DD2B4: + push {r8,r12,lr} + mov r10, r10, lsl 16 + mov r11, r11, lsl 16 + ldr r1, [r4, o_SoundChannel_freq] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x8 + movne r8, 0x800000 + muleq r8, r12, r1 + ldrh r0, [r6] + cmp r0, 0 + beq _081DD468 + mov r0, 0xFF000000 + str r0, [r4, o_SoundChannel_xpi] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + bne _081DD3C0 + bl sub_81DD520 + mov r0, r1 + add r3, r3, 0x1 + bl sub_81DD520 + sub r1, r1, r0 +_081DD308: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD310: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD370 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD398 + subs lr, lr, 0x1 + bne _081DD358 + add r0, r0, r1 + b _081DD364 +_081DD358: + add r3, r3, lr + bl sub_81DD520 + mov r0, r1 +_081DD364: + add r3, r3, 0x1 + bl sub_81DD520 + sub r1, r1, r0 +_081DD370: + adds r5, r5, 0x40000000 + bcc _081DD310 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD308 + sub r3, r3, 0x1 + b _081DD4F0 +_081DD398: + ldr r0, [sp, 0x1C] + cmp r0, 0 + beq _081DD4F4 + ldr r3, [r4, o_SoundChannel_wav] + ldr r3, [r3, 0x8] + rsb lr, r2, 0 +_081DD3B0: + adds r2, r2, r0 + bgt _081DD358 + sub lr, lr, r0 + b _081DD3B0 +_081DD3C0: + sub r3, r3, 0x1 + bl sub_81DD520 + mov r0, r1 + sub r3, r3, 0x1 + bl sub_81DD520 + sub r1, r1, r0 +_081DD3D8: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD3E0: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD440 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD4F4 + subs lr, lr, 0x1 + bne _081DD428 + add r0, r0, r1 + b _081DD434 +_081DD428: + sub r3, r3, lr + bl sub_81DD520 + mov r0, r1 +_081DD434: + sub r3, r3, 0x1 + bl sub_81DD520 + sub r1, r1, r0 +_081DD440: + adds r5, r5, 0x40000000 + bcc _081DD3E0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD3D8 + add r3, r3, 0x2 + b _081DD4F0 +_081DD468: + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + beq _081DD4F0 + ldrsb r0, [r3, -0x1]! + ldrsb r1, [r3, -0x1] + sub r1, r1, r0 +_081DD480: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD488: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD4CC + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD4F4 + ldrsb r0, [r3, -lr]! + ldrsb r1, [r3, -0x1] + sub r1, r1, r0 +_081DD4CC: + adds r5, r5, 0x40000000 + bcc _081DD488 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD480 + add r3, r3, 0x1 +_081DD4F0: + pop {r8,r12,pc} +_081DD4F4: + mov r2, 0 + strb r2, [r4, o_SoundChannel_status] + mov r0, r5, lsr 30 + bic r5, r5, 0xC0000000 + rsb r0, r0, 0x3 + mov r0, r0, lsl 3 + mov r6, r6, ror r0 + mov r7, r7, ror r0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + pop {r8,r12,pc} + arm_func_end sub_81DD264 + + arm_func_start sub_81DD520 +sub_81DD520: + push {r0,r2,r5-r7,lr} + mov r0, r3, lsr 6 + ldr r1, [r4, o_SoundChannel_xpi] + cmp r0, r1 + beq _081DD594 + str r0, [r4, o_SoundChannel_xpi] + mov r1, 0x21 + mul r2, r1, r0 + ldr r1, [r4, o_SoundChannel_wav] + add r2, r2, r1 + add r2, r2, 0x10 + ldr r5, =0x030007b8 + ldr r6, =gUnknown_0842F9F4 + mov r7, 0x40 + ldrb lr, [r2], 1 + strb lr, [r5], 1 + ldrb r1, [r2], 1 + b _081DD57C +_081DD568: + ldrb r1, [r2], 1 + mov r0, r1, lsr 4 + ldrsb r0, [r6, r0] + add lr, lr, r0 + strb lr, [r5], 1 +_081DD57C: + and r0, r1, 0xF + ldrsb r0, [r6, r0] + add lr, lr, r0 + strb lr, [r5], 1 + subs r7, r7, 2 + bgt _081DD568 +_081DD594: + ldr r5, =0x030007b8 + and r0, r3, 0x3F + ldrsb r1, [r5, r0] + pop {r0,r2,r5-r7,pc} + .pool + arm_func_end sub_81DD520 + + thumb_func_start SoundMainBTM +SoundMainBTM: + mov r12, r4 + movs r1, 0 + movs r2, 0 + movs r3, 0 + movs r4, 0 + stm r0!, {r1-r4} + stm r0!, {r1-r4} + stm r0!, {r1-r4} + stm r0!, {r1-r4} + mov r4, r12 + bx lr + thumb_func_end SoundMainBTM + + thumb_func_start RealClearChain +RealClearChain: + ldr r3, [r0, 0x2C] + cmp r3, 0 + beq _081DD5E2 + ldr r1, [r0, 0x34] + ldr r2, [r0, 0x30] + cmp r2, 0 + beq _081DD5D6 + str r1, [r2, 0x34] + b _081DD5D8 +_081DD5D6: + str r1, [r3, 0x20] +_081DD5D8: + cmp r1, 0 + beq _081DD5DE + str r2, [r1, 0x30] +_081DD5DE: + movs r1, 0 + str r1, [r0, 0x2C] +_081DD5E2: + bx lr + thumb_func_end RealClearChain + + thumb_func_start ply_fine +ply_fine: + push {r4,r5,lr} + adds r5, r1, 0 + ldr r4, [r5, 0x20] + cmp r4, 0 + beq ply_fine_done +ply_fine_loop: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq ply_fine_ok + movs r0, 0x40 + orrs r1, r0 + strb r1, [r4] +ply_fine_ok: + adds r0, r4, 0 + bl RealClearChain + ldr r4, [r4, 0x34] + cmp r4, 0 + bne ply_fine_loop +ply_fine_done: + movs r0, 0 + strb r0, [r5] + pop {r4,r5} + pop {r0} + bx r0 + thumb_func_end ply_fine + + thumb_func_start MPlayJumpTableCopy +MPlayJumpTableCopy: + mov r12, lr + movs r1, 0x24 + ldr r2, lt_MPlayJumpTableTemplate +MPlayJumpTableCopy_Loop: + ldr r3, [r2] + bl chk_adr_r2 + stm r0!, {r3} + adds r2, 0x4 + subs r1, 0x1 + bgt MPlayJumpTableCopy_Loop + bx r12 + thumb_func_end MPlayJumpTableCopy + + .align 2, 0 + .thumb_func +ldrb_r3_r2: + ldrb r3, [r2] + +@ This attempts to protect against reading anything from the BIOS ROM +@ besides the jump table template. +@ It assumes that the jump table template is located at the end of the ROM. + .thumb_func +chk_adr_r2: + push {r0} + lsrs r0, r2, 25 + bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it + ldr r0, lt_MPlayJumpTableTemplate + cmp r2, r0 + blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it + lsrs r0, r2, 14 + beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it +chk_adr_r2_reject: + movs r3, 0 +chk_adr_r2_done: + pop {r0} + bx lr + + .align 2, 0 +lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate + + thumb_func_start ld_r3_tp_adr_i +ld_r3_tp_adr_i: + ldr r2, [r1, 0x40] +_081DD64A: + adds r3, r2, 0x1 + str r3, [r1, 0x40] + ldrb r3, [r2] + b chk_adr_r2 + thumb_func_end ld_r3_tp_adr_i + + thumb_func_start ply_goto +ply_goto: + push {lr} +ply_goto_1: + ldr r2, [r1, 0x40] + ldrb r0, [r2, 0x3] + lsls r0, 8 + ldrb r3, [r2, 0x2] + orrs r0, r3 + lsls r0, 8 + ldrb r3, [r2, 0x1] + orrs r0, r3 + lsls r0, 8 + bl ldrb_r3_r2 + orrs r0, r3 + str r0, [r1, 0x40] + pop {r0} + bx r0 + thumb_func_end ply_goto + + thumb_func_start ply_patt +ply_patt: + ldrb r2, [r1, 0x2] + cmp r2, 0x3 + bcs ply_patt_done + lsls r2, 2 + adds r3, r1, r2 + ldr r2, [r1, 0x40] + adds r2, 0x4 + str r2, [r3, 0x44] + ldrb r2, [r1, 0x2] + adds r2, 0x1 + strb r2, [r1, 0x2] + b ply_goto +ply_patt_done: + b ply_fine + thumb_func_end ply_patt + + thumb_func_start ply_pend +ply_pend: + ldrb r2, [r1, 0x2] + cmp r2, 0 + beq ply_pend_done + subs r2, 0x1 + strb r2, [r1, 0x2] + lsls r2, 2 + adds r3, r1, r2 + ldr r2, [r3, 0x44] + str r2, [r1, 0x40] +ply_pend_done: + bx lr + thumb_func_end ply_pend + + thumb_func_start ply_rept +ply_rept: + push {lr} + ldr r2, [r1, 0x40] + ldrb r3, [r2] + cmp r3, 0 + bne ply_rept_1 + adds r2, 0x1 + str r2, [r1, 0x40] + b ply_goto_1 +ply_rept_1: + ldrb r3, [r1, 0x3] + adds r3, 0x1 + strb r3, [r1, 0x3] + mov r12, r3 + bl ld_r3_tp_adr_i + cmp r12, r3 + bcs ply_rept_2 + b ply_goto_1 +ply_rept_2: + movs r3, 0 + strb r3, [r1, 0x3] + adds r2, 0x5 + str r2, [r1, 0x40] + pop {r0} + bx r0 + thumb_func_end ply_rept + + thumb_func_start ply_prio +ply_prio: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, 0x1D] + bx r12 + thumb_func_end ply_prio + + thumb_func_start ply_tempo +ply_tempo: + mov r12, lr + bl ld_r3_tp_adr_i + lsls r3, 1 + strh r3, [r0, 0x1C] + ldrh r2, [r0, 0x1E] + muls r3, r2 + lsrs r3, 8 + strh r3, [r0, 0x20] + bx r12 + thumb_func_end ply_tempo + + thumb_func_start ply_keysh +ply_keysh: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, 0xA] + ldrb r3, [r1] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_keysh + + thumb_func_start ply_voice +ply_voice: + mov r12, lr + ldr r2, [r1, 0x40] + ldrb r3, [r2] + adds r2, 0x1 + str r2, [r1, 0x40] + lsls r2, r3, 1 + adds r2, r3 + lsls r2, 2 + ldr r3, [r0, 0x30] + adds r2, r3 + ldr r3, [r2] + bl chk_adr_r2 + str r3, [r1, 0x24] + ldr r3, [r2, 0x4] + bl chk_adr_r2 + str r3, [r1, 0x28] + ldr r3, [r2, 0x8] + bl chk_adr_r2 + str r3, [r1, 0x2C] + bx r12 + thumb_func_end ply_voice + + thumb_func_start ply_vol +ply_vol: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, 0x12] + ldrb r3, [r1] + movs r2, 0x3 + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_vol + + thumb_func_start ply_pan +ply_pan: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, 0x14] + ldrb r3, [r1] + movs r2, 0x3 + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_pan + + thumb_func_start ply_bend +ply_bend: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, 0xE] + ldrb r3, [r1] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_bend + + thumb_func_start ply_bendr +ply_bendr: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, 0xF] + ldrb r3, [r1] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_bendr + + thumb_func_start ply_lfodl +ply_lfodl: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, 0x1B] + bx r12 + thumb_func_end ply_lfodl + + thumb_func_start ply_modt +ply_modt: + mov r12, lr + bl ld_r3_tp_adr_i + ldrb r0, [r1, 0x18] + cmp r0, r3 + beq _081DD7AA + strb r3, [r1, 0x18] + ldrb r3, [r1] + movs r2, 0xF + orrs r3, r2 + strb r3, [r1] +_081DD7AA: + bx r12 + thumb_func_end ply_modt + + thumb_func_start ply_tune +ply_tune: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, 0xC] + ldrb r3, [r1] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1] + bx r12 + thumb_func_end ply_tune + + thumb_func_start ply_port +ply_port: + mov r12, lr + ldr r2, [r1, 0x40] + ldrb r3, [r2] + adds r2, 0x1 + ldr r0, =REG_SOUND1CNT_L @ sound register base address + adds r0, r3 + bl _081DD64A + strb r3, [r0] + bx r12 + .pool + thumb_func_end ply_port + + thumb_func_start m4aSoundVSync +m4aSoundVSync: + ldr r0, lt2_SOUND_INFO_PTR + ldr r0, [r0] + + @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. + ldr r2, lt2_ID_NUMBER + ldr r3, [r0, o_SoundInfo_ident] + subs r3, r2 + cmp r3, 1 + bhi m4aSoundVSync_Done + + @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. + ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] + subs r1, 1 + strb r1, [r0, o_SoundInfo_pcmDmaCounter] + bgt m4aSoundVSync_Done + + @ Reload the PCM DMA counter. + ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] + strb r1, [r0, o_SoundInfo_pcmDmaCounter] + + ldr r2, =REG_DMA1 + + ldr r1, [r2, 0x8] @ DMA1CNT + lsls r1, 7 + bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set + + ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 + str r1, [r2, 0x8] @ DMA1CNT + +m4aSoundVSync_SkipDMA1: + ldr r1, [r2, 0xC + 0x8] @ DMA2CNT + lsls r1, 7 + bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set + + ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 + str r1, [r2, 0xC + 0x8] @ DMA2CNT + +m4aSoundVSync_SkipDMA2: + + @ turn off DMA1/DMA2 + movs r1, DMA_32BIT >> 8 + lsls r1, 8 + strh r1, [r2, 0xA] @ DMA1CNT_H + strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H + + @ turn on DMA1/DMA2 direct-sound FIFO mode + movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8 + lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode) + strh r1, [r2, 0xA] @ DMA1CNT_H + strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H + +m4aSoundVSync_Done: + bx lr + + .pool + thumb_func_end m4aSoundVSync + + thumb_func_start MPlayMain +MPlayMain: + ldr r2, lt2_ID_NUMBER + ldr r3, [r0, 0x34] + cmp r2, r3 + beq _081DD82E + bx lr +_081DD82E: + adds r3, 0x1 + str r3, [r0, 0x34] + push {r0,lr} + ldr r3, [r0, 0x38] + cmp r3, 0 + beq _081DD840 + ldr r0, [r0, 0x3C] + bl _081DDA7C +_081DD840: + pop {r0} + push {r4-r7} + mov r4, r8 + mov r5, r9 + mov r6, r10 + mov r7, r11 + push {r4-r7} + adds r7, r0, 0 + ldr r0, [r7, 0x4] + cmp r0, 0 + bge _081DD858 + b _081DDA6C +_081DD858: + ldr r0, lt2_SOUND_INFO_PTR + ldr r0, [r0] + mov r8, r0 + adds r0, r7, 0 + bl FadeOutBody + ldr r0, [r7, 0x4] + cmp r0, 0 + bge _081DD86C + b _081DDA6C +_081DD86C: + ldrh r0, [r7, 0x22] + ldrh r1, [r7, 0x20] + adds r0, r1 + b _081DD9BC +_081DD874: + ldrb r6, [r7, 0x8] + ldr r5, [r7, 0x2C] + movs r3, 0x1 + movs r4, 0 +_081DD87C: + ldrb r0, [r5] + movs r1, 0x80 + tst r1, r0 + bne _081DD886 + b _081DD998 +_081DD886: + mov r10, r3 + orrs r4, r3 + mov r11, r4 + ldr r4, [r5, 0x20] + cmp r4, 0 + beq _081DD8BA +_081DD892: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DD8AE + ldrb r0, [r4, 0x10] + cmp r0, 0 + beq _081DD8B4 + subs r0, 0x1 + strb r0, [r4, 0x10] + bne _081DD8B4 + movs r0, 0x40 + orrs r1, r0 + strb r1, [r4] + b _081DD8B4 +_081DD8AE: + adds r0, r4, 0 + bl ClearChain +_081DD8B4: + ldr r4, [r4, 0x34] + cmp r4, 0 + bne _081DD892 +_081DD8BA: + ldrb r3, [r5] + movs r0, 0x40 + tst r0, r3 + beq _081DD938 + adds r0, r5, 0 + bl Clear64byte + movs r0, 0x80 + strb r0, [r5] + movs r0, 0x2 + strb r0, [r5, 0xF] + movs r0, 0x40 + strb r0, [r5, 0x13] + movs r0, 0x16 + strb r0, [r5, 0x19] + movs r0, 0x1 + adds r1, r5, 0x6 + strb r0, [r1, 0x1E] + b _081DD938 +_081DD8E0: + ldr r2, [r5, 0x40] + ldrb r1, [r2] + cmp r1, 0x80 + bcs _081DD8EC + ldrb r1, [r5, 0x7] + b _081DD8F6 +_081DD8EC: + adds r2, 0x1 + str r2, [r5, 0x40] + cmp r1, 0xBD + bcc _081DD8F6 + strb r1, [r5, 0x7] +_081DD8F6: + cmp r1, 0xCF + bcc _081DD90C + mov r0, r8 + ldr r3, [r0, 0x38] + adds r0, r1, 0 + subs r0, 0xCF + adds r1, r7, 0 + adds r2, r5, 0 + bl _081DDA7C + b _081DD938 +_081DD90C: + cmp r1, 0xB0 + bls _081DD92E + adds r0, r1, 0 + subs r0, 0xB1 + strb r0, [r7, 0xA] + mov r3, r8 + ldr r3, [r3, 0x34] + lsls r0, 2 + ldr r3, [r3, r0] + adds r0, r7, 0 + adds r1, r5, 0 + bl _081DDA7C + ldrb r0, [r5] + cmp r0, 0 + beq _081DD994 + b _081DD938 +_081DD92E: + ldr r0, lt_gClockTable + subs r1, 0x80 + adds r1, r0 + ldrb r0, [r1] + strb r0, [r5, 0x1] +_081DD938: + ldrb r0, [r5, 0x1] + cmp r0, 0 + beq _081DD8E0 + subs r0, 0x1 + strb r0, [r5, 0x1] + ldrb r1, [r5, 0x19] + cmp r1, 0 + beq _081DD994 + ldrb r0, [r5, 0x17] + cmp r0, 0 + beq _081DD994 + ldrb r0, [r5, 0x1C] + cmp r0, 0 + beq _081DD95A + subs r0, 0x1 + strb r0, [r5, 0x1C] + b _081DD994 +_081DD95A: + ldrb r0, [r5, 0x1A] + adds r0, r1 + strb r0, [r5, 0x1A] + adds r1, r0, 0 + subs r0, 0x40 + lsls r0, 24 + bpl _081DD96E + lsls r2, r1, 24 + asrs r2, 24 + b _081DD972 +_081DD96E: + movs r0, 0x80 + subs r2, r0, r1 +_081DD972: + ldrb r0, [r5, 0x17] + muls r0, r2 + asrs r2, r0, 6 + ldrb r0, [r5, 0x16] + eors r0, r2 + lsls r0, 24 + beq _081DD994 + strb r2, [r5, 0x16] + ldrb r0, [r5] + ldrb r1, [r5, 0x18] + cmp r1, 0 + bne _081DD98E + movs r1, 0xC + b _081DD990 +_081DD98E: + movs r1, 0x3 +_081DD990: + orrs r0, r1 + strb r0, [r5] +_081DD994: + mov r3, r10 + mov r4, r11 +_081DD998: + subs r6, 0x1 + ble _081DD9A4 + movs r0, 0x50 + adds r5, r0 + lsls r3, 1 + b _081DD87C +_081DD9A4: + ldr r0, [r7, 0xC] + adds r0, 0x1 + str r0, [r7, 0xC] + cmp r4, 0 + bne _081DD9B6 + movs r0, 0x80 + lsls r0, 24 + str r0, [r7, 0x4] + b _081DDA6C +_081DD9B6: + str r4, [r7, 0x4] + ldrh r0, [r7, 0x22] + subs r0, 0x96 +_081DD9BC: + strh r0, [r7, 0x22] + cmp r0, 0x96 + bcc _081DD9C4 + b _081DD874 +_081DD9C4: + ldrb r2, [r7, 0x8] + ldr r5, [r7, 0x2C] +_081DD9C8: + ldrb r0, [r5] + movs r1, 0x80 + tst r1, r0 + beq _081DDA62 + movs r1, 0xF + tst r1, r0 + beq _081DDA62 + mov r9, r2 + adds r0, r7, 0 + adds r1, r5, 0 + bl TrkVolPitSet + ldr r4, [r5, 0x20] + cmp r4, 0 + beq _081DDA58 +_081DD9E6: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + bne _081DD9F6 + adds r0, r4, 0 + bl ClearChain + b _081DDA52 +_081DD9F6: + ldrb r0, [r4, 0x1] + movs r6, 0x7 + ands r6, r0 + ldrb r3, [r5] + movs r0, 0x3 + tst r0, r3 + beq _081DDA14 + bl ChnVolSetAsm + cmp r6, 0 + beq _081DDA14 + ldrb r0, [r4, 0x1D] + movs r1, 0x1 + orrs r0, r1 + strb r0, [r4, 0x1D] +_081DDA14: + ldrb r3, [r5] + movs r0, 0xC + tst r0, r3 + beq _081DDA52 + ldrb r1, [r4, 0x8] + movs r0, 0x8 + ldrsb r0, [r5, r0] + adds r2, r1, r0 + bpl _081DDA28 + movs r2, 0 +_081DDA28: + cmp r6, 0 + beq _081DDA46 + mov r0, r8 + ldr r3, [r0, 0x30] + adds r1, r2, 0 + ldrb r2, [r5, 0x9] + adds r0, r6, 0 + bl _081DDA7C + str r0, [r4, 0x20] + ldrb r0, [r4, 0x1D] + movs r1, 0x2 + orrs r0, r1 + strb r0, [r4, 0x1D] + b _081DDA52 +_081DDA46: + adds r1, r2, 0 + ldrb r2, [r5, 0x9] + ldr r0, [r4, 0x24] + bl MidiKeyToFreq + str r0, [r4, 0x20] +_081DDA52: + ldr r4, [r4, 0x34] + cmp r4, 0 + bne _081DD9E6 +_081DDA58: + ldrb r0, [r5] + movs r1, 0xF0 + ands r0, r1 + strb r0, [r5] + mov r2, r9 +_081DDA62: + subs r2, 0x1 + ble _081DDA6C + movs r0, 0x50 + adds r5, r0 + bgt _081DD9C8 +_081DDA6C: + ldr r0, lt2_ID_NUMBER + str r0, [r7, 0x34] + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r3} +_081DDA7C: + bx r3 + + .align 2, 0 +lt_gClockTable: .word gClockTable +lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR +lt2_ID_NUMBER: .word ID_NUMBER + thumb_func_end MPlayMain + + thumb_func_start TrackStop +TrackStop: + push {r4-r6,lr} + adds r5, r1, 0 + ldrb r1, [r5] + movs r0, 0x80 + tst r0, r1 + beq TrackStop_Done + ldr r4, [r5, 0x20] + cmp r4, 0 + beq TrackStop_3 + movs r6, 0 +TrackStop_Loop: + ldrb r0, [r4] + cmp r0, 0 + beq TrackStop_2 + ldrb r0, [r4, 0x1] + movs r3, 0x7 + ands r0, r3 + beq TrackStop_1 + ldr r3, =SOUND_INFO_PTR + ldr r3, [r3] + ldr r3, [r3, 0x2C] + bl _081DDA7C +TrackStop_1: + strb r6, [r4] +TrackStop_2: + str r6, [r4, 0x2C] + ldr r4, [r4, 0x34] + cmp r4, 0 + bne TrackStop_Loop +TrackStop_3: + str r4, [r5, 0x20] +TrackStop_Done: + pop {r4-r6} + pop {r0} + bx r0 + .pool + thumb_func_end TrackStop + + thumb_func_start ChnVolSetAsm +ChnVolSetAsm: + ldrb r1, [r4, 0x12] + movs r0, 0x14 + ldrsb r2, [r4, r0] + movs r3, 0x80 + adds r3, r2 + muls r3, r1 + ldrb r0, [r5, 0x10] + muls r0, r3 + asrs r0, 14 + cmp r0, 0xFF + bls _081DDAE8 + movs r0, 0xFF +_081DDAE8: + strb r0, [r4, 0x2] + movs r3, 0x7F + subs r3, r2 + muls r3, r1 + ldrb r0, [r5, 0x11] + muls r0, r3 + asrs r0, 14 + cmp r0, 0xFF + bls _081DDAFC + movs r0, 0xFF +_081DDAFC: + strb r0, [r4, 0x3] + bx lr + thumb_func_end ChnVolSetAsm + + thumb_func_start ply_note +ply_note: + push {r4-r7,lr} + mov r4, r8 + mov r5, r9 + mov r6, r10 + mov r7, r11 + push {r4-r7} + sub sp, 0x18 + str r1, [sp] + adds r5, r2, 0 + ldr r1, =SOUND_INFO_PTR + ldr r1, [r1] + str r1, [sp, 0x4] + ldr r1, =gClockTable + adds r0, r1 + ldrb r0, [r0] + strb r0, [r5, 0x4] + ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] + ldrb r0, [r3] + cmp r0, 0x80 + bcs _081DDB46 + strb r0, [r5, o_MusicPlayerTrack_key] + adds r3, 0x1 + ldrb r0, [r3] + cmp r0, 0x80 + bcs _081DDB44 + strb r0, [r5, 0x6] + adds r3, 0x1 + ldrb r0, [r3] + cmp r0, 0x80 + bcs _081DDB44 + ldrb r1, [r5, 0x4] + adds r1, r0 + strb r1, [r5, 0x4] + adds r3, 0x1 +_081DDB44: + str r3, [r5, o_MusicPlayerTrack_cmdPtr] +_081DDB46: + movs r0, 0 + str r0, [sp, 0x14] + adds r4, r5, 0 + adds r4, 0x24 + ldrb r2, [r4] + movs r0, 0xC0 + tst r0, r2 + beq _081DDB98 + ldrb r3, [r5, 0x5] + movs r0, 0x40 + tst r0, r2 + beq _081DDB66 + ldr r1, [r5, 0x2C] + adds r1, r3 + ldrb r0, [r1] + b _081DDB68 +_081DDB66: + adds r0, r3, 0 +_081DDB68: + lsls r1, r0, 1 + adds r1, r0 + lsls r1, 2 + ldr r0, [r5, 0x28] + adds r1, r0 + mov r9, r1 + mov r6, r9 + ldrb r1, [r6] + movs r0, 0xC0 + tst r0, r1 + beq _081DDB80 + b _081DDCEA +_081DDB80: + movs r0, 0x80 + tst r0, r2 + beq _081DDB9C + ldrb r1, [r6, 0x3] + movs r0, 0x80 + tst r0, r1 + beq _081DDB94 + subs r1, 0xC0 + lsls r1, 1 + str r1, [sp, 0x14] +_081DDB94: + ldrb r3, [r6, 0x1] + b _081DDB9C +_081DDB98: + mov r9, r4 + ldrb r3, [r5, 0x5] +_081DDB9C: + str r3, [sp, 0x8] + ldr r6, [sp] + ldrb r1, [r6, 0x9] + ldrb r0, [r5, 0x1D] + adds r0, r1 + cmp r0, 0xFF + bls _081DDBAC + movs r0, 0xFF +_081DDBAC: + str r0, [sp, 0x10] + mov r6, r9 + ldrb r0, [r6] + movs r6, 0x7 + ands r6, r0 + str r6, [sp, 0xC] + beq _081DDBEC + ldr r0, [sp, 0x4] + ldr r4, [r0, 0x1C] + cmp r4, 0 + bne _081DDBC4 + b _081DDCEA +_081DDBC4: + subs r6, 0x1 + lsls r0, r6, 6 + adds r4, r0 + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DDC40 + movs r0, 0x40 + tst r0, r1 + bne _081DDC40 + ldrb r1, [r4, 0x13] + ldr r0, [sp, 0x10] + cmp r1, r0 + bcc _081DDC40 + beq _081DDBE4 + b _081DDCEA +_081DDBE4: + ldr r0, [r4, 0x2C] + cmp r0, r5 + bcs _081DDC40 + b _081DDCEA +_081DDBEC: + ldr r6, [sp, 0x10] + adds r7, r5, 0 + movs r2, 0 + mov r8, r2 + ldr r4, [sp, 0x4] + ldrb r3, [r4, 0x6] + adds r4, 0x50 +_081DDBFA: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DDC40 + movs r0, 0x40 + tst r0, r1 + beq _081DDC14 + cmp r2, 0 + bne _081DDC18 + adds r2, 0x1 + ldrb r6, [r4, 0x13] + ldr r7, [r4, 0x2C] + b _081DDC32 +_081DDC14: + cmp r2, 0 + bne _081DDC34 +_081DDC18: + ldrb r0, [r4, 0x13] + cmp r0, r6 + bcs _081DDC24 + adds r6, r0, 0 + ldr r7, [r4, 0x2C] + b _081DDC32 +_081DDC24: + bhi _081DDC34 + ldr r0, [r4, 0x2C] + cmp r0, r7 + bls _081DDC30 + adds r7, r0, 0 + b _081DDC32 +_081DDC30: + bcc _081DDC34 +_081DDC32: + mov r8, r4 +_081DDC34: + adds r4, 0x40 + subs r3, 0x1 + bgt _081DDBFA + mov r4, r8 + cmp r4, 0 + beq _081DDCEA +_081DDC40: + adds r0, r4, 0 + bl ClearChain + movs r1, 0 + str r1, [r4, 0x30] + ldr r3, [r5, 0x20] + str r3, [r4, 0x34] + cmp r3, 0 + beq _081DDC54 + str r4, [r3, 0x30] +_081DDC54: + str r4, [r5, 0x20] + str r5, [r4, 0x2C] + ldrb r0, [r5, 0x1B] + strb r0, [r5, 0x1C] + cmp r0, r1 + beq _081DDC66 + adds r1, r5, 0 + bl clear_modM +_081DDC66: + ldr r0, [sp] + adds r1, r5, 0 + bl TrkVolPitSet + ldr r0, [r5, 0x4] + str r0, [r4, 0x10] + ldr r0, [sp, 0x10] + strb r0, [r4, 0x13] + ldr r0, [sp, 0x8] + strb r0, [r4, 0x8] + ldr r0, [sp, 0x14] + strb r0, [r4, 0x14] + mov r6, r9 + ldrb r0, [r6] + strb r0, [r4, 0x1] + ldr r7, [r6, 0x4] + str r7, [r4, 0x24] + ldr r0, [r6, 0x8] + str r0, [r4, 0x4] + ldrh r0, [r5, 0x1E] + strh r0, [r4, 0xC] + bl ChnVolSetAsm + ldrb r1, [r4, 0x8] + movs r0, 0x8 + ldrsb r0, [r5, r0] + adds r3, r1, r0 + bpl _081DDCA0 + movs r3, 0 +_081DDCA0: + ldr r6, [sp, 0xC] + cmp r6, 0 + beq _081DDCCE + mov r6, r9 + ldrb r0, [r6, 0x2] + strb r0, [r4, 0x1E] + ldrb r1, [r6, 0x3] + movs r0, 0x80 + tst r0, r1 + bne _081DDCBA + movs r0, 0x70 + tst r0, r1 + bne _081DDCBC +_081DDCBA: + movs r1, 0x8 +_081DDCBC: + strb r1, [r4, 0x1F] + ldrb r2, [r5, 0x9] + adds r1, r3, 0 + ldr r0, [sp, 0xC] + ldr r3, [sp, 0x4] + ldr r3, [r3, 0x30] + bl _081DDA7C + b _081DDCDC +_081DDCCE: + ldr r0, [r5, o_MusicPlayerTrack_unk_3C] + str r0, [r4, 0x18] + ldrb r2, [r5, 0x9] + adds r1, r3, 0 + adds r0, r7, 0 + bl MidiKeyToFreq +_081DDCDC: + str r0, [r4, 0x20] + movs r0, 0x80 + strb r0, [r4] + ldrb r1, [r5] + movs r0, 0xF0 + ands r0, r1 + strb r0, [r5] +_081DDCEA: + add sp, 0x18 + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r0} + bx r0 + .pool + thumb_func_end ply_note + + thumb_func_start ply_endtie +ply_endtie: + push {r4,r5} + ldr r2, [r1, 0x40] + ldrb r3, [r2] + cmp r3, 0x80 + bcs _081DDD16 + strb r3, [r1, 0x5] + adds r2, 0x1 + str r2, [r1, 0x40] + b _081DDD18 +_081DDD16: + ldrb r3, [r1, 0x5] +_081DDD18: + ldr r1, [r1, 0x20] + cmp r1, 0 + beq _081DDD40 + movs r4, 0x83 + movs r5, 0x40 +_081DDD22: + ldrb r2, [r1] + tst r2, r4 + beq _081DDD3A + tst r2, r5 + bne _081DDD3A + ldrb r0, [r1, 0x11] + cmp r0, r3 + bne _081DDD3A + movs r0, 0x40 + orrs r2, r0 + strb r2, [r1] + b _081DDD40 +_081DDD3A: + ldr r1, [r1, 0x34] + cmp r1, 0 + bne _081DDD22 +_081DDD40: + pop {r4,r5} + bx lr + thumb_func_end ply_endtie + + thumb_func_start clear_modM +clear_modM: + movs r2, 0 + strb r2, [r1, 0x16] + strb r2, [r1, 0x1A] + ldrb r2, [r1, 0x18] + cmp r2, 0 + bne _081DDD54 + movs r2, 0xC + b _081DDD56 +_081DDD54: + movs r2, 0x3 +_081DDD56: + ldrb r3, [r1] + orrs r3, r2 + strb r3, [r1] + bx lr + thumb_func_end clear_modM + + thumb_func_start ld_r3_tp_adr_i +ld_r3_tp_adr_i_unchecked: + ldr r2, [r1, 0x40] + adds r3, r2, 0x1 + str r3, [r1, 0x40] + ldrb r3, [r2] + bx lr + thumb_func_end ld_r3_tp_adr_i + + thumb_func_start ply_lfos +ply_lfos: + mov r12, lr + bl ld_r3_tp_adr_i_unchecked + strb r3, [r1, 0x19] + cmp r3, 0 + bne _081DDD7C + bl clear_modM +_081DDD7C: + bx r12 + thumb_func_end ply_lfos + + thumb_func_start ply_mod +ply_mod: + mov r12, lr + bl ld_r3_tp_adr_i_unchecked + strb r3, [r1, 0x17] + cmp r3, 0 + bne _081DDD90 + bl clear_modM +_081DDD90: + bx r12 + thumb_func_end ply_mod + + .align 2, 0 @ Don't pad with nop. diff --git a/asm/m4a_3.s b/asm/m4a_3.s new file mode 100644 index 000000000..68cd8803a --- /dev/null +++ b/asm/m4a_3.s @@ -0,0 +1,574 @@ + .include "asm/macros.s" + .include "constants/gba_constants.s" + .include "constants/m4a_constants.s" + + .syntax unified + + .text + + thumb_func_start CgbSound +CgbSound: @ 81DEA70 + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x1C + ldr r0, =SOUND_INFO_PTR + ldr r0, [r0] + str r0, [sp, 0x4] + ldrb r0, [r0, 0xA] + cmp r0, 0 + beq _081DEA94 + subs r0, 0x1 + ldr r1, [sp, 0x4] + strb r0, [r1, 0xA] + b _081DEA9A + .pool +_081DEA94: + movs r0, 0xE + ldr r2, [sp, 0x4] + strb r0, [r2, 0xA] +_081DEA9A: + movs r6, 0x1 + ldr r0, [sp, 0x4] + ldr r4, [r0, 0x1C] +_081DEAA0: + ldrb r1, [r4] + movs r0, 0xC7 + ands r0, r1 + adds r2, r6, 0x1 + mov r10, r2 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + bne _081DEAB6 + b _081DEEA0 +_081DEAB6: + cmp r6, 0x2 + beq _081DEAE8 + cmp r6, 0x2 + bgt _081DEAC4 + cmp r6, 0x1 + beq _081DEACA + b _081DEB20 +_081DEAC4: + cmp r6, 0x3 + beq _081DEB00 + b _081DEB20 +_081DEACA: + ldr r0, =REG_NR10 + str r0, [sp, 0x8] + ldr r7, =REG_NR11 + ldr r2, =REG_NR12 + str r2, [sp, 0xC] + adds r0, 0x4 + str r0, [sp, 0x10] + adds r2, 0x2 + b _081DEB30 + .pool +_081DEAE8: + ldr r0, =REG_NR10 + 1 + str r0, [sp, 0x8] + ldr r7, =REG_NR21 + ldr r2, =REG_NR22 + b _081DEB28 + .pool +_081DEB00: + ldr r0, =REG_NR30 + str r0, [sp, 0x8] + ldr r7, =REG_NR31 + ldr r2, =REG_NR32 + str r2, [sp, 0xC] + adds r0, 0x4 + str r0, [sp, 0x10] + adds r2, 0x2 + b _081DEB30 + .pool +_081DEB20: + ldr r0, =REG_NR30 + 1 + str r0, [sp, 0x8] + ldr r7, =REG_NR41 + ldr r2, =REG_NR42 +_081DEB28: + str r2, [sp, 0xC] + adds r0, 0xB + str r0, [sp, 0x10] + adds r2, 0x4 +_081DEB30: + str r2, [sp, 0x14] + ldr r0, [sp, 0x4] + ldrb r0, [r0, 0xA] + str r0, [sp] + ldr r2, [sp, 0xC] + ldrb r0, [r2] + mov r8, r0 + adds r2, r1, 0 + movs r0, 0x80 + ands r0, r2 + cmp r0, 0 + beq _081DEC26 + movs r3, 0x40 + adds r0, r3, 0 + ands r0, r2 + lsls r0, 24 + lsrs r5, r0, 24 + adds r0, r6, 0x1 + mov r10, r0 + movs r1, 0x40 + adds r1, r4 + mov r9, r1 + cmp r5, 0 + bne _081DEC4A + movs r0, 0x3 + strb r0, [r4] + strb r0, [r4, 0x1D] + adds r0, r4, 0 + str r3, [sp, 0x18] + bl CgbModVol + ldr r3, [sp, 0x18] + cmp r6, 0x2 + beq _081DEB98 + cmp r6, 0x2 + bgt _081DEB8C + cmp r6, 0x1 + beq _081DEB92 + b _081DEBEC + .pool +_081DEB8C: + cmp r6, 0x3 + beq _081DEBA4 + b _081DEBEC +_081DEB92: + ldrb r0, [r4, 0x1F] + ldr r2, [sp, 0x8] + strb r0, [r2] +_081DEB98: + ldr r0, [r4, 0x24] + lsls r0, 6 + ldrb r1, [r4, 0x1E] + adds r0, r1, r0 + strb r0, [r7] + b _081DEBF8 +_081DEBA4: + ldr r1, [r4, 0x24] + ldr r0, [r4, 0x28] + cmp r1, r0 + beq _081DEBCC + ldr r2, [sp, 0x8] + strb r3, [r2] + ldr r1, =REG_WAVE_RAM + ldr r2, [r4, 0x24] + ldr r0, [r2] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0x4] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0x8] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0xC] + str r0, [r1] + str r2, [r4, 0x28] +_081DEBCC: + ldr r0, [sp, 0x8] + strb r5, [r0] + ldrb r0, [r4, 0x1E] + strb r0, [r7] + ldrb r0, [r4, 0x1E] + cmp r0, 0 + beq _081DEBE4 + movs r0, 0xC0 + b _081DEC06 + .pool +_081DEBE4: + movs r1, 0x80 + negs r1, r1 + strb r1, [r4, 0x1A] + b _081DEC08 +_081DEBEC: + ldrb r0, [r4, 0x1E] + strb r0, [r7] + ldr r0, [r4, 0x24] + lsls r0, 3 + ldr r2, [sp, 0x10] + strb r0, [r2] +_081DEBF8: + ldrb r0, [r4, 0x4] + adds r0, 0x8 + mov r8, r0 + ldrb r0, [r4, 0x1E] + cmp r0, 0 + beq _081DEC06 + movs r0, 0x40 +_081DEC06: + strb r0, [r4, 0x1A] +_081DEC08: + ldrb r1, [r4, 0x4] + movs r2, 0 + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + adds r1, r6, 0x1 + mov r10, r1 + movs r1, 0x40 + adds r1, r4 + mov r9, r1 + cmp r0, 0 + bne _081DEC22 + b _081DED5E +_081DEC22: + strb r2, [r4, 0x9] + b _081DED8C +_081DEC26: + movs r0, 0x4 + ands r0, r2 + cmp r0, 0 + beq _081DEC58 + ldrb r0, [r4, 0xD] + subs r0, 0x1 + strb r0, [r4, 0xD] + movs r2, 0xFF + ands r0, r2 + lsls r0, 24 + adds r1, r6, 0x1 + mov r10, r1 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + ble _081DEC4A + b _081DED9E +_081DEC4A: + lsls r0, r6, 24 + lsrs r0, 24 + bl CgbOscOff + movs r0, 0 + strb r0, [r4] + b _081DEE9C +_081DEC58: + movs r0, 0x40 + ands r0, r1 + adds r2, r6, 0x1 + mov r10, r2 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + beq _081DEC98 + movs r0, 0x3 + ands r0, r1 + cmp r0, 0 + beq _081DEC98 + movs r0, 0xFC + ands r0, r1 + movs r2, 0 + strb r0, [r4] + ldrb r1, [r4, 0x7] + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + cmp r0, 0 + beq _081DECCA + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _081DED8C + ldrb r2, [r4, 0x7] + mov r8, r2 + b _081DED8C +_081DEC98: + ldrb r0, [r4, 0xB] + cmp r0, 0 + bne _081DED8C + cmp r6, 0x3 + bne _081DECAA + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] +_081DECAA: + adds r0, r4, 0 + bl CgbModVol + movs r0, 0x3 + ldrb r2, [r4] + ands r0, r2 + cmp r0, 0 + bne _081DECFE + ldrb r0, [r4, 0x9] + subs r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + lsls r0, 24 + cmp r0, 0 + bgt _081DECFA +_081DECCA: + ldrb r2, [r4, 0xC] + ldrb r1, [r4, 0xA] + adds r0, r2, 0 + muls r0, r1 + adds r0, 0xFF + asrs r0, 8 + movs r1, 0 + strb r0, [r4, 0x9] + lsls r0, 24 + cmp r0, 0 + beq _081DEC4A + movs r0, 0x4 + ldrb r2, [r4] + orrs r0, r2 + strb r0, [r4] + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _081DED9E + movs r2, 0x8 + mov r8, r2 + b _081DED9E +_081DECFA: + ldrb r0, [r4, 0x7] + b _081DED8A +_081DECFE: + cmp r0, 0x1 + bne _081DED0A +_081DED02: + ldrb r0, [r4, 0x19] + strb r0, [r4, 0x9] + movs r0, 0x7 + b _081DED8A +_081DED0A: + cmp r0, 0x2 + bne _081DED4E + ldrb r0, [r4, 0x9] + subs r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + lsls r0, 24 + ldrb r2, [r4, 0x19] + lsls r1, r2, 24 + cmp r0, r1 + bgt _081DED4A +_081DED22: + ldrb r0, [r4, 0x6] + cmp r0, 0 + bne _081DED32 + movs r0, 0xFC + ldrb r1, [r4] + ands r0, r1 + strb r0, [r4] + b _081DECCA +_081DED32: + ldrb r0, [r4] + subs r0, 0x1 + strb r0, [r4] + movs r0, 0x1 + ldrb r2, [r4, 0x1D] + orrs r0, r2 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _081DED02 + movs r0, 0x8 + mov r8, r0 + b _081DED02 +_081DED4A: + ldrb r0, [r4, 0x5] + b _081DED8A +_081DED4E: + ldrb r0, [r4, 0x9] + adds r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + ldrb r2, [r4, 0xA] + cmp r0, r2 + bcc _081DED88 +_081DED5E: + ldrb r0, [r4] + subs r0, 0x1 + movs r2, 0 + strb r0, [r4] + ldrb r1, [r4, 0x5] + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + cmp r0, 0 + beq _081DED22 + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + ldrb r0, [r4, 0xA] + strb r0, [r4, 0x9] + cmp r6, 0x3 + beq _081DED8C + ldrb r2, [r4, 0x5] + mov r8, r2 + b _081DED8C +_081DED88: + ldrb r0, [r4, 0x4] +_081DED8A: + strb r0, [r4, 0xB] +_081DED8C: + ldrb r0, [r4, 0xB] + subs r0, 0x1 + strb r0, [r4, 0xB] + ldr r0, [sp] + cmp r0, 0 + bne _081DED9E + subs r0, 0x1 + str r0, [sp] + b _081DEC98 +_081DED9E: + movs r0, 0x2 + ldrb r1, [r4, 0x1D] + ands r0, r1 + cmp r0, 0 + beq _081DEE16 + cmp r6, 0x3 + bgt _081DEDDE + movs r0, 0x8 + ldrb r2, [r4, 0x1] + ands r0, r2 + cmp r0, 0 + beq _081DEDDE + ldr r0, =REG_SOUNDBIAS + 1 + ldrb r0, [r0] + cmp r0, 0x3F + bgt _081DEDD0 + ldr r0, [r4, 0x20] + adds r0, 0x2 + ldr r1, =0x000007fc + b _081DEDDA + .pool +_081DEDD0: + cmp r0, 0x7F + bgt _081DEDDE + ldr r0, [r4, 0x20] + adds r0, 0x1 + ldr r1, =0x000007fe +_081DEDDA: + ands r0, r1 + str r0, [r4, 0x20] +_081DEDDE: + cmp r6, 0x4 + beq _081DEDF0 + ldr r0, [r4, 0x20] + ldr r1, [sp, 0x10] + strb r0, [r1] + b _081DEDFE + .pool +_081DEDF0: + ldr r2, [sp, 0x10] + ldrb r0, [r2] + movs r1, 0x8 + ands r1, r0 + ldr r0, [r4, 0x20] + orrs r0, r1 + strb r0, [r2] +_081DEDFE: + movs r0, 0xC0 + ldrb r1, [r4, 0x1A] + ands r0, r1 + adds r1, r4, 0 + adds r1, 0x21 + ldrb r1, [r1] + adds r0, r1, r0 + strb r0, [r4, 0x1A] + movs r2, 0xFF + ands r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] +_081DEE16: + movs r0, 0x1 + ldrb r2, [r4, 0x1D] + ands r0, r2 + cmp r0, 0 + beq _081DEE9C + ldr r1, =REG_NR51 + ldrb r0, [r1] + ldrb r2, [r4, 0x1C] + bics r0, r2 + ldrb r2, [r4, 0x1B] + orrs r0, r2 + strb r0, [r1] + cmp r6, 0x3 + bne _081DEE68 + ldr r0, =gCgb3Vol + ldrb r1, [r4, 0x9] + adds r0, r1, r0 + ldrb r0, [r0] + ldr r2, [sp, 0xC] + strb r0, [r2] + movs r1, 0x80 + adds r0, r1, 0 + ldrb r2, [r4, 0x1A] + ands r0, r2 + cmp r0, 0 + beq _081DEE9C + ldr r0, [sp, 0x8] + strb r1, [r0] + ldrb r0, [r4, 0x1A] + ldr r1, [sp, 0x14] + strb r0, [r1] + movs r0, 0x7F + ldrb r2, [r4, 0x1A] + ands r0, r2 + strb r0, [r4, 0x1A] + b _081DEE9C + .pool +_081DEE68: + movs r0, 0xF + mov r1, r8 + ands r1, r0 + mov r8, r1 + ldrb r2, [r4, 0x9] + lsls r0, r2, 4 + add r0, r8 + ldr r1, [sp, 0xC] + strb r0, [r1] + movs r2, 0x80 + ldrb r0, [r4, 0x1A] + orrs r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] + cmp r6, 0x1 + bne _081DEE9C + ldr r0, [sp, 0x8] + ldrb r1, [r0] + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + bne _081DEE9C + ldrb r0, [r4, 0x1A] + orrs r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] +_081DEE9C: + movs r0, 0 + strb r0, [r4, 0x1D] +_081DEEA0: + mov r6, r10 + mov r4, r9 + cmp r6, 0x4 + bgt _081DEEAA + b _081DEAA0 +_081DEEAA: + add sp, 0x1C + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r0} + bx r0 + thumb_func_end CgbSound + + .align 2, 0 @ Don't pad with nop. diff --git a/asm/rom1.s b/asm/rom1.s index ab78fa2eb..3c9838721 100644 --- a/asm/rom1.s +++ b/asm/rom1.s @@ -417,7 +417,7 @@ _0800057E: ldrh r4, [r5] movs r6, 0 strh r6, [r5] - bl SoundVSync_rev01 + bl m4aSoundVSync strh r4, [r5] ldr r4, _080005DC ldr r0, [r4, 0x20] @@ -579,7 +579,7 @@ DoSoftReset: @ 80006B4 ldr r1, _08000710 movs r0, 0 strh r0, [r1] - bl SoundVSyncOff_rev01 + bl m4aSoundVSyncOff bl remove_some_task ldr r1, _08000714 ldrh r2, [r1, 0xA] diff --git a/asm/rom3.s b/asm/rom3.s index f670af62d..ecba1f0b9 100644 --- a/asm/rom3.s +++ b/asm/rom3.s @@ -71034,7 +71034,7 @@ _0802D47C: ldr r1, _0802D4E4 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _0802D488: ldr r7, _0802D4E8 ldr r4, _0802D4EC @@ -71374,7 +71374,7 @@ sub_802D730: @ 802D730 ldr r1, _0802D78C movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl ldr r2, _0802D790 ldrb r1, [r4] lsls r0, r1, 1 @@ -71508,7 +71508,7 @@ c3_0802FDF4: @ 802D86C ldr r1, _0802D898 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl adds r0, r4, 0 bl DestroyTask _0802D88E: @@ -79191,9 +79191,9 @@ mplay_80342A4: @ 8031724 cmp r0, 0x1D bls _08031768 ldr r0, _08031774 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r0, _08031778 - bl MPlayStop_rev01 + bl m4aMPlayStop _08031764: cmp r5, 0 beq _0803177C @@ -82009,7 +82009,7 @@ _08032DE4: ldr r1, _08032E18 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08032DF0: ldr r2, _08032E1C ldrb r1, [r2] @@ -91138,7 +91138,7 @@ _080377F8: ldr r1, _0803782C movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08037804: ldr r2, _08037830 ldrb r1, [r2] @@ -122467,7 +122467,7 @@ _08046D5A: cmp r0, 0 beq _08046DAE ldr r0, _08046DA0 - bl MPlayStop_rev01 + bl m4aMPlayStop b _08046DAE .align 2, 0 _08046D90: .4byte 0x02024a6a @@ -122479,7 +122479,7 @@ _08046DA4: ldr r0, _08046DC8 ldr r1, _08046DCC movs r2, 0x80 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08046DAE: bl battle_type_is_double lsls r0, 24 @@ -136649,7 +136649,7 @@ sub_804E290: @ 804E290 subs r2, 0x80 lsls r2, 17 asrs r2, 16 - bl MPlayPitchControl + bl m4aMPlayPitchControl pop {r0} bx r0 .align 2, 0 @@ -140194,7 +140194,7 @@ _0804FFE4: lsls r1, 16 lsrs r1, 16 ldr r0, _08050030 - bl MPlayTempoControl + bl m4aMPlayTempoControl b _0805003E .align 2, 0 _08050018: .4byte 0x00002345 @@ -140208,7 +140208,7 @@ _08050034: ldr r0, _08050098 movs r1, 0x80 lsls r1, 1 - bl MPlayTempoControl + bl m4aMPlayTempoControl _0805003E: ldr r1, [sp] adds r1, 0x2 @@ -141475,7 +141475,7 @@ _080509B4: ldr r0, _080509C8 movs r1, 0x80 lsls r1, 1 - bl MPlayTempoControl + bl m4aMPlayTempoControl movs r4, 0 b _080509E4 .align 2, 0 @@ -141537,7 +141537,7 @@ _08050A32: movs r1, 0 strb r1, [r0] ldr r0, _08050A48 - bl MPlayStop_rev01 + bl m4aMPlayStop _08050A40: bl sub_804E290 b _08050CB6 diff --git a/asm/rom4.s b/asm/rom4.s index 1888b7858..ec32eece4 100644 --- a/asm/rom4.s +++ b/asm/rom4.s @@ -73977,7 +73977,7 @@ pause_music_for_sound_maybe: @ 8074E38 lsls r4, 24 lsrs r4, 24 ldr r0, _08074E60 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r0, _08074E64 lsls r4, 2 adds r4, r0 @@ -74163,7 +74163,7 @@ _08074F80: ldr r1, _08074FB4 adds r0, r4, 0 movs r2, 0 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl adds r0, r5, 0 bl m4aSongNumStop adds r0, r4, 0 @@ -74274,7 +74274,7 @@ cry_related: @ 8075044 ldr r0, _08075084 ldr r1, _08075088 movs r2, 0x55 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl lsls r4, 24 asrs r4, 24 movs r0, 0 @@ -74343,7 +74343,7 @@ _080750DA: ldr r0, _08075108 ldr r1, _0807510C movs r2, 0x55 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl lsls r1, r5, 24 asrs r1, 24 str r4, [sp] @@ -74398,7 +74398,7 @@ _0807513E: ldr r0, _08075170 ldr r1, _08075174 movs r2, 0x55 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08075154: lsls r1, r5, 24 asrs r1, 24 @@ -74431,7 +74431,7 @@ sub_8075178: @ 8075178 ldr r0, _080751B4 ldr r1, _080751B8 movs r2, 0x55 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl str r4, [sp] adds r0, r5, 0 movs r1, 0 @@ -74695,7 +74695,7 @@ sub_8075398: @ 8075398 push {lr} ldr r0, _080753AC ldr r0, [r0] - bl MPlayStop_rev01 + bl m4aMPlayStop bl sub_8000724 pop {r0} bx r0 @@ -74708,7 +74708,7 @@ sub_80753B0: @ 80753B0 push {lr} ldr r0, _080753C0 ldr r0, [r0] - bl MPlayStop_rev01 + bl m4aMPlayStop pop {r0} bx r0 .align 2, 0 @@ -74778,7 +74778,7 @@ _08075420: ldr r1, _0807544C movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl adds r0, r4, 0 bl DestroyTask _0807543E: @@ -74864,11 +74864,11 @@ audio_play_and_stuff: @ 80754A4 adds r0, r6, 0 adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl mov r0, r8 adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl pop {r3} mov r8, r3 pop {r4-r6} @@ -74897,7 +74897,7 @@ sub_80754F8: @ 80754F8 asrs r4, 24 adds r0, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl pop {r4,r5} pop {r0} bx r0 @@ -74923,7 +74923,7 @@ sub_807552C: @ 807552C asrs r4, 24 adds r0, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl pop {r4,r5} pop {r0} bx r0 @@ -74942,11 +74942,11 @@ sub_8075560: @ 8075560 asrs r4, 24 adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl ldr r0, _0807558C adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl pop {r4,r5} pop {r0} bx r0 @@ -75341,7 +75341,7 @@ _08075896: bne _08075894 ldr r0, _080758D4 movs r2, 0x80 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _080758AE: ldr r0, _080758D8 movs r1, 0 @@ -75936,9 +75936,9 @@ _08075D14: .4byte 0x03004af0 _08075D18: .4byte 0x0202f7b0 _08075D1C: ldr r0, _08075D98 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r0, _08075D9C - bl MPlayStop_rev01 + bl m4aMPlayStop _08075D28: ldr r1, _08075DA0 movs r0, 0 @@ -75976,7 +75976,7 @@ _08075D5A: ldr r1, _08075DA4 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl bl sub_8076BE0 lsls r0, 24 cmp r0, 0 @@ -79235,9 +79235,9 @@ ma20_wait_for_something: @ 8077684 cmp r0, 0x5A bls _080776D2 ldr r0, _080776C4 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r0, _080776C8 - bl MPlayStop_rev01 + bl m4aMPlayStop strh r5, [r4] b _080776F6 .align 2, 0 @@ -79746,9 +79746,9 @@ _08077A90: .4byte 0x02020004 ma2F_stop_music: @ 8077A94 push {lr} ldr r0, _08077AB0 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r0, _08077AB4 - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r1, _08077AB8 ldr r0, [r1] adds r0, 0x1 diff --git a/asm/rom5.s b/asm/rom5.s index 104b380ec..faa088118 100644 --- a/asm/rom5.s +++ b/asm/rom5.s @@ -36061,7 +36061,7 @@ _0808C4C4: ldr r0, _0808C538 ldr r1, _0808C53C movs r2, 0x80 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _0808C50C: add sp, 0x8 pop {r3} @@ -36964,7 +36964,7 @@ _0808CC7A: ldr r1, _0808CCC0 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _0808CC9C: pop {r4-r6} pop {r0} @@ -42677,7 +42677,7 @@ _0808FABC: b _0808FDDC _0808FACA: ldr r0, _0808FB0C - bl MPlayStop_rev01 + bl m4aMPlayStop ldr r5, _0808FB10 ldr r0, [r5] ldr r3, _0808FB14 @@ -71872,7 +71872,7 @@ sub_809E13C: @ 809E13C ldr r1, _0809E198 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl ldr r0, [r4, 0x4] bl SetMainCallback2 adds r0, r5, 0 @@ -108206,7 +108206,7 @@ _080AFDA2: lsls r2, r3, 24 asrs r2, 16 adds r0, r4, 0 - bl MPlayPitchControl + bl m4aMPlayPitchControl b _080AFE02 .align 2, 0 _080AFDE8: .4byte 0x02038696 @@ -256921,12 +256921,12 @@ _080F80F2: ldrh r2, [r6, 0x6] adds r0, r4, 0 adds r1, r5, 0 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl movs r0, 0x8 ldrsh r2, [r6, r0] adds r0, r4, 0 adds r1, r5, 0 - bl MPlayPitchControl + bl m4aMPlayPitchControl ldrh r0, [r6, 0xA] adds r0, 0x1 strh r0, [r6, 0xA] @@ -256957,7 +256957,7 @@ _080F8124: ldrh r2, [r6, 0x6] adds r0, r4, 0 adds r1, r5, 0 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl movs r2, 0x80 lsls r2, 2 adds r0, r2, 0 @@ -256968,14 +256968,14 @@ _080F8124: ldrsh r2, [r6, r0] adds r0, r4, 0 adds r1, r5, 0 - bl MPlayPitchControl + bl m4aMPlayPitchControl b _080F817A .align 2, 0 _080F8168: .4byte 0x03007400 _080F816C: .4byte 0x0000ffff _080F8170: ldr r0, _080F8180 - bl MPlayStop_rev01 + bl m4aMPlayStop movs r0, 0xFF _080F8178: strb r0, [r6, 0x3] @@ -323874,13 +323874,13 @@ _08118790: lsls r2, 24 asrs r2, 24 adds r1, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl ldr r0, _08118830 ldrh r2, [r6, 0x24] lsls r2, 24 asrs r2, 24 adds r1, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl _08118818: pop {r3} mov r8, r3 @@ -326388,11 +326388,11 @@ sub_8119BCC: @ 8119BCC asrs r4, 24 adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl ldr r0, _08119C58 adds r1, r5, 0 adds r2, r4, 0 - bl MPlayPanpotControl + bl m4aMPlayPanpotControl b _08119CF6 .align 2, 0 _08119C44: .4byte gUnknown_083FA64A @@ -410682,7 +410682,7 @@ _08142E98: ldr r1, _08142EBC movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08142EB2: ldr r0, _08142EC0 str r0, [r4] @@ -410705,7 +410705,7 @@ _08142EC4: ldr r1, _08142EFC movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl _08142EE6: ldr r0, _08142F00 lsls r1, r6, 2 @@ -420608,7 +420608,7 @@ sub_8147F08: @ 8147F08 ldr r1, _08147F44 movs r2, 0x80 lsls r2, 1 - bl MPlayVolumeControl + bl m4aMPlayVolumeControl ldr r0, _08147F48 ldr r0, [r0, 0x8] bl SetMainCallback2 diff --git a/constants/gba_constants.s b/constants/gba_constants.s index 46dfdcc2f..accd16007 100644 --- a/constants/gba_constants.s +++ b/constants/gba_constants.s @@ -15,7 +15,8 @@ .set IWRAM_START, 0x03000000 .set IWRAM_END, IWRAM_START + 0x8000 - .set INTR_VECTOR, IWRAM_END - 0x4 + .set SOUND_INFO_PTR, IWRAM_END - 0x10 + .set INTR_VECTOR, IWRAM_END - 0x4 .set INTR_FLAG_VBLANK, 1 << 0 .set INTR_FLAG_HBLANK, 1 << 1 @@ -32,6 +33,9 @@ .set INTR_FLAG_KEYPAD, 1 << 12 .set INTR_FLAG_GAMEPAK, 1 << 13 + .set VCOUNT_VBLANK, 160 + .set TOTAL_SCANLINES, 228 + .set REG_BASE, 0x4000000 @ I/O register base address @ I/O register offsets @@ -79,22 +83,43 @@ .set OFFSET_REG_SOUND1CNT, 0x60 .set OFFSET_REG_SOUND1CNT_L, 0x60 + .set OFFSET_REG_NR10, 0x60 .set OFFSET_REG_SOUND1CNT_H, 0x62 + .set OFFSET_REG_NR11, 0x62 + .set OFFSET_REG_NR12, 0x63 .set OFFSET_REG_SOUND1CNT_X, 0x64 + .set OFFSET_REG_NR13, 0x64 + .set OFFSET_REG_NR14, 0x65 .set OFFSET_REG_SOUND2CNT, 0x68 .set OFFSET_REG_SOUND2CNT_L, 0x68 + .set OFFSET_REG_NR21, 0x68 + .set OFFSET_REG_NR22, 0x69 .set OFFSET_REG_SOUND2CNT_H, 0x6c + .set OFFSET_REG_NR23, 0x6c + .set OFFSET_REG_NR24, 0x6d .set OFFSET_REG_SOUND3CNT, 0x70 .set OFFSET_REG_SOUND3CNT_L, 0x70 + .set OFFSET_REG_NR30, 0x70 .set OFFSET_REG_SOUND3CNT_H, 0x72 + .set OFFSET_REG_NR31, 0x72 + .set OFFSET_REG_NR32, 0x73 .set OFFSET_REG_SOUND3CNT_X, 0x74 + .set OFFSET_REG_NR33, 0x74 + .set OFFSET_REG_NR34, 0x75 .set OFFSET_REG_SOUND4CNT, 0x78 .set OFFSET_REG_SOUND4CNT_L, 0x78 + .set OFFSET_REG_NR41, 0x78 + .set OFFSET_REG_NR42, 0x79 .set OFFSET_REG_SOUND4CNT_H, 0x7c + .set OFFSET_REG_NR43, 0x7c + .set OFFSET_REG_NR44, 0x7d .set OFFSET_REG_SOUNDCNT, 0x80 .set OFFSET_REG_SOUNDCNT_L, 0x80 + .set OFFSET_REG_NR50, 0x80 + .set OFFSET_REG_NR51, 0x81 .set OFFSET_REG_SOUNDCNT_H, 0x82 .set OFFSET_REG_SOUNDCNT_X, 0x84 + .set OFFSET_REG_NR52, 0x84 .set OFFSET_REG_SOUNDBIAS, 0x88 .set OFFSET_REG_WAVE_RAM, 0x90 .set OFFSET_REG_WAVE_RAM0, 0x90 @@ -246,22 +271,43 @@ .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L + .set REG_NR10, REG_BASE + OFFSET_REG_NR10 .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H + .set REG_NR11, REG_BASE + OFFSET_REG_NR11 + .set REG_NR12, REG_BASE + OFFSET_REG_NR12 .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X + .set REG_NR13, REG_BASE + OFFSET_REG_NR13 + .set REG_NR14, REG_BASE + OFFSET_REG_NR14 .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L + .set REG_NR21, REG_BASE + OFFSET_REG_NR21 + .set REG_NR22, REG_BASE + OFFSET_REG_NR22 .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H + .set REG_NR23, REG_BASE + OFFSET_REG_NR23 + .set REG_NR24, REG_BASE + OFFSET_REG_NR24 .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L + .set REG_NR30, REG_BASE + OFFSET_REG_NR30 .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H + .set REG_NR31, REG_BASE + OFFSET_REG_NR31 + .set REG_NR32, REG_BASE + OFFSET_REG_NR32 .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X + .set REG_NR33, REG_BASE + OFFSET_REG_NR33 + .set REG_NR34, REG_BASE + OFFSET_REG_NR34 .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L + .set REG_NR41, REG_BASE + OFFSET_REG_NR41 + .set REG_NR42, REG_BASE + OFFSET_REG_NR42 .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H + .set REG_NR43, REG_BASE + OFFSET_REG_NR43 + .set REG_NR44, REG_BASE + OFFSET_REG_NR44 .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L + .set REG_NR50, REG_BASE + OFFSET_REG_NR50 + .set REG_NR51, REG_BASE + OFFSET_REG_NR51 .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X + .set REG_NR52, REG_BASE + OFFSET_REG_NR52 .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0 @@ -368,6 +414,26 @@ .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT +@ DMA register constants + + .set DMA_DEST_INC, 0x0000 + .set DMA_DEST_DEC, 0x0020 + .set DMA_DEST_FIXED, 0x0040 + .set DMA_DEST_RELOAD, 0x0060 + .set DMA_SRC_INC, 0x0000 + .set DMA_SRC_DEC, 0x0080 + .set DMA_SRC_FIXED, 0x0100 + .set DMA_REPEAT, 0x0200 + .set DMA_16BIT, 0x0000 + .set DMA_32BIT, 0x0400 + .set DMA_DREQ_ON, 0x0800 + .set DMA_START_NOW, 0x0000 + .set DMA_START_VBLANK, 0x1000 + .set DMA_START_HBLANK, 0x2000 + .set DMA_START_SPECIAL, 0x3000 + .set DMA_INTR_ENABLE, 0x4000 + .set DMA_ENABLE, 0x8000 + @ OAM attribute constants .set OAM_OBJ_NORMAL, 0x00000000 diff --git a/constants/m4a_constants.s b/constants/m4a_constants.s new file mode 100644 index 000000000..4b05bc63d --- /dev/null +++ b/constants/m4a_constants.s @@ -0,0 +1,127 @@ + .equiv ID_NUMBER, 0x68736d53 + + .equiv PCM_DMA_BUF_SIZE, 1584 + + .macro struct_begin + .struct 0 + .endm + + .macro struct_field name, size +\name: + .struct \name + \size + .endm + + struct_begin + struct_field o_SoundInfo_ident, 4 + struct_field o_SoundInfo_pcmDmaCounter, 1 + struct_field o_SoundInfo_reverb, 1 + struct_field o_SoundInfo_maxChans, 1 + struct_field o_SoundInfo_masterVolume, 1 + struct_field o_SoundInfo_freq, 1 + struct_field o_SoundInfo_mode, 1 + struct_field o_SoundInfo_c15, 1 + struct_field o_SoundInfo_pcmDmaPeriod, 1 + struct_field o_SoundInfo_maxLines, 1 + struct_field o_SoundInfo_gap, 3 + struct_field o_SoundInfo_pcmSamplesPerVBlank, 4 + struct_field o_SoundInfo_pcmFreq, 4 + struct_field o_SoundInfo_divFreq, 4 + struct_field o_SoundInfo_cgbChans, 4 + struct_field o_SoundInfo_func, 4 + struct_field o_SoundInfo_intp, 4 + struct_field o_SoundInfo_CgbSound, 4 + struct_field o_SoundInfo_CgbOscOff, 4 + struct_field o_SoundInfo_MidiKeyToCgbFreq, 4 + struct_field o_SoundInfo_MPlayJumpTable, 4 + struct_field o_SoundInfo_plynote, 4 + struct_field o_SoundInfo_ExtVolPit, 4 + struct_field o_SoundInfo_gap2, 16 + struct_field o_SoundInfo_chans, 768 + struct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2 + struct_field SoundInfo_size, 0 + + struct_begin + struct_field o_SoundChannel_status, 1 + struct_field o_SoundChannel_type, 1 + struct_field o_SoundChannel_rightVolume, 1 + struct_field o_SoundChannel_leftVolume, 1 + struct_field o_SoundChannel_attack, 1 + struct_field o_SoundChannel_decay, 1 + struct_field o_SoundChannel_sustain, 1 + struct_field o_SoundChannel_release, 1 + struct_field o_SoundChannel_ky, 1 + struct_field o_SoundChannel_ev, 1 + struct_field o_SoundChannel_er, 1 + struct_field o_SoundChannel_el, 1 + struct_field o_SoundChannel_iev, 1 + struct_field o_SoundChannel_iel, 1 + struct_field o_SoundChannel_d1, 1 + struct_field o_SoundChannel_d2, 1 + struct_field o_SoundChannel_gt, 1 + struct_field o_SoundChannel_mk, 1 + struct_field o_SoundChannel_ve, 1 + struct_field o_SoundChannel_pr, 1 + struct_field o_SoundChannel_rp, 1 + struct_field o_SoundChannel_d3, 3 + struct_field o_SoundChannel_ct, 4 + struct_field o_SoundChannel_fw, 4 + struct_field o_SoundChannel_freq, 4 + struct_field o_SoundChannel_wav, 4 + struct_field o_SoundChannel_cp, 4 + struct_field o_SoundChannel_track, 4 + struct_field o_SoundChannel_pp, 4 + struct_field o_SoundChannel_np, 4 + struct_field o_SoundChannel_d4, 4 + struct_field o_SoundChannel_xpi, 2 + struct_field o_SoundChannel_xpc, 2 + struct_field SoundChannel_size, 0 + + struct_begin + struct_field o_MusicPlayerTrack_flags, 1 + struct_field o_MusicPlayerTrack_wai, 1 + struct_field o_MusicPlayerTrack_patP, 1 + struct_field o_MusicPlayerTrack_repN, 1 + struct_field o_MusicPlayerTrack_gat, 1 + struct_field o_MusicPlayerTrack_key, 1 + struct_field o_MusicPlayerTrack_vel, 1 + struct_field o_MusicPlayerTrack_run, 1 + struct_field o_MusicPlayerTrack_keyM, 1 + struct_field o_MusicPlayerTrack_pitM, 1 + struct_field o_MusicPlayerTrack_keyShift, 1 + struct_field o_MusicPlayerTrack_keyShiftX, 1 + struct_field o_MusicPlayerTrack_tune, 1 + struct_field o_MusicPlayerTrack_pitX, 1 + struct_field o_MusicPlayerTrack_bend, 1 + struct_field o_MusicPlayerTrack_bendRange, 1 + struct_field o_MusicPlayerTrack_volMR, 1 + struct_field o_MusicPlayerTrack_volML, 1 + struct_field o_MusicPlayerTrack_vol, 1 + struct_field o_MusicPlayerTrack_volX, 1 + struct_field o_MusicPlayerTrack_pan, 1 + struct_field o_MusicPlayerTrack_panX, 1 + struct_field o_MusicPlayerTrack_modM, 1 + struct_field o_MusicPlayerTrack_mod, 1 + struct_field o_MusicPlayerTrack_modT, 1 + struct_field o_MusicPlayerTrack_lfoSpeed, 1 + struct_field o_MusicPlayerTrack_lfoSpeedC, 1 + struct_field o_MusicPlayerTrack_lfoDelay, 1 + struct_field o_MusicPlayerTrack_lfoDelayC, 1 + struct_field o_MusicPlayerTrack_priority, 1 + struct_field o_MusicPlayerTrack_echoVolume, 1 + struct_field o_MusicPlayerTrack_echoLength, 1 + struct_field o_MusicPlayerTrack_chan, 4 + struct_field o_MusicPlayerTrack_ToneData_type, 1 + struct_field o_MusicPlayerTrack_ToneData_key, 1 + struct_field o_MusicPlayerTrack_ToneData_length, 1 + struct_field o_MusicPlayerTrack_ToneData_pan_sweep, 1 + struct_field o_MusicPlayerTrack_ToneData_wav, 4 + struct_field o_MusicPlayerTrack_ToneData_attack, 1 + struct_field o_MusicPlayerTrack_ToneData_decay, 1 + struct_field o_MusicPlayerTrack_ToneData_sustain, 1 + struct_field o_MusicPlayerTrack_ToneData_release, 1 + struct_field o_MusicPlayerTrack_gap, 10 + struct_field o_MusicPlayerTrack_unk_3A, 2 + struct_field o_MusicPlayerTrack_unk_3C, 4 + struct_field o_MusicPlayerTrack_cmdPtr, 4 + struct_field o_MusicPlayerTrack_patS, 12 + struct_field MusicPlayerTrack_size, 0 diff --git a/data/data2.s b/data/data2.s index 987f20017..379106496 100644 --- a/data/data2.s +++ b/data/data2.s @@ -10416,91 +10416,3 @@ gUnknown_0842F8E5: @ 842F8E5 .global gUnknown_0842F93A gUnknown_0842F93A: @ 842F93A .incbin "baserom.gba", 0x0042f93a, 0x2a - - .global gUnknown_0842F964 -gUnknown_0842F964: @ 842F964 - .incbin "baserom.gba", 0x0042f964, 0x90 - - .global gUnknown_0842F9F4 -gUnknown_0842F9F4: @ 842F9F4 - .incbin "baserom.gba", 0x0042f9f4, 0x10 - - .global gUnknown_0842FA04 -gUnknown_0842FA04: @ 842FA04 - .incbin "baserom.gba", 0x0042fa04, 0xb4 - - .global gUnknown_0842FAB8 -gUnknown_0842FAB8: @ 842FAB8 - .incbin "baserom.gba", 0x0042fab8, 0x30 - - .global gUnknown_0842FAE8 -gUnknown_0842FAE8: @ 842FAE8 - .incbin "baserom.gba", 0x0042fae8, 0x18 - - .global gUnknown_0842FB00 -gUnknown_0842FB00: @ 842FB00 - .incbin "baserom.gba", 0x0042fb00, 0x84 - - .global gUnknown_0842FB84 -gUnknown_0842FB84: @ 842FB84 - .incbin "baserom.gba", 0x0042fb84, 0x18 - - .global gUnknown_0842FB9C -gUnknown_0842FB9C: @ 842FB9C - .incbin "baserom.gba", 0x0042fb9c, 0x3c - - .global gUnknown_0842FBD8 -gUnknown_0842FBD8: @ 842FBD8 - .incbin "baserom.gba", 0x0042fbd8, 0x10 - - .global gUnknown_0842FBE8 -gUnknown_0842FBE8: @ 842FBE8 - .incbin "baserom.gba", 0x0042fbe8, 0x34 - - .global gUnknown_0842FC1C -gUnknown_0842FC1C: @ 842FC1C - .incbin "baserom.gba", 0x0042fc1c, 0x34 - - .global gUnknown_0842FC50 -gUnknown_0842FC50: @ 842FC50 - .incbin "baserom.gba", 0x0042fc50, 0x22940 - - .global gUnknown_08452590 -gUnknown_08452590: @ 8452590 - .incbin "baserom.gba", 0x00452590, 0x600 - - .global gUnknown_08452B90 -gUnknown_08452B90: @ 8452B90 - .incbin "baserom.gba", 0x00452b90, 0x600 - - .global gUnknown_08453190 -gUnknown_08453190: @ 8453190 - .incbin "baserom.gba", 0x00453190, 0x600 - - .global gUnknown_08453790 -gUnknown_08453790: @ 8453790 - .incbin "baserom.gba", 0x00453790, 0x30 - - .global gUnknown_084537C0 -gUnknown_084537C0: @ 84537C0 - .incbin "baserom.gba", 0x004537c0, 0x600 - - .global gUnknown_08453DC0 -gUnknown_08453DC0: @ 8453DC0 - .incbin "baserom.gba", 0x00453dc0, 0x600 - - .global gUnknown_084543C0 -gUnknown_084543C0: @ 84543C0 - .incbin "baserom.gba", 0x004543c0, 0x600 - - .global gUnknown_084549C0 -gUnknown_084549C0: @ 84549C0 - .incbin "baserom.gba", 0x004549c0, 0xa9c - - .global gUnknown_0845545C -gUnknown_0845545C: @ 845545C - .incbin "baserom.gba", 0x0045545c, 0x30 - - .global gUnknown_0845548C -gUnknown_0845548C: @ 845548C - .incbin "baserom.gba", 0x0045548c, 0x25B29C diff --git a/data/sound_data.s b/data/sound_data.s new file mode 100644 index 000000000..d98ac4f50 --- /dev/null +++ b/data/sound_data.s @@ -0,0 +1,45 @@ + .section .rodata + + .global gUnknown_0842FC88 +gUnknown_0842FC88: @ 842FC88 + .incbin "baserom.gba", 0x0042FC88, 0x22908 + + .global gUnknown_08452590 +gUnknown_08452590: @ 8452590 + .incbin "baserom.gba", 0x00452590, 0x600 + + .global gUnknown_08452B90 +gUnknown_08452B90: @ 8452B90 + .incbin "baserom.gba", 0x00452b90, 0x600 + + .global gUnknown_08453190 +gUnknown_08453190: @ 8453190 + .incbin "baserom.gba", 0x00453190, 0x600 + + .global gUnknown_08453790 +gUnknown_08453790: @ 8453790 + .incbin "baserom.gba", 0x00453790, 0x30 + + .global gUnknown_084537C0 +gUnknown_084537C0: @ 84537C0 + .incbin "baserom.gba", 0x004537c0, 0x600 + + .global gUnknown_08453DC0 +gUnknown_08453DC0: @ 8453DC0 + .incbin "baserom.gba", 0x00453dc0, 0x600 + + .global gUnknown_084543C0 +gUnknown_084543C0: @ 84543C0 + .incbin "baserom.gba", 0x004543c0, 0x600 + + .global gUnknown_084549C0 +gUnknown_084549C0: @ 84549C0 + .incbin "baserom.gba", 0x004549c0, 0xa9c + + .global gMPlayTable +gMPlayTable: @ 845545C + .incbin "baserom.gba", 0x0045545c, 0x30 + + .global gSongTable +gSongTable: @ 845548C + .incbin "baserom.gba", 0x0045548c, 0x25B29C diff --git a/include/gba/gba.h b/include/gba/gba.h index 10b2ffa43..9cacbfee0 100644 --- a/include/gba/gba.h +++ b/include/gba/gba.h @@ -27,6 +27,11 @@ typedef u32 bool32; #define TRUE 1 #define FALSE 0 +#define IWRAM_DATA __attribute__((section("iwram_data"))) +#define EWRAM_DATA __attribute__((section("ewram_data"))) + +#define ALIGNED(n) __attribute__((aligned(n))) + #include "gba/io_reg.h" #include "gba/syscall.h" #include "gba/macro.h" diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 92dd49a01..e29441f19 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -447,6 +447,26 @@ #define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled #define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled +// SOUNDCNT_H +#define SOUND_CGB_MIX_QUARTER 0x0000 +#define SOUND_CGB_MIX_HALF 0x0001 +#define SOUND_CGB_MIX_FULL 0x0002 +#define SOUND_A_MIX_HALF 0x0000 +#define SOUND_A_MIX_FULL 0x0004 +#define SOUND_B_MIX_HALF 0x0000 +#define SOUND_B_MIX_FULL 0x0008 +#define SOUND_ALL_MIX_FULL 0x000E +#define SOUND_A_RIGHT_OUTPUT 0x0100 +#define SOUND_A_LEFT_OUTPUT 0x0200 +#define SOUND_A_TIMER_0 0x0000 +#define SOUND_A_TIMER_1 0x0400 +#define SOUND_A_FIFO_RESET 0x0800 +#define SOUND_B_RIGHT_OUTPUT 0x1000 +#define SOUND_B_LEFT_OUTPUT 0x2000 +#define SOUND_B_TIMER_0 0x0000 +#define SOUND_B_TIMER_1 0x4000 +#define SOUND_B_FIFO_RESET 0x8000 + // SOUNDCNT_X #define SOUND_1_ON 0x0001 #define SOUND_2_ON 0x0002 diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h new file mode 100644 index 000000000..c09cde31f --- /dev/null +++ b/include/gba/m4a_internal.h @@ -0,0 +1,442 @@ +#include "gba/gba.h" + +// ASCII encoding of 'Smsh' in reverse +// This is presumably short for SMASH, the developer of MKS4AGB. +#define ID_NUMBER 0x68736D53 + +#define C_V 0x40 // center value for PAN, BEND, and TUNE + +#define SOUND_MODE_REVERB_VAL 0x0000007F +#define SOUND_MODE_REVERB_SET 0x00000080 +#define SOUND_MODE_MAXCHN 0x00000F00 +#define SOUND_MODE_MAXCHN_SHIFT 8 +#define SOUND_MODE_MASVOL 0x0000F000 +#define SOUND_MODE_MASVOL_SHIFT 12 +#define SOUND_MODE_FREQ_05734 0x00010000 +#define SOUND_MODE_FREQ_07884 0x00020000 +#define SOUND_MODE_FREQ_10512 0x00030000 +#define SOUND_MODE_FREQ_13379 0x00040000 +#define SOUND_MODE_FREQ_15768 0x00050000 +#define SOUND_MODE_FREQ_18157 0x00060000 +#define SOUND_MODE_FREQ_21024 0x00070000 +#define SOUND_MODE_FREQ_26758 0x00080000 +#define SOUND_MODE_FREQ_31536 0x00090000 +#define SOUND_MODE_FREQ_36314 0x000A0000 +#define SOUND_MODE_FREQ_40137 0x000B0000 +#define SOUND_MODE_FREQ_42048 0x000C0000 +#define SOUND_MODE_FREQ 0x000F0000 +#define SOUND_MODE_FREQ_SHIFT 16 +#define SOUND_MODE_DA_BIT_9 0x00800000 +#define SOUND_MODE_DA_BIT_8 0x00900000 +#define SOUND_MODE_DA_BIT_7 0x00A00000 +#define SOUND_MODE_DA_BIT_6 0x00B00000 +#define SOUND_MODE_DA_BIT 0x00B00000 +#define SOUND_MODE_DA_BIT_SHIFT 20 + +struct WaveData +{ + u16 type; + u16 status; + u32 freq; + u32 loopStart; + u32 size; // number of samples + s8 data[1]; // samples +}; + +#define TONEDATA_TYPE_CGB 0x07 +#define TONEDATA_TYPE_FIX 0x08 +#define TONEDATA_TYPE_SPL 0x40 +#define TONEDATA_TYPE_RHY 0x80 + +#define TONEDATA_P_S_PAN 0xc0 +#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN + +struct ToneData +{ + u8 type; + u8 key; + u8 length; // sound length (compatible sound) + u8 pan_sweep; // pan or sweep (compatible sound ch. 1) + struct WaveData *wav; + u8 attack; + u8 decay; + u8 sustain; + u8 release; +}; + +struct CgbChannel +{ + u8 sf; + u8 ty; + u8 rightVolume; + u8 leftVolume; + u8 at; + u8 de; + u8 su; + u8 re; + u8 ky; + u8 ev; + u8 eg; + u8 ec; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u8 d5; + u8 sg; + u8 n4; + u8 pan; + u8 panMask; + u8 mo; + u8 le; + u8 sw; + u32 fr; + u32 wp; + u32 cp; + u32 tp; + u32 pp; + u32 np; + u8 d4[8]; +}; + +struct MusicPlayerTrack; + +struct SoundChannel +{ + u8 status; + u8 type; + u8 rightVolume; + u8 leftVolume; + u8 attack; + u8 decay; + u8 sustain; + u8 release; + u8 ky; + u8 ev; + u8 er; + u8 el; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u32 ct; + u32 fw; + u32 freq; + struct WaveData *wav; + u32 cp; + struct MusicPlayerTrack *track; + u32 pp; + u32 np; + u32 d4; + u16 xpi; + u16 xpc; +}; + +#define MAX_DIRECTSOUND_CHANNELS 12 + +#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer + +struct SoundInfo +{ + // This field is normally equal to ID_NUMBER but it is set to other + // values during sensitive operations for locking purposes. + // This field should be volatile but isn't. This could potentially cause + // race conditions. + u32 ident; + + vu8 pcmDmaCounter; + + // Direct Sound + u8 reverb; + u8 maxChans; + u8 masterVolume; + u8 freq; + + u8 mode; + u8 c15; + u8 pcmDmaPeriod; // number of V-blanks per PCM DMA + u8 maxLines; + u8 gap[3]; + s32 pcmSamplesPerVBlank; + s32 pcmFreq; + s32 divFreq; + struct CgbChannel *cgbChans; + u32 func; + u32 intp; + void (*CgbSound)(void); + void (*CgbOscOff)(u8); + u32 (*MidiKeyToCgbFreq)(u8, u8, u8); + u32 MPlayJumpTable; + u32 plynote; + u32 ExtVolPit; + u8 gap2[16]; + struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; + s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; +}; + +struct SongHeader +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[1]; +}; + +struct PokemonCrySong +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[2]; + u8 gap; + u8 part0; // 0x11 + u8 tuneValue; // 0x12 + u8 gotoCmd; // 0x13 + u32 gotoTarget; // 0x14 + u8 part1; // 0x18 + u8 tuneValue2; // 0x19 + u8 cont[2]; // 0x1A + u8 volCmd; // 0x1C + u8 volumeValue; // 0x1D + u8 unkCmd0D[2]; // 0x1E + u32 unkCmd0DParam; // 0x20 + u8 xreleCmd[2]; // 0x24 + u8 releaseValue; // 0x26 + u8 panCmd; + u8 panValue; // 0x28 + u8 tieCmd; // 0x29 + u8 tieKeyValue; // 0x2A + u8 tieVelocityValue; // 0x2B + u8 unkCmd0C[2]; // 0x2C + u16 unkCmd0CParam; // 0x2E + u8 end[2]; // 0x30 +}; + +#define MPT_FLG_VOLSET 0x01 +#define MPT_FLG_VOLCHG 0x03 +#define MPT_FLG_PITSET 0x04 +#define MPT_FLG_PITCHG 0x0C +#define MPT_FLG_START 0x40 +#define MPT_FLG_EXIST 0x80 + +struct MusicPlayerTrack +{ + u8 flags; + u8 wai; + u8 patP; + u8 repN; + u8 gat; + u8 key; + u8 vel; + u8 run; + u8 keyM; + u8 pitM; + s8 keyShift; + s8 keyShiftX; + s8 tune; + u8 pitX; + s8 bend; + u8 bendRange; + u8 volMR; + u8 volML; + u8 vol; + u8 volX; + s8 pan; + s8 panX; + s8 modM; + u8 mod; + u8 modT; + u8 lfoSpeed; + u8 lfoSpeedC; + u8 lfoDelay; + u8 lfoDelayC; + u8 priority; + u8 echoVolume; + u8 echoLength; + struct SoundChannel *chan; + struct ToneData tone; + u8 gap[10]; + u16 unk_3A; + u32 unk_3C; + u8 *cmdPtr; + u8 patS[12]; +}; + +#define MUSICPLAYER_STATUS_TRACK 0x0000ffff +#define MUSICPLAYER_STATUS_PAUSE 0x80000000 + +#define MAX_MUSICPLAYER_TRACKS 16 + +#define STOP_AFTER_FADE 0x0001 +#define FADE_IN 0x0002 +#define FADE_VOL_MAX 64 +#define FADE_VOL_SHIFT 2 + +struct MusicPlayerInfo +{ + struct SongHeader *songHeader; + u32 status; + u8 trackCount; + u8 priority; + u8 cmd; + u8 unk_B; + u32 clock; + u8 gap[8]; + u8 *memAccArea; + u16 tempoD; + u16 tempoU; + u16 tempoI; + u16 tempoC; + u16 fadeOI; + u16 fadeOC; + u16 fadeOV; + struct MusicPlayerTrack *tracks; + struct ToneData *tone; + u32 ident; + u32 func; + u32 intp; +}; + +struct MusicPlayer +{ + struct MusicPlayerInfo *info; + struct MusicPlayerTrack *track; + u8 unk_8; + u16 unk_A; +}; + +struct Song +{ + struct SongHeader *header; + u16 ms; + u16 me; +}; + +extern const struct MusicPlayer gMPlayTable[]; +extern const struct Song gSongTable[]; + + + +extern u8 gMPlayMemAccArea[]; + +//u8 gPokemonCrySong[52]; +//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES]; + +#define MAX_POKEMON_CRIES 2 + +extern struct PokemonCrySong gPokemonCrySong; +extern struct PokemonCrySong gPokemonCrySongs[]; + +extern struct MusicPlayerInfo gPokemonCryMusicPlayers[]; +extern struct MusicPlayerTrack gPokemonCryTracks[]; + +extern char SoundMainRAM[]; + +extern void *gMPlayJumpTable[]; + +typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +extern const XcmdFunc gXcmdTable[]; + +extern struct CgbChannel gCgbChans[]; + +extern const u8 gScaleTable[]; +extern const u32 gFreqTable[]; +extern const u16 gPcmSamplesPerVBlankTable[]; + +extern const u8 gCgbScaleTable[]; +extern const s16 gCgbFreqTable[]; +extern const u8 gNoiseTable[]; + +extern const struct PokemonCrySong gPokemonCrySongTemplate; + +extern const struct ToneData gUnknown_0842FC88; + +extern char gNumMusicPlayers[]; +extern char gMaxLines[]; + +#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers) +#define MAX_LINES ((u32)gMaxLines) + +u32 umul3232H32(u32 multiplier, u32 multiplicand); +void SoundMain(void); +void SoundMainBTM(void); +void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayMain(void); +void RealClearChain(void *x); + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo); +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader); +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); +void FadeOutBody(struct MusicPlayerInfo *mplayInfo); +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed); +void ClearChain(void *x); +void Clear64byte(void *addr); +void SoundInit(struct SoundInfo *soundInfo); +void MPlayExtender(struct CgbChannel *cgbChans); +void m4aSoundMode(u32 mode); +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3); +void CgbSound(void); +void CgbOscOff(u8); +u32 MidiKeyToCgbFreq(u8, u8, u8); +void DummyFunc(void); +void MPlayJumpTableCopy(void **mplayJumpTable); +void SampleFreqSet(u32 freq); +void m4aSoundVSyncOn(void); +void m4aSoundVSyncOff(void); + +// sound command handler functions +void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + +// extended sound command handler functions +void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *); diff --git a/iwram_syms.txt b/iwram_syms.txt index 308762876..cfe24cf57 100644 --- a/iwram_syms.txt +++ b/iwram_syms.txt @@ -1,3 +1,5 @@ +/* .bss starts at 0x3000000 */ + gRtcErrorStatus = 0x3000458; gRtc = 0x3000460; gRtcProbeResult = 0x300046C; @@ -5,12 +7,9 @@ gRtcSavedIme = 0x300046E; gPlayTimeCounterState = 0x300057C; -sTimerNum = 0x3000F28; -sTimerCount = 0x3000F2A; -sTimerReg = 0x3000F2C; -sSavedIme = 0x3000F30; +/* .bss.code starts at 0x3000F60 */ -gSiiRtcLocked = 0x3000F36; +/* COMMON starts at 0x3001760 */ gUnknownStringVar = 0x3002900; @@ -18,6 +17,8 @@ gLocalTime = 0x3004038; gTasks = 0x3004B20; +gMPlayMemAccArea = 0x3007440; + gFlashTimeoutFlag = 0x3007490; PollFlashStatus = 0x3007494; WaitForFlashWrite = 0x3007498; diff --git a/ld_script.txt b/ld_script.txt index dc45c7c27..ec1555c37 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -1,12 +1,22 @@ ENTRY(Start) +gNumMusicPlayers = 4; +gMaxLines = 60; + SECTIONS { - .bss : + . = 0x3000000; + + iwram (NOLOAD) : ALIGN(4) { - . = 0x3000F38; + . = 0xF28; + src/agb_flash.o(.bss); + src/siirtc.o(.bss); tools/agbcc/lib/libgcc.a:dp-bit.o(.bss); tools/agbcc/lib/libgcc.a:fp-bit.o(.bss); + src/m4a_2.o(.bss.code); + . = 0x5FD0; + src/m4a_2.o(iwram_data); } . = 0x8000000; @@ -36,7 +46,10 @@ SECTIONS { ALIGN(4) { asm/libgcnmultiboot.o(.text); - asm/libmks4agb.o(.text); + asm/m4a_1.o(.text); + src/m4a_2.o(.text); + asm/m4a_3.o(.text); + src/m4a_4.o(.text); src/agb_flash.o(.text); src/agb_flash_1m.o(.text); src/agb_flash_mx.o(.text); @@ -63,6 +76,8 @@ SECTIONS { ALIGN(4) { data/data2.o(.rodata); + src/m4a_tables.o(.rodata); + data/sound_data.o(.rodata); src/agb_flash.o(.rodata); src/agb_flash_1m.o(.rodata); src/agb_flash_mx.o(.rodata); diff --git a/src/agb_flash.c b/src/agb_flash.c index 834b80842..e3ac96623 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -1,10 +1,10 @@ #include "gba/gba.h" #include "gba/flash_internal.h" -extern u8 sTimerNum; -extern u16 sTimerCount; -extern vu16 *sTimerReg; -extern u16 sSavedIme; +static u8 sTimerNum; +static u16 sTimerCount; +static vu16 *sTimerReg; +static u16 sSavedIme; extern u8 gFlashTimeoutFlag; extern u8 (*PollFlashStatus)(u8 *); diff --git a/src/m4a_2.c b/src/m4a_2.c new file mode 100644 index 000000000..b41574c23 --- /dev/null +++ b/src/m4a_2.c @@ -0,0 +1,911 @@ +#include "gba/m4a_internal.h" + +#define BSS_CODE __attribute__((section(".bss.code"))) + +BSS_CODE char SoundMainRAM_Buffer[0x800] = {0}; + +IWRAM_DATA struct SoundInfo gSoundInfo = {0}; +IWRAM_DATA struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES] = {0}; +IWRAM_DATA u8 gUnused_3006FE8[8] = {0}; // padding for alignment +IWRAM_DATA struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES] = {0}; +IWRAM_DATA void *gMPlayJumpTable[36] = {0}; +IWRAM_DATA struct CgbChannel gCgbChans[4] = {0}; +IWRAM_DATA struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2] = {0}; +IWRAM_DATA struct PokemonCrySong gPokemonCrySong = {0}; + +u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) +{ + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) + { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void UnusedDummyFunc() +{ +} + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) +{ + s32 i; + + CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 + | SOUND_MODE_FREQ_13379 + | (12 << SOUND_MODE_MASVOL_SHIFT) + | (5 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + { + struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } + + memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + MPlayOpen(mplayInfo, track, 2); + track->chan = 0; + } +} + +void m4aSoundMain(void) +{ + SoundMain(); +} + +void m4aSongNumStart(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + { + MPlayStart(mplay->info, song->header); + } + else + { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) + { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + +void m4aSongNumStop(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + m4aMPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + m4aMPlayStop(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + m4aMPlayStop(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + MPlayContinue(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + MPlayFadeOut(mplayInfo, speed); +} + +void sub_81DE0D0(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | STOP_AFTER_FADE; + mplayInfo->ident = ID_NUMBER; + } +} + +void sub_81DE0F0(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) +{ + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack *track = mplayInfo->tracks; + + while (trackCount > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + if (track->flags & MPT_FLG_START) + { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} + +void MPlayExtender(struct CgbChannel *cgbChans) +{ + struct SoundInfo *soundInfo; + u32 ident; + register u32 maxLines asm("r0"); + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = (struct CgbChannel *)cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + + maxLines = MAX_LINES; + soundInfo->maxLines = maxLines; + + CpuFill32(cgbChans, 0, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) +{ + asm("swi 0x2A"); +} + +void ClearChain(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo *soundInfo) +{ + soundInfo->ident = 0; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; + + REG_DMA1SAD = (s32)soundInfo->pcmBuffer; + REG_DMA1DAD = (s32)®_FIFO_A; + REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (s32)®_FIFO_B; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(soundInfo, 0, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = (u32)ply_note; + soundInfo->CgbSound = DummyFunc; + soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; + soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; + soundInfo->ExtVolPit = (u32)DummyFunc; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + // Turn off timer 0. + REG_TM0CNT_H = 0; + + // cycles per LCD fresh 280896 + REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); + + m4aSoundVSyncOn(); + + while (*(vu8 *)REG_ADDR_VCOUNT == 159) + ; + + while (*(vu8 *)REG_ADDR_VCOUNT != 159) + ; + + REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; +} + +void m4aSoundMode(u32 mode) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) + { + struct SoundChannel *chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) + { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) + { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) + { + m4aSoundVSyncOff(); + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + s32 i; + void *chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) + { + ((struct SoundChannel *)chan)->status = 0; + i--; + chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) + { + i = 1; + + while (i <= 4) + { + soundInfo->CgbOscOff(i); + ((struct CgbChannel *)chan)->sf = 0; + i++; + chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +void m4aSoundVSyncOff(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) + { + soundInfo->ident += 10; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + + CpuFill32(soundInfo->pcmBuffer, 0, sizeof(soundInfo->pcmBuffer)); + } +} + +void m4aSoundVSyncOn(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + return; + + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + + soundInfo->pcmDmaCounter = 0; + soundInfo->ident = ident - 10; +} + +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) +{ + struct SoundInfo *soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) + { + tracks->flags = 0; + trackCount--; + tracks++; + } + + if (soundInfo->func != 0) + { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + soundInfo->func = 0; + } + + soundInfo->intp = (u32)mplayInfo; + soundInfo->func = (u32)MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) +{ + s32 i; + u8 unk_B; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + unk_B = mplayInfo->unk_B; + + if (!unk_B + || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) + && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) + || (mplayInfo->priority <= songHeader->priority)) + { + mplayInfo->ident++; + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = MPT_FLG_EXIST | MPT_FLG_START; + track->chan = 0; + track->cmdPtr = songHeader->part[i]; + i++; + track++; + } + + while (i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & 0x80) + m4aSoundMode(songHeader->reverb); + + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + u16 fadeOI = mplayInfo->fadeOI; + register u32 temp asm("r3"); + register u16 mask asm("r2"); + + if (fadeOI == 0) + return; + + mplayInfo->fadeOC--; + + temp = 0xFFFF; + mask = temp; + + if (mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) + { + mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); + + if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } + else + { + mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); + + if ((s16)(mplayInfo->fadeOV & mask) <= 0) + { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + register u32 fadeOV asm("r7"); + register u32 val asm("r0"); + + TrackStop(mplayInfo, track); + + val = STOP_AFTER_FADE; + fadeOV = mplayInfo->fadeOV; + val &= fadeOV; + + if (!val) + track->flags = val; + + i--; + track++; + } + + if (mplayInfo->fadeOV & STOP_AFTER_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + if (track->flags & MPT_FLG_VOLSET) + { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) + { + s32 bend = track->bend * track->bendRange; + register s32 x asm("r1") = track->tune; + x += bend; + x *= 4; + x += (track->keyShift << 8); + x += (track->keyShiftX << 8); + x += track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) +{ + if (chanNum == 4) + { + if (key <= 20) + { + key = 0; + } + else + { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } + else + { + s32 val1; + s32 val2; + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } + else + { + key -= 36; + if (key > 130) + { + key = 130; + fineAdjust = 255; + } + } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; + } +} + +void CgbOscOff(u8 chanNum) +{ + switch (chanNum) + { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} + +void CgbModVol(struct CgbChannel *chan) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +} diff --git a/src/m4a_4.c b/src/m4a_4.c new file mode 100644 index 000000000..9c7655187 --- /dev/null +++ b/src/m4a_4.c @@ -0,0 +1,545 @@ +#include "gba/m4a_internal.h" + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->keyShiftX = (s16)pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack *track) +{ + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ +if (cond) \ + goto cond_true; \ +else \ + goto cond_false; \ + +void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 op; + u8 *addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) + { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + return; + case 6: + MEMACC_COND_JUMP(*addr == data) + return; + case 7: + MEMACC_COND_JUMP(*addr != data) + return; + case 8: + MEMACC_COND_JUMP(*addr > data) + return; + case 9: + MEMACC_COND_JUMP(*addr >= data) + return; + case 10: + MEMACC_COND_JUMP(*addr <= data) + return; + case 11: + MEMACC_COND_JUMP(*addr < data) + return; + case 12: + MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) + return; + case 13: + MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) + return; + case 14: + MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) + return; + case 15: + MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) + return; + case 16: + MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) + return; + case 17: + MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) + return; + default: + return; + } + +cond_true: + { + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); + func(mplayInfo, track); + return; + } + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); + func(mplayInfo, track); +} + +#define READ_XCMD_BYTE(var, n) \ +{ \ + u32 byte = track->cmdPtr[(n)]; \ + byte <<= n * 8; \ + (var) &= ~(0xFF << (n * 8)); \ + (var) |= byte; \ +} + +void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 wav; + + READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable + READ_XCMD_BYTE(wav, 1) + READ_XCMD_BYTE(wav, 2) + READ_XCMD_BYTE(wav, 3) + + track->tone.wav = (struct WaveData *)wav; + track->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + + if (track->unk_3A < (u16)unk) + { + track->unk_3A++; + track->cmdPtr -= 2; + track->wai = 1; + } + else + { + track->unk_3A = 0; + track->cmdPtr += 2; + } +} + +void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + READ_XCMD_BYTE(unk, 2) + READ_XCMD_BYTE(unk, 3) + + track->unk_3C = unk; + track->cmdPtr += 4; +} + +void DummyFunc(void) +{ +} + +struct MusicPlayerInfo *sub_81DF43C(u32 tone) +{ + u32 maxClock = 0; + s32 maxClockIndex = 0; + s32 i; + struct MusicPlayerInfo *mplayInfo; + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + + if (!track->flags && (!track->chan || track->chan->track != track)) + goto start_song; + + if (maxClock < gPokemonCryMusicPlayers[i].clock) + { + maxClock = gPokemonCryMusicPlayers[i].clock; + maxClockIndex = i; + } + } + + i = maxClockIndex; + +start_song: + mplayInfo = &gPokemonCryMusicPlayers[i]; + mplayInfo->ident++; + +#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) +#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) + + memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); + + *(u32 *)(CRY + CRY_OFS(tone)) = tone; + *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); + *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); + *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); + +#undef CRY_OFS +#undef CRY + + mplayInfo->ident = ID_NUMBER; + + MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); + + return mplayInfo; +} + +void sub_81DF50C(u8 val) +{ + gPokemonCrySong.volumeValue = val & 0x7F; +} + +void sub_81DF520(s8 val) +{ + gPokemonCrySong.panValue = (val + C_V) & 0x7F; +} + +void sub_81DF538(s16 val) +{ + s16 b = val + 0x80; + u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; + gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; + gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; + gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; +} + +void sub_81DF570(u16 val) +{ + gPokemonCrySong.unkCmd0CParam = val; +} + +void sub_81DF57C(u8 val) +{ + gPokemonCrySong.releaseValue = val; +} + +void sub_81DF588(u32 val) +{ + gPokemonCrySong.unkCmd0DParam = val; +} + +int sub_81DF594(struct MusicPlayerInfo *mplayInfo) +{ + struct MusicPlayerTrack *track = mplayInfo->tracks; + + if (track->chan && track->chan->track == track) + return 1; + else + return 0; +} + +void sub_81DF5AC(s8 val) +{ + if (val) + { + gPokemonCrySong.trackCount = 2; + gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; + } + else + { + gPokemonCrySong.trackCount = 1; + } +} + +void sub_81DF5D8(u32 val) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (val) + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + soundInfo->mode &= ~1; + } + else + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT + | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; + soundInfo->mode |= 1; + } +} + +void sub_81DF618(u8 val) +{ + gPokemonCrySong.priority = val; +} diff --git a/src/m4a_tables.c b/src/m4a_tables.c new file mode 100644 index 000000000..39344a590 --- /dev/null +++ b/src/m4a_tables.c @@ -0,0 +1,306 @@ +#include "gba/m4a_internal.h" + +// Some of these functions have different signatures, so we need to make this +// an array of void pointers or a struct. It's simpler to just make it an array +// for now. +void * const gMPlayJumpTableTemplate[] = +{ + ply_fine, + ply_goto, + ply_patt, + ply_pend, + ply_rept, + ply_fine, + ply_fine, + ply_fine, + ply_fine, + ply_prio, + ply_tempo, + ply_keysh, + ply_voice, + ply_vol, + ply_pan, + ply_bend, + ply_bendr, + ply_lfos, + ply_lfodl, + ply_mod, + ply_modt, + ply_fine, + ply_fine, + ply_tune, + ply_fine, + ply_fine, + ply_fine, + ply_port, + ply_fine, + ply_endtie, + SampleFreqSet, + TrackStop, + FadeOutBody, + TrkVolPitSet, + RealClearChain, + SoundMainBTM, +}; + +const u8 gUnknown_0842F9F4[] = +{ + 0, + 1, + 4, + 9, + 16, + 25, + 36, + 49, + 192, + 207, + 220, + 231, + 240, + 247, + 252, + 255, +}; + +const u8 gScaleTable[] = +{ + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +}; + +const u32 gFreqTable[] = +{ + 2147483648u, + 2275179671u, + 2410468894u, + 2553802834u, + 2705659852u, + 2866546760u, + 3037000500u, + 3217589947u, + 3408917802u, + 3611622603u, + 3826380858u, + 4053909305u, +}; + +const u16 gPcmSamplesPerVBlankTable[] = +{ + 96, + 132, + 176, + 224, + 264, + 304, + 352, + 448, + 528, + 608, + 672, + 704, +}; + +const u8 gCgbScaleTable[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, +}; + +const s16 gCgbFreqTable[] = +{ + -2004, + -1891, + -1785, + -1685, + -1591, + -1501, + -1417, + -1337, + -1262, + -1192, + -1125, + -1062, +}; + +const u8 gNoiseTable[] = +{ + 0xD7, 0xD6, 0xD5, 0xD4, + 0xC7, 0xC6, 0xC5, 0xC4, + 0xB7, 0xB6, 0xB5, 0xB4, + 0xA7, 0xA6, 0xA5, 0xA4, + 0x97, 0x96, 0x95, 0x94, + 0x87, 0x86, 0x85, 0x84, + 0x77, 0x76, 0x75, 0x74, + 0x67, 0x66, 0x65, 0x64, + 0x57, 0x56, 0x55, 0x54, + 0x47, 0x46, 0x45, 0x44, + 0x37, 0x36, 0x35, 0x34, + 0x27, 0x26, 0x25, 0x24, + 0x17, 0x16, 0x15, 0x14, + 0x07, 0x06, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x00, +}; + +const u8 gCgb3Vol[] = +{ + 0x00, 0x00, + 0x60, 0x60, 0x60, 0x60, + 0x40, 0x40, 0x40, 0x40, + 0x80, 0x80, 0x80, 0x80, + 0x20, 0x20, +}; + +const u8 gClockTable[] = +{ + 0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0A, + 0x0B, + 0x0C, + 0x0D, + 0x0E, + 0x0F, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x17, + 0x18, + 0x1C, + 0x1E, + 0x20, + 0x24, + 0x28, + 0x2A, + 0x2C, + 0x30, + 0x34, + 0x36, + 0x38, + 0x3C, + 0x40, + 0x42, + 0x44, + 0x48, + 0x4C, + 0x4E, + 0x50, + 0x54, + 0x58, + 0x5A, + 0x5C, + 0x60, +}; + +#define FINE 0xb1 +#define GOTO 0xb2 +#define PATT 0xb3 +#define PEND 0xb4 +#define REPT 0xb5 +#define MEMACC 0xb9 +#define PRIO 0xba +#define TEMPO 0xbb +#define KEYSH 0xbc +#define VOICE 0xbd +#define VOL 0xbe +#define PAN 0xbf +#define BEND 0xc0 +#define BENDR 0xc1 +#define LFOS 0xc2 +#define LFODL 0xc3 +#define MOD 0xc4 +#define MODT 0xc5 +#define TUNE 0xc8 + +#define XCMD 0xcd +#define xRELE 0x07 +#define xIECV 0x08 +#define xIECL 0x09 + +#define EOT 0xce +#define TIE 0xcf + +const struct PokemonCrySong gPokemonCrySongTemplate = +{ + 1, // track count + 0, // block count + 255, // priority + 0, // reverb + (struct ToneData *)&gUnknown_0842FC88, + NULL, + NULL, + 0, + TUNE, // part 0 + C_V, // TUNE value + GOTO, + 0, // GOTO target address + TUNE, // part 1 + C_V + 16, // TUNE value + {VOICE, 0}, // part 0 jumps here with GOTO + VOL, + 127, // volume + {XCMD, 0x0D}, + 0, // unk value + {XCMD, xRELE}, + 0, // release + PAN, + C_V, // PAN value + TIE, + 60, // TIE key (default is Cn3) + 127, // TIE velocity + {XCMD, 0x0C}, + 60, // unk value + {EOT, FINE} // end +}; + +const XcmdFunc gXcmdTable[] = +{ + ply_xxx, + ply_xwave, + ply_xtype, + ply_xxx, + ply_xatta, + ply_xdeca, + ply_xsust, + ply_xrele, + ply_xiecv, + ply_xiecl, + ply_xleng, + ply_xswee, + ply_xcmd_0C, + ply_xcmd_0D, +}; diff --git a/src/siirtc.c b/src/siirtc.c index 326f714cc..647042dbe 100644 --- a/src/siirtc.c +++ b/src/siirtc.c @@ -52,7 +52,8 @@ extern vu16 GPIOPortDirection; -extern bool8 gSiiRtcLocked; +static u16 sUnused; +static bool8 sLocked; static int WriteCommand(u8 value); static int WriteData(u8 value); @@ -65,13 +66,13 @@ static const char AgbLibRtcVersion[] = "SIIRTC_V001"; void SiiRtcUnprotect() { EnableGpioPortRead(); - gSiiRtcLocked = FALSE; + sLocked = FALSE; } void SiiRtcProtect() { DisableGpioPortRead(); - gSiiRtcLocked = TRUE; + sLocked = TRUE; } u8 SiiRtcProbe() @@ -120,10 +121,10 @@ bool8 SiiRtcReset() u8 result; struct SiiRtcInfo rtc; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -135,7 +136,7 @@ bool8 SiiRtcReset() GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; rtc.status = SIIRTCINFO_24HOUR; @@ -148,10 +149,10 @@ bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) { u8 statusData; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -172,7 +173,7 @@ bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -181,10 +182,10 @@ bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) { u8 statusData; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -203,7 +204,7 @@ bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -212,10 +213,10 @@ bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) { u8 i; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -234,7 +235,7 @@ bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -243,10 +244,10 @@ bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) { u8 i; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -261,7 +262,7 @@ bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -270,10 +271,10 @@ bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) { u8 i; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -292,7 +293,7 @@ bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -301,10 +302,10 @@ bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) { u8 i; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 5; @@ -319,7 +320,7 @@ bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } @@ -329,10 +330,10 @@ bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) u8 i; u8 alarmData[2]; - if (gSiiRtcLocked == TRUE) + if (sLocked == TRUE) return FALSE; - gSiiRtcLocked = TRUE; + sLocked = TRUE; // Decode BCD. alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); @@ -359,7 +360,7 @@ bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) GPIO_PORT_DATA = 1; GPIO_PORT_DATA = 1; - gSiiRtcLocked = FALSE; + sLocked = FALSE; return TRUE; } |