summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-25 13:17:06 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-25 13:17:06 -0400
commitf61b7cc024fd9be692960ee284bb078fb5f1f125 (patch)
tree4b6c5870add11dbe2910e4a27d56d902239cd7ed
parent40c3f6e85a2d25d3d98b2cfdaf1dd6872bbb4a6d (diff)
sound.c
-rw-r--r--arm9/arm9.lcf6
-rw-r--r--arm9/asm/unk_02003B98.s780
-rw-r--r--arm9/asm/unk_020ADA84.s233
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/SPI_mic.h6
-rw-r--r--arm9/lib/include/SPI_pm.h2
-rw-r--r--arm9/src/main.c8
-rw-r--r--arm9/src/sound.c321
-rw-r--r--include/options.h15
-rw-r--r--include/sdat.h42
-rw-r--r--include/sound.h65
11 files changed, 544 insertions, 936 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index ca9690b9..546d2b71 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -131,7 +131,7 @@ SECTIONS {
unk_02002C14.o (.text)
unk_02002F08.o (.text)
unk_020030E8.o (.text)
- unk_02003B98.o (.text)
+ sound.o (.text)
unk_020040F4.o (.text)
unk_020051F4.o (.text)
unk_02005CFC.o (.text)
@@ -772,7 +772,7 @@ SECTIONS {
SDK_STATIC_TEXT_END = .;
SDK_STATIC_DATA_START = .;
- unk_02003B98.o (.data)
+ sound.o (.data)
filesystem.o (.data)
unk_02006D98.o (.data)
unk_0200E850.o (.data)
@@ -846,7 +846,7 @@ SECTIONS {
main.o (.bss)
unk_020023C0.o (.bss)
unk_02002C14.o (.bss)
- unk_02003B98.o (.bss)
+ sound.o (.bss)
unk_020040F4.o (.bss)
poke_overlay.o (.bss)
unk_02009EAC.o (.bss)
diff --git a/arm9/asm/unk_02003B98.s b/arm9/asm/unk_02003B98.s
deleted file mode 100644
index 83b1e1d3..00000000
--- a/arm9/asm/unk_02003B98.s
+++ /dev/null
@@ -1,780 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
- ; 0x02104780
- .global UNK_02104780
-UNK_02104780: ; 0x02104780
- .asciz "data/sound/sound_data.sdat"
-
- .section .bss
- .global UNK_02107070
-UNK_02107070: ; 0x02107070
- .space 0x8
-
- .global sSoundDataBuffer
-sSoundDataBuffer: ; 0x02107078
- ; 00: SDATHeader
- ; - 00: char magic[4]
- ; - 04: u16 byte_order
- ; - 06: u16 version
- ; - 08: u32 filesize
- ; - 0C: u16 header size
- ; - 0E: u16 section count
- ; - 10: u32 symb_offset
- ; - 14: u32 symb_size
- ; - 18: u32 info_offset
- ; - 1C: u32 info_size
- ; - 20: u32 fat_offset
- ; - 24: u32 fat_size
- ; - 28: u32 file_offset
- ; - 2c: u32 file_size
- ; 30: u32
- ; 34: FSFile
- ; 7C: FSFileID
- ; 84: u32
- ; 88: u32
- ; 8C: u32
- ; 90: u32
- ; 94: u8[0xBBB6C]
- ; BBC00: u8[0x94]
- ; BBC94: u8[0x24]
- ; BBCB8: u32
- ; BBCBC: u32
- ; BBCC0: u8[0x20]
- ; BBCE0: u8[0x1000]
- ; BCCE0: u8[0x1C]
- ; BCCFC: u16
- ; BCCFE: u16
- ; BCD00: u32
- ; BCD10: u8
- ; BCD11: u8
- ; BCD12: u16
- ; BCD14: u8
- ; BCD15: u8
- ; BCD16: u8
- ; BCD17: u8
- ; BCD18: u8
- ; BCD19: u8
- ; BCD1A: u8
- ; BCD1B: u8
- ; BCD1C: u32
- ; BCD20: u32
- ; BCD24: u32
- ; BCD28: u32
- ; BCD2C: u32
- ; BCD30: u32
- ; BCD34: u32
- ; BCD38: u32
- ; BCD3C: u32
- ; BCD40: u64
- ; BCD48: u32
- ; BCD4C: u32
- ; BCD50: u32
- ; BCD54: u32
- ; BCD58: u32
- ; BCD5C: u32
- .space 0xbcd60
-
- .text
-
- thumb_func_start FUN_02003B98
-FUN_02003B98: ; 0x02003B98
- push {r4-r6, lr}
- add r5, r0, #0x0
- add r6, r1, #0x0
- bl GetSoundDataPointer
- add r4, r0, #0x0
- bl FUN_020C01D0
- bl FUN_020040C8
- add r0, r4, #0x0
- bl FUN_02004064
- add r0, r4, #0x0
- ldr r1, _02003C00 ; =0x000BBC00
- add r0, #0x94
- bl FUN_020C2A94
- add r1, r4, #0x0
- add r1, #0x90
- str r0, [r1, #0x0]
- add r2, r4, #0x0
- add r2, #0x90
- ldr r1, _02003C04 ; =UNK_02104780
- ldr r2, [r2, #0x0]
- add r0, r4, #0x0
- mov r3, #0x0
- bl FUN_020C26F8
- add r0, r4, #0x0
- add r0, #0x90
- ldr r0, [r0, #0x0]
- bl FUN_020C39CC
- add r0, r4, #0x0
- bl FUN_02004088
- add r0, r4, #0x0
- bl FUN_020040A4
- ldr r0, _02003C08 ; =UNK_02107070
- mov r1, #0x0
- str r1, [r0, #0x4]
- ldr r0, _02003C0C ; =0x000BCD4C
- str r5, [r4, r0]
- ldrh r0, [r6, #0x0]
- lsl r0, r0, #0x1a
- lsr r0, r0, #0x1e
- bl FUN_02004D60
- pop {r4-r6, pc}
- nop
-_02003C00: .word 0x000BBC00
-_02003C04: .word UNK_02104780
-_02003C08: .word UNK_02107070
-_02003C0C: .word 0x000BCD4C
-
- thumb_func_start FUN_02003C10
-FUN_02003C10: ; 0x02003C10
- push {r4, lr}
- bl GetSoundDataPointer
- add r4, r0, #0x0
- bl FUN_02003D04
- cmp r0, #0x0
- bne _02003C30
- ldr r0, _02003C3C ; =0x000BCD00
- ldr r1, [r4, r0]
- cmp r1, #0x0
- ble _02003C2C
- sub r1, r1, #0x1
- str r1, [r4, r0]
-_02003C2C:
- bl FUN_02003C40
-_02003C30:
- bl FUN_02005CFC
- bl FUN_020C01A0
- pop {r4, pc}
- nop
-_02003C3C: .word 0x000BCD00
-
- thumb_func_start FUN_02003C40
-FUN_02003C40: ; 0x02003C40
- push {r4, lr}
- bl GetSoundDataPointer
- add r4, r0, #0x0
- ldr r0, _02003CDC ; =UNK_02107070
- ldr r0, [r0, #0x0]
- cmp r0, #0x6
- bhi _02003CD8
- add r0, r0, r0
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_02003C5C: ; jump table (using 16-bit offset)
- .short _02003CD8 - _02003C5C - 2; case 0
- .short _02003C6A - _02003C5C - 2; case 1
- .short _02003CD8 - _02003C5C - 2; case 2
- .short _02003C72 - _02003C5C - 2; case 3
- .short _02003C82 - _02003C5C - 2; case 4
- .short _02003C92 - _02003C5C - 2; case 5
- .short _02003CB0 - _02003C5C - 2; case 6
-_02003C6A:
- mov r0, #0x2
- bl FUN_02003CE8
- pop {r4, pc}
-_02003C72:
- bl FUN_02005404
- cmp r0, #0x0
- bne _02003CD8
- mov r0, #0x2
- bl FUN_02003CE8
- pop {r4, pc}
-_02003C82:
- bl FUN_02005404
- cmp r0, #0x0
- bne _02003CD8
- mov r0, #0x2
- bl FUN_02003CE8
- pop {r4, pc}
-_02003C92:
- bl FUN_02005404
- cmp r0, #0x0
- bne _02003CD8
- bl FUN_02004D94
- cmp r0, #0x0
- bne _02003CD8
- bl FUN_020040DC
- ldr r0, _02003CE0 ; =0x000BCD0E
- ldrh r0, [r4, r0]
- bl FUN_0200521C
- pop {r4, pc}
-_02003CB0:
- bl FUN_02005404
- cmp r0, #0x0
- bne _02003CD8
- bl FUN_02004D94
- cmp r0, #0x0
- bne _02003CD8
- bl FUN_020040DC
- ldr r0, _02003CE0 ; =0x000BCD0E
- ldrh r0, [r4, r0]
- bl FUN_0200521C
- ldr r1, _02003CE4 ; =0x000BCD08
- mov r0, #0x7f
- ldr r1, [r4, r1]
- mov r2, #0x0
- bl FUN_0200538C
-_02003CD8:
- pop {r4, pc}
- nop
-_02003CDC: .word UNK_02107070
-_02003CE0: .word 0x000BCD0E
-_02003CE4: .word 0x000BCD08
-
- thumb_func_start FUN_02003CE8
-FUN_02003CE8: ; 0x02003CE8
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- ldr r1, _02003CFC ; =0x000BCCFC
- mov r2, #0x0
- strh r2, [r0, r1]
- ldr r0, _02003D00 ; =UNK_02107070
- str r4, [r0, #0x0]
- pop {r4, pc}
- .balign 4
-_02003CFC: .word 0x000BCCFC
-_02003D00: .word UNK_02107070
-
- thumb_func_start FUN_02003D04
-FUN_02003D04: ; 0x02003D04
- push {r4, lr}
- bl GetSoundDataPointer
- add r4, r0, #0x0
- mov r0, #0x2
- bl FUN_020048BC
- cmp r0, #0x0
- beq _02003D1A
- mov r0, #0x1
- pop {r4, pc}
-_02003D1A:
- ldr r0, _02003D2C ; =0x000BCD12
- ldrh r0, [r4, r0]
- cmp r0, #0x0
- beq _02003D26
- mov r0, #0x1
- pop {r4, pc}
-_02003D26:
- mov r0, #0x0
- pop {r4, pc}
- nop
-_02003D2C: .word 0x000BCD12
-
- thumb_func_start GetSoundDataPointer
-GetSoundDataPointer: ; 0x02003D30
- ldr r0, _02003D34 ; =sSoundDataBuffer
- bx lr
- .balign 4
-_02003D34: .word sSoundDataBuffer
-
- thumb_func_start FUN_02003D38
-FUN_02003D38: ; 0x02003D38
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- cmp r4, #0x27
- bls _02003D46
- b _02003E92
-_02003D46:
- add r1, r4, r4
- add r1, pc
- ldrh r1, [r1, #0x6]
- lsl r1, r1, #0x10
- asr r1, r1, #0x10
- add pc, r1
-_02003D52: ; jump table (using 16-bit offset)
- .short _02003DA8 - _02003D52 - 2; case 0
- .short _02003DAE - _02003D52 - 2; case 1
- .short _02003DB4 - _02003D52 - 2; case 2
- .short _02003DBA - _02003D52 - 2; case 3
- .short _02003DC0 - _02003D52 - 2; case 4
- .short _02003DA2 - _02003D52 - 2; case 5
- .short _02003DC6 - _02003D52 - 2; case 6
- .short _02003DCC - _02003D52 - 2; case 7
- .short _02003DD2 - _02003D52 - 2; case 8
- .short _02003DD8 - _02003D52 - 2; case 9
- .short _02003DDE - _02003D52 - 2; case 10
- .short _02003DE4 - _02003D52 - 2; case 11
- .short _02003DEA - _02003D52 - 2; case 12
- .short _02003DF0 - _02003D52 - 2; case 13
- .short _02003DF6 - _02003D52 - 2; case 14
- .short _02003DFC - _02003D52 - 2; case 15
- .short _02003E02 - _02003D52 - 2; case 16
- .short _02003E08 - _02003D52 - 2; case 17
- .short _02003E0E - _02003D52 - 2; case 18
- .short _02003E14 - _02003D52 - 2; case 19
- .short _02003E1A - _02003D52 - 2; case 20
- .short _02003E20 - _02003D52 - 2; case 21
- .short _02003E26 - _02003D52 - 2; case 22
- .short _02003E2C - _02003D52 - 2; case 23
- .short _02003E32 - _02003D52 - 2; case 24
- .short _02003E38 - _02003D52 - 2; case 25
- .short _02003E3E - _02003D52 - 2; case 26
- .short _02003E44 - _02003D52 - 2; case 27
- .short _02003E4A - _02003D52 - 2; case 28
- .short _02003E50 - _02003D52 - 2; case 29
- .short _02003E56 - _02003D52 - 2; case 30
- .short _02003E5C - _02003D52 - 2; case 31
- .short _02003E62 - _02003D52 - 2; case 32
- .short _02003E68 - _02003D52 - 2; case 33
- .short _02003E6E - _02003D52 - 2; case 34
- .short _02003E74 - _02003D52 - 2; case 35
- .short _02003E7A - _02003D52 - 2; case 36
- .short _02003E80 - _02003D52 - 2; case 37
- .short _02003E86 - _02003D52 - 2; case 38
- .short _02003E8C - _02003D52 - 2; case 39
-_02003DA2:
- ldr r1, _02003E9C ; =0x000BCCFE
- add r0, r0, r1
- pop {r4, pc}
-_02003DA8:
- ldr r1, _02003EA0 ; =0x000BBCB8
- add r0, r0, r1
- pop {r4, pc}
-_02003DAE:
- ldr r1, _02003EA4 ; =0x000BBCBC
- add r0, r0, r1
- pop {r4, pc}
-_02003DB4:
- ldr r1, _02003EA8 ; =0x000BBCC0
- add r0, r0, r1
- pop {r4, pc}
-_02003DBA:
- ldr r1, _02003EAC ; =0x000BBCE0
- add r0, r0, r1
- pop {r4, pc}
-_02003DC0:
- ldr r1, _02003EB0 ; =0x000BCCE0
- add r0, r0, r1
- pop {r4, pc}
-_02003DC6:
- ldr r1, _02003EB4 ; =0x000BCD00
- add r0, r0, r1
- pop {r4, pc}
-_02003DCC:
- ldr r1, _02003EB8 ; =0x000BCD04
- add r0, r0, r1
- pop {r4, pc}
-_02003DD2:
- ldr r1, _02003EBC ; =0x000BCD08
- add r0, r0, r1
- pop {r4, pc}
-_02003DD8:
- ldr r1, _02003EC0 ; =0x000BCD0C
- add r0, r0, r1
- pop {r4, pc}
-_02003DDE:
- ldr r1, _02003EC4 ; =0x000BCD0E
- add r0, r0, r1
- pop {r4, pc}
-_02003DE4:
- ldr r1, _02003EC8 ; =0x000BCD10
- add r0, r0, r1
- pop {r4, pc}
-_02003DEA:
- ldr r1, _02003ECC ; =0x000BCD11
- add r0, r0, r1
- pop {r4, pc}
-_02003DF0:
- ldr r1, _02003ED0 ; =0x000BCD12
- add r0, r0, r1
- pop {r4, pc}
-_02003DF6:
- ldr r1, _02003ED4 ; =0x000BCD14
- add r0, r0, r1
- pop {r4, pc}
-_02003DFC:
- ldr r1, _02003ED8 ; =0x000BCD15
- add r0, r0, r1
- pop {r4, pc}
-_02003E02:
- ldr r1, _02003EDC ; =0x000BCD16
- add r0, r0, r1
- pop {r4, pc}
-_02003E08:
- ldr r1, _02003EE0 ; =0x000BCD17
- add r0, r0, r1
- pop {r4, pc}
-_02003E0E:
- ldr r1, _02003EE4 ; =0x000BCD18
- add r0, r0, r1
- pop {r4, pc}
-_02003E14:
- ldr r1, _02003EE8 ; =0x000BCD19
- add r0, r0, r1
- pop {r4, pc}
-_02003E1A:
- ldr r1, _02003EEC ; =0x000BCD1A
- add r0, r0, r1
- pop {r4, pc}
-_02003E20:
- ldr r1, _02003EF0 ; =0x000BCD1B
- add r0, r0, r1
- pop {r4, pc}
-_02003E26:
- ldr r1, _02003EF4 ; =0x000BCD1C
- add r0, r0, r1
- pop {r4, pc}
-_02003E2C:
- ldr r1, _02003EF8 ; =0x000BCD20
- add r0, r0, r1
- pop {r4, pc}
-_02003E32:
- ldr r1, _02003EFC ; =0x000BCD24
- add r0, r0, r1
- pop {r4, pc}
-_02003E38:
- ldr r1, _02003F00 ; =0x000BCD28
- add r0, r0, r1
- pop {r4, pc}
-_02003E3E:
- ldr r1, _02003F04 ; =0x000BCD2C
- add r0, r0, r1
- pop {r4, pc}
-_02003E44:
- ldr r1, _02003F08 ; =0x000BCD30
- add r0, r0, r1
- pop {r4, pc}
-_02003E4A:
- ldr r1, _02003F0C ; =0x000BCD34
- add r0, r0, r1
- pop {r4, pc}
-_02003E50:
- ldr r1, _02003F10 ; =0x000BCD38
- add r0, r0, r1
- pop {r4, pc}
-_02003E56:
- ldr r1, _02003F14 ; =0x000BCD39
- add r0, r0, r1
- pop {r4, pc}
-_02003E5C:
- ldr r1, _02003F18 ; =0x000BCD3A
- add r0, r0, r1
- pop {r4, pc}
-_02003E62:
- ldr r1, _02003F1C ; =0x000BCD3C
- add r0, r0, r1
- pop {r4, pc}
-_02003E68:
- ldr r1, _02003F20 ; =0x000BCD40
- add r0, r0, r1
- pop {r4, pc}
-_02003E6E:
- ldr r1, _02003F24 ; =0x000BCD48
- add r0, r0, r1
- pop {r4, pc}
-_02003E74:
- ldr r1, _02003F28 ; =0x000BCD4C
- add r0, r0, r1
- pop {r4, pc}
-_02003E7A:
- ldr r1, _02003F2C ; =0x000BCD50
- add r0, r0, r1
- pop {r4, pc}
-_02003E80:
- ldr r1, _02003F30 ; =0x000BCD54
- add r0, r0, r1
- pop {r4, pc}
-_02003E86:
- ldr r1, _02003F34 ; =0x000BCD58
- add r0, r0, r1
- pop {r4, pc}
-_02003E8C:
- ldr r1, _02003F38 ; =0x000BCD5C
- add r0, r0, r1
- pop {r4, pc}
-_02003E92:
- bl ErrorHandling
- mov r0, #0x0
- pop {r4, pc}
- nop
-_02003E9C: .word 0x000BCCFE
-_02003EA0: .word 0x000BBCB8
-_02003EA4: .word 0x000BBCBC
-_02003EA8: .word 0x000BBCC0
-_02003EAC: .word 0x000BBCE0
-_02003EB0: .word 0x000BCCE0
-_02003EB4: .word 0x000BCD00
-_02003EB8: .word 0x000BCD04
-_02003EBC: .word 0x000BCD08
-_02003EC0: .word 0x000BCD0C
-_02003EC4: .word 0x000BCD0E
-_02003EC8: .word 0x000BCD10
-_02003ECC: .word 0x000BCD11
-_02003ED0: .word 0x000BCD12
-_02003ED4: .word 0x000BCD14
-_02003ED8: .word 0x000BCD15
-_02003EDC: .word 0x000BCD16
-_02003EE0: .word 0x000BCD17
-_02003EE4: .word 0x000BCD18
-_02003EE8: .word 0x000BCD19
-_02003EEC: .word 0x000BCD1A
-_02003EF0: .word 0x000BCD1B
-_02003EF4: .word 0x000BCD1C
-_02003EF8: .word 0x000BCD20
-_02003EFC: .word 0x000BCD24
-_02003F00: .word 0x000BCD28
-_02003F04: .word 0x000BCD2C
-_02003F08: .word 0x000BCD30
-_02003F0C: .word 0x000BCD34
-_02003F10: .word 0x000BCD38
-_02003F14: .word 0x000BCD39
-_02003F18: .word 0x000BCD3A
-_02003F1C: .word 0x000BCD3C
-_02003F20: .word 0x000BCD40
-_02003F24: .word 0x000BCD48
-_02003F28: .word 0x000BCD4C
-_02003F2C: .word 0x000BCD50
-_02003F30: .word 0x000BCD54
-_02003F34: .word 0x000BCD58
-_02003F38: .word 0x000BCD5C
-
- thumb_func_start FUN_02003F3C
-FUN_02003F3C: ; 0x02003F3C
- push {r3-r5, lr}
- add r5, r0, #0x0
- bl GetSoundDataPointer
- add r0, #0x90
- ldr r0, [r0, #0x0]
- bl FUN_020C290C
- add r4, r0, #0x0
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- bne _02003F5A
- bl ErrorHandling
-_02003F5A:
- cmp r5, #0x0
- beq _02003F60
- str r4, [r5, #0x0]
-_02003F60:
- add r0, r4, #0x0
- pop {r3-r5, pc}
-
- thumb_func_start FUN_02003F64
-FUN_02003F64: ; 0x02003F64
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- add r0, #0x90
- ldr r0, [r0, #0x0]
- add r1, r4, #0x0
- bl FUN_020C2828
- pop {r4, pc}
-
- thumb_func_start FUN_02003F78
-FUN_02003F78: ; 0x02003F78
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- add r1, r0, #0x0
- add r1, #0x90
- ldr r1, [r1, #0x0]
- add r0, r4, #0x0
- bl FUN_020C36A8
- pop {r4, pc}
- .balign 4
-
- thumb_func_start FUN_02003F90
-FUN_02003F90: ; 0x02003F90
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- add r1, r0, #0x0
- add r1, #0x90
- ldr r1, [r1, #0x0]
- add r0, r4, #0x0
- bl FUN_020C3674
- pop {r4, pc}
- .balign 4
-
- thumb_func_start FUN_02003FA8
-FUN_02003FA8: ; 0x02003FA8
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- bl GetSoundDataPointer
- add r2, r0, #0x0
- add r2, #0x90
- ldr r2, [r2, #0x0]
- add r0, r5, #0x0
- add r1, r4, #0x0
- bl FUN_020C35E0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02003FC4
-FUN_02003FC4: ; 0x02003FC4
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- add r1, r0, #0x0
- add r1, #0x90
- ldr r1, [r1, #0x0]
- add r0, r4, #0x0
- bl FUN_020C360C
- pop {r4, pc}
- .balign 4
-
- thumb_func_start FUN_02003FDC
-FUN_02003FDC: ; 0x02003FDC
- push {r4, lr}
- add r4, r0, #0x0
- bl GetSoundDataPointer
- add r1, r0, #0x0
- add r1, #0x90
- ldr r1, [r1, #0x0]
- add r0, r4, #0x0
- bl FUN_020C3640
- pop {r4, pc}
- .balign 4
-
- thumb_func_start FUN_02003FF4
-FUN_02003FF4: ; 0x02003FF4
- push {r3-r5, lr}
- add r5, r0, #0x0
- bl GetSoundDataPointer
- add r4, r0, #0x0
- cmp r5, #0x9
- blt _02004008
- bl ErrorHandling
- mov r5, #0x0
-_02004008:
- ldr r0, _02004014 ; =0x000BBC94
- add r1, r4, r0
- lsl r0, r5, #0x2
- add r0, r1, r0
- pop {r3-r5, pc}
- nop
-_02004014: .word 0x000BBC94
-
- thumb_func_start FUN_02004018
-FUN_02004018: ; 0x02004018
- push {r3, lr}
- cmp r0, #0x7
- bhi _0200405A
- add r0, r0, r0
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_0200402A: ; jump table (using 16-bit offset)
- .short _0200403E - _0200402A - 2; case 0
- .short _0200403A - _0200402A - 2; case 1
- .short _02004042 - _0200402A - 2; case 2
- .short _02004046 - _0200402A - 2; case 3
- .short _0200404A - _0200402A - 2; case 4
- .short _0200404E - _0200402A - 2; case 5
- .short _02004052 - _0200402A - 2; case 6
- .short _02004056 - _0200402A - 2; case 7
-_0200403A:
- mov r0, #0x0
- pop {r3, pc}
-_0200403E:
- mov r0, #0x1
- pop {r3, pc}
-_02004042:
- mov r0, #0x2
- pop {r3, pc}
-_02004046:
- mov r0, #0x3
- pop {r3, pc}
-_0200404A:
- mov r0, #0x4
- pop {r3, pc}
-_0200404E:
- mov r0, #0x5
- pop {r3, pc}
-_02004052:
- mov r0, #0x6
- pop {r3, pc}
-_02004056:
- mov r0, #0x7
- pop {r3, pc}
-_0200405A:
- bl ErrorHandling
- mov r0, #0x3
- pop {r3, pc}
- .balign 4
-
- thumb_func_start FUN_02004064
-FUN_02004064: ; 0x02004064
- push {r4, lr}
- ldr r2, _02004080 ; =0x000BCD60
- mov r1, #0x0
- add r4, r0, #0x0
- bl memset
- ldr r0, _02004084 ; =0x000BCD1C
- mov r1, #0x0
-_02004074:
- add r1, r1, #0x1
- str r1, [r4, r0]
- add r4, r4, #0x4
- cmp r1, #0x7
- blt _02004074
- pop {r4, pc}
- .balign 4
-_02004080: .word 0x000BCD60
-_02004084: .word 0x000BCD1C
-
- thumb_func_start FUN_02004088
-FUN_02004088: ; 0x02004088
- push {r3-r5, lr}
- ldr r1, _020040A0 ; =0x000BBC94
- mov r4, #0x0
- add r5, r0, r1
-_02004090:
- add r0, r5, #0x0
- bl FUN_020C0F80
- add r4, r4, #0x1
- add r5, r5, #0x4
- cmp r4, #0x9
- blt _02004090
- pop {r3-r5, pc}
- .balign 4
-_020040A0: .word 0x000BBC94
-
- thumb_func_start FUN_020040A4
-FUN_020040A4: ; 0x020040A4
- push {r4, lr}
- add r4, r0, #0x0
- ldr r0, _020040C0 ; =0x000BCD1C
- add r0, r4, r0
- bl FUN_02003F3C
- mov r0, #0x0
- bl FUN_02003F78
- ldr r0, _020040C4 ; =0x000BCD20
- add r0, r4, r0
- bl FUN_02003F3C
- pop {r4, pc}
- .balign 4
-_020040C0: .word 0x000BCD1C
-_020040C4: .word 0x000BCD20
-
- thumb_func_start FUN_020040C8
-FUN_020040C8: ; 0x020040C8
- push {r3, lr}
- bl MIC_Init
- mov r0, #0x1
- bl PM_SetAmp
- mov r0, #0x2
- bl PM_SetAmpGain
- pop {r3, pc}
-
- thumb_func_start FUN_020040DC
-FUN_020040DC: ; 0x020040DC
- push {r3, lr}
- mov r0, #0x7
- mov r1, #0x0
- bl FUN_020C1040
- mov r0, #0x7
- bl FUN_02003FF4
- bl FUN_020C0F68
- pop {r3, pc}
- .balign 4
diff --git a/arm9/asm/unk_020ADA84.s b/arm9/asm/unk_020ADA84.s
index e590a607..343f4c31 100644
--- a/arm9/asm/unk_020ADA84.s
+++ b/arm9/asm/unk_020ADA84.s
@@ -6370,24 +6370,16 @@ _020B13B8:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B1444
-_020B13E4:
- b _020B1444
-_020B13E8:
- b _020B1414
-_020B13EC:
- b _020B141C
-_020B13F0:
- b _020B1444
-_020B13F4:
- b _020B1424
-_020B13F8:
- b _020B1444
-_020B13FC:
- b _020B1444
-_020B1400:
- b _020B1444
-_020B1404:
- b _020B142C
+ ; Jump table
+ b _020B1444 ; case 0
+ b _020B1414 ; case 1
+ b _020B141C ; case 2
+ b _020B1444 ; case 3
+ b _020B1424 ; case 4
+ b _020B1444 ; case 5
+ b _020B1444 ; case 6
+ b _020B1444 ; case 7
+ b _020B142C ; case 8
_020B1408:
cmp r0, #0x20
beq _020B143C
@@ -6422,24 +6414,16 @@ _020B1448:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B14CC
-_020B146C:
- b _020B14CC
-_020B1470:
- b _020B149C
-_020B1474:
- b _020B14A4
-_020B1478:
- b _020B14CC
-_020B147C:
- b _020B14AC
-_020B1480:
- b _020B14CC
-_020B1484:
- b _020B14CC
-_020B1488:
- b _020B14CC
-_020B148C:
- b _020B14B4
+ ; Jump table
+ b _020B14CC ; case 0
+ b _020B149C ; case 1
+ b _020B14A4 ; case 2
+ b _020B14CC ; case 3
+ b _020B14AC ; case 4
+ b _020B14CC ; case 5
+ b _020B14CC ; case 6
+ b _020B14CC ; case 7
+ b _020B14B4 ; case 8
_020B1490:
cmp r0, #0x20
beq _020B14C4
@@ -6563,24 +6547,16 @@ _020B15F8:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B1684
-_020B1624:
- b _020B1684
-_020B1628:
- b _020B1654
-_020B162C:
- b _020B165C
-_020B1630:
- b _020B1684
-_020B1634:
- b _020B1664
-_020B1638:
- b _020B1684
-_020B163C:
- b _020B1684
-_020B1640:
- b _020B1684
-_020B1644:
- b _020B166C
+ ; Jump table
+ b _020B1684 ; case 0
+ b _020B1654 ; case 1
+ b _020B165C ; case 2
+ b _020B1684 ; case 3
+ b _020B1664 ; case 4
+ b _020B1684 ; case 5
+ b _020B1684 ; case 6
+ b _020B1684 ; case 7
+ b _020B166C ; case 8
_020B1648:
cmp r0, #0x20
beq _020B167C
@@ -6615,24 +6591,16 @@ _020B1688:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B170C
-_020B16AC:
- b _020B170C
-_020B16B0:
- b _020B16DC
-_020B16B4:
- b _020B16E4
-_020B16B8:
- b _020B170C
-_020B16BC:
- b _020B16EC
-_020B16C0:
- b _020B170C
-_020B16C4:
- b _020B170C
-_020B16C8:
- b _020B170C
-_020B16CC:
- b _020B16F4
+ ; Jump table
+ b _020B170C ; case 0
+ b _020B16DC ; case 1
+ b _020B16E4 ; case 2
+ b _020B170C ; case 3
+ b _020B16EC ; case 4
+ b _020B170C ; case 5
+ b _020B170C ; case 6
+ b _020B170C ; case 7
+ b _020B16F4 ; case 8
_020B16D0:
cmp r0, #0x20
beq _020B1704
@@ -6756,24 +6724,16 @@ _020B1838:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B18C4
-_020B1864:
- b _020B18C4
-_020B1868:
- b _020B1894
-_020B186C:
- b _020B189C
-_020B1870:
- b _020B18C4
-_020B1874:
- b _020B18A4
-_020B1878:
- b _020B18C4
-_020B187C:
- b _020B18C4
-_020B1880:
- b _020B18C4
-_020B1884:
- b _020B18AC
+ ; Jump table
+ b _020B18C4 ; case 0
+ b _020B1894 ; case 1
+ b _020B189C ; case 2
+ b _020B18C4 ; case 3
+ b _020B18A4 ; case 4
+ b _020B18C4 ; case 5
+ b _020B18C4 ; case 6
+ b _020B18C4 ; case 7
+ b _020B18AC ; case 8
_020B1888:
cmp r0, #0x20
beq _020B18BC
@@ -6808,24 +6768,16 @@ _020B18C8:
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020B194C
-_020B18EC:
- b _020B194C
-_020B18F0:
- b _020B191C
-_020B18F4:
- b _020B1924
-_020B18F8:
- b _020B194C
-_020B18FC:
- b _020B192C
-_020B1900:
- b _020B194C
-_020B1904:
- b _020B194C
-_020B1908:
- b _020B194C
-_020B190C:
- b _020B1934
+ ; Jump table
+ b _020B194C ; case 0
+ b _020B191C ; case 1
+ b _020B1924 ; case 2
+ b _020B194C ; case 3
+ b _020B192C ; case 4
+ b _020B194C ; case 5
+ b _020B194C ; case 6
+ b _020B194C ; case 7
+ b _020B1934 ; case 8
_020B1910:
cmp r0, #0x20
beq _020B1944
@@ -7959,14 +7911,11 @@ _020B2828:
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020B288C
-_020B2860:
- b _020B2870
-_020B2864:
- b _020B288C
-_020B2868:
- b _020B2870
-_020B286C:
- b _020B2870
+ ; Jump table
+ b _020B2870 ; case 0
+ b _020B288C ; case 1
+ b _020B2870 ; case 2
+ b _020B2870 ; case 3
_020B2870:
ldr r0, _020B28B0 ; =UNK_021CDD64
mov r1, #0x1
@@ -8056,14 +8005,11 @@ _020B297C:
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020B29E0
-_020B29B4:
- b _020B29C4
-_020B29B8:
- b _020B29E0
-_020B29BC:
- b _020B29C4
-_020B29C0:
- b _020B29C4
+ ; Jump table
+ b _020B29C4 ; case 0
+ b _020B29E0 ; case 1
+ b _020B29C4 ; case 2
+ b _020B29C4 ; case 3
_020B29C4:
ldr r0, _020B2A04 ; =UNK_021CDD64
mov r1, #0x1
@@ -10529,14 +10475,11 @@ _020B4C7C:
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020B4CB8
-_020B4C8C:
- b _020B4C9C
-_020B4C90:
- b _020B4CAC
-_020B4C94:
- b _020B4CAC
-_020B4C98:
- b _020B4CB8
+ ; Jump table
+ b _020B4C9C ; case 0
+ b _020B4CAC ; case 1
+ b _020B4CAC ; case 2
+ b _020B4CB8 ; case 3
_020B4C9C:
mov r0, r5
mov r1, r6
@@ -10588,14 +10531,11 @@ _020B4D24:
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020B4D74
-_020B4D48:
- b _020B4D58
-_020B4D4C:
- b _020B4D68
-_020B4D50:
- b _020B4D68
-_020B4D54:
- b _020B4D74
+ ; Jump table
+ b _020B4D58 ; case 0
+ b _020B4D68 ; case 1
+ b _020B4D68 ; case 2
+ b _020B4D74 ; case 3
_020B4D58:
mov r0, r4
mov r1, r5
@@ -27356,14 +27296,11 @@ _020C3500:
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020C35C0
-_020C3510:
- b _020C3520
-_020C3514:
- b _020C3570
-_020C3518:
- b _020C3598
-_020C351C:
- b _020C3548
+ ; Jump table
+ b _020C3520 ; case 0
+ b _020C3570 ; case 1
+ b _020C3598 ; case 2
+ b _020C3548 ; case 3
_020C3520:
str r5, [sp, #0x0]
ldrb r1, [r6, #0x1]
diff --git a/arm9/global.inc b/arm9/global.inc
index 2aced615..f478ba68 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -264,7 +264,7 @@
.extern FUN_02003A30
.extern FUN_02003A64
.extern FUN_02003B40
-.extern FUN_02003B98
+.extern InitSoundData
.extern FUN_02003C10
.extern FUN_02003CE8
.extern FUN_02003D38
diff --git a/arm9/lib/include/SPI_mic.h b/arm9/lib/include/SPI_mic.h
new file mode 100644
index 00000000..79588fe9
--- /dev/null
+++ b/arm9/lib/include/SPI_mic.h
@@ -0,0 +1,6 @@
+#ifndef NITRO_SPI_MIC_H_
+#define NITRO_SPI_MIC_H_
+
+void MIC_Init(void);
+
+#endif //NITRO_SPI_MIC_H_
diff --git a/arm9/lib/include/SPI_pm.h b/arm9/lib/include/SPI_pm.h
index b5063ed8..a5957f74 100644
--- a/arm9/lib/include/SPI_pm.h
+++ b/arm9/lib/include/SPI_pm.h
@@ -32,6 +32,8 @@ void PM_GetBackLight(PMBackLightSwitch * top, PMBackLightSwitch * bottom);
void PM_GoSleepMode(PMWakeUpTrigger trigger, PMLogic logic, u16 keyPattern);
u32 PM_SetBackLight(PMLCDTarget target, PMBackLightSwitch status);
void PM_ForceToPowerOff(void);
+void PM_SetAmp(int gain);
+void PM_SetAmpGain(int gain);
ENUMS_ALWAYS_INT_RESET
diff --git a/arm9/src/main.c b/arm9/src/main.c
index 36e81d02..ec3c358c 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -6,6 +6,8 @@
#include "PAD_pad.h"
#include "main.h"
#include "poke_overlay.h"
+#include "options.h"
+#include "sound.h"
FS_EXTERN_OVERLAY(MODULE_52);
FS_EXTERN_OVERLAY(MODULE_63);
@@ -31,9 +33,7 @@ extern void FUN_0201259C(void);
extern void FUN_02002C14(void);
extern void FUN_02002C50(int, int);
extern struct UnkStruct_021C59C8 * FUN_0202254C(void);
-extern void FUN_02003B98(int, int);
-extern int FUN_02029EF8(struct UnkStruct_021C59C8 *);
-extern int LoadPlayerDataAddress(struct UnkStruct_021C59C8 *);
+extern u32 FUN_02029EF8(struct UnkStruct_021C59C8 *);
extern void FUN_02020AFC(void);
extern int FUN_020337E8(int);
extern void FUN_02034188(int, int);
@@ -75,7 +75,7 @@ THUMB_FUNC void NitroMain(void)
FUN_02002C50(3, 3);
gBacklightTop.unk18 = -1;
gBacklightTop.unk20 = FUN_0202254C();
- FUN_02003B98(FUN_02029EF8(gBacklightTop.unk20), LoadPlayerDataAddress(gBacklightTop.unk20));
+ InitSoundData(FUN_02029EF8(gBacklightTop.unk20), LoadPlayerDataAddress(gBacklightTop.unk20));
FUN_02020AFC();
if (FUN_020337E8(3) == 3)
FUN_02034188(3, 0);
diff --git a/arm9/src/sound.c b/arm9/src/sound.c
new file mode 100644
index 00000000..a89d0f56
--- /dev/null
+++ b/arm9/src/sound.c
@@ -0,0 +1,321 @@
+#include "global.h"
+#include "sound.h"
+#include "SPI_mic.h"
+#include "SPI_pm.h"
+
+#pragma thumb on
+
+static struct SoundData sSoundDataBuffer;
+static u32 UNK_02107070[2];
+
+void FUN_02003C40(void);
+BOOL FUN_02003D04(void);
+void FUN_020040C8(void);
+void FUN_02004064(struct SoundData *);
+void FUN_02004088(struct SoundData *);
+void FUN_020040A4(struct SoundData *);
+void FUN_02003CE8(int);
+void FUN_020040DC(void);
+
+extern BOOL FUN_020048BC(int);
+extern void FUN_02004D60(u32);
+extern BOOL FUN_02004D94(void);
+extern void FUN_0200521C(int);
+extern void FUN_0200538C(int, int, int);
+extern BOOL FUN_02005404(void);
+extern void FUN_02005CFC(void);
+
+void InitSoundData(u32 a0, struct Options * a1)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ FUN_020C01D0();
+ FUN_020040C8();
+ FUN_02004064(sdat);
+ sdat->unk_00090 = FUN_020C2A94(sdat->unk_00094, sizeof(sdat->unk_00094));
+ FUN_020C26F8(&sdat->header, "data/sound/sound_data.sdat", sdat->unk_00090, 0);
+ FUN_020C39CC(sdat->unk_00090);
+ FUN_02004088(sdat);
+ FUN_020040A4(sdat);
+ UNK_02107070[1] = 0;
+ sdat->unk_BCD4C = a0;
+ FUN_02004D60(a1->unk0_4);
+}
+
+void FUN_02003C10(void)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ if (!FUN_02003D04())
+ {
+ if (sdat->unk_BCD00 > 0)
+ sdat->unk_BCD00--;
+ FUN_02003C40();
+ }
+ FUN_02005CFC();
+ FUN_020C01A0();
+}
+
+void FUN_02003C40(void)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ switch (UNK_02107070[0])
+ {
+ case 1:
+ FUN_02003CE8(2);
+ break;
+ case 3:
+ if (!FUN_02005404())
+ FUN_02003CE8(2);
+ break;
+ case 4:
+ if (!FUN_02005404())
+ FUN_02003CE8(2);
+ break;
+ case 5:
+ if (!FUN_02005404() && !FUN_02004D94())
+ {
+ FUN_020040DC();
+ FUN_0200521C(sdat->unk_BCD0E);
+ }
+ break;
+ case 6:
+ if (!FUN_02005404() && !FUN_02004D94())
+ {
+ FUN_020040DC();
+ FUN_0200521C(sdat->unk_BCD0E);
+ FUN_0200538C(0x7F, (int)sdat->unk_BCD08, 0);
+ }
+ break;
+ }
+}
+
+void FUN_02003CE8(int a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ sdat->unk_BCCFC = 0;
+ UNK_02107070[0] = (u32)a0;
+}
+
+BOOL FUN_02003D04(void)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ if (FUN_020048BC(2))
+ return TRUE;
+ return sdat->unk_BCD12 != 0;
+}
+
+struct SoundData * GetSoundDataPointer(void)
+{
+ return &sSoundDataBuffer;
+}
+
+void * FUN_02003D38(u32 a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ switch (a0)
+ {
+ case 5:
+ return &sdat->unk_BCCFE;
+ case 0:
+ return &sdat->unk_BBCB8;
+ case 1:
+ return &sdat->unk_BBCBC;
+ case 2:
+ return &sdat->unk_BBCC0;
+ case 3:
+ return &sdat->unk_BBCE0;
+ case 4:
+ return &sdat->unk_BCCE0;
+ case 6:
+ return &sdat->unk_BCD00;
+ case 7:
+ return &sdat->unk_BCD04;
+ case 8:
+ return &sdat->unk_BCD08;
+ case 9:
+ return &sdat->unk_BCD0C;
+ case 10:
+ return &sdat->unk_BCD0E;
+ case 11:
+ return &sdat->unk_BCD10;
+ case 12:
+ return &sdat->unk_BCD11;
+ case 13:
+ return &sdat->unk_BCD12;
+ case 14:
+ return &sdat->unk_BCD14;
+ case 15:
+ return &sdat->unk_BCD15;
+ case 16:
+ return &sdat->unk_BCD16;
+ case 17:
+ return &sdat->unk_BCD17;
+ case 18:
+ return &sdat->unk_BCD18;
+ case 19:
+ return &sdat->unk_BCD19;
+ case 20:
+ return &sdat->unk_BCD1A;
+ case 21:
+ return &sdat->unk_BCD1B;
+ case 22:
+ return &sdat->unk_BCD1C[0];
+ case 23:
+ return &sdat->unk_BCD1C[1];
+ case 24:
+ return &sdat->unk_BCD1C[2];
+ case 25:
+ return &sdat->unk_BCD1C[3];
+ case 26:
+ return &sdat->unk_BCD1C[4];
+ case 27:
+ return &sdat->unk_BCD1C[5];
+ case 28:
+ return &sdat->unk_BCD1C[6];
+ case 29:
+ return &sdat->unk_BCD38;
+ case 30:
+ return &sdat->unk_BCD39;
+ case 31:
+ return &sdat->unk_BCD3A;
+ case 32:
+ return &sdat->unk_BCD3C;
+ case 33:
+ return &sdat->unk_BCD40;
+ case 34:
+ return &sdat->unk_BCD48;
+ case 35:
+ return &sdat->unk_BCD4C;
+ case 36:
+ return &sdat->unk_BCD50;
+ case 37:
+ return &sdat->unk_BCD54;
+ case 38:
+ return &sdat->unk_BCD58;
+ case 39:
+ return &sdat->unk_BCD5C;
+ default:
+ GF_ASSERT(0);
+ return NULL;
+ }
+}
+
+int FUN_02003F3C(int * a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ int r4 = FUN_020C290C(sdat->unk_00090);
+ GF_ASSERT(r4 != -1);
+ if (a0 != NULL)
+ *a0 = r4;
+ return r4;
+}
+
+void FUN_02003F64(int a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ FUN_020C2828(sdat->unk_00090, a0);
+}
+
+BOOL FUN_02003F78(u32 * a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ return FUN_020C36A8(a0, sdat->unk_00090);
+}
+
+BOOL FUN_02003F90(u32 * a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ return FUN_020C3674(a0, sdat->unk_00090);
+}
+
+BOOL FUN_02003FA8(u32 * a0, u32 * a1)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ return FUN_020C35E0(a0, a1, sdat->unk_00090);
+}
+
+BOOL FUN_02003FC4(u32 * a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ return FUN_020C360C(a0, sdat->unk_00090);
+}
+
+BOOL FUN_02003FDC(u32 * a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ return FUN_020C3640(a0, sdat->unk_00090);
+}
+
+u32 * FUN_02003FF4(int a0)
+{
+ struct SoundData * sdat = GetSoundDataPointer();
+ if (a0 >= 9)
+ {
+ GF_ASSERT(0);
+ a0 = 0;
+ }
+ return &sdat->unk_BBC94[a0];
+}
+
+u32 FUN_02004018(u32 a0)
+{
+ switch (a0)
+ {
+ case 1:
+ return 0;
+ case 0:
+ return 1;
+ case 2:
+ return 2;
+ case 3:
+ return 3;
+ case 4:
+ return 4;
+ case 5:
+ return 5;
+ case 6:
+ return 6;
+ case 7:
+ return 7;
+ default:
+ GF_ASSERT(0);
+ return 3;
+ }
+}
+
+void FUN_02004064(struct SoundData * sdat)
+{
+ int i;
+ memset(sdat, 0, sizeof(*sdat));
+ for (i = 0; i < 7; i++)
+ sdat->unk_BCD1C[i] = i + 1;
+}
+
+void FUN_02004088(struct SoundData * sdat)
+{
+ int i;
+ for (i = 0; i < 9; i++)
+ {
+ FUN_020C0F80(&sdat->unk_BBC94[i]);
+ }
+}
+
+void FUN_020040A4(struct SoundData * sdat)
+{
+ FUN_02003F3C(&sdat->unk_BCD1C[0]);
+ FUN_02003F78(NULL);
+ FUN_02003F3C(&sdat->unk_BCD1C[1]);
+}
+
+void FUN_020040C8(void)
+{
+ MIC_Init();
+ PM_SetAmp(1);
+ PM_SetAmpGain(2);
+}
+
+void FUN_020040DC(void)
+{
+ FUN_020C1040(7, 0);
+ FUN_02003FF4(7);
+ FUN_020C0F68();
+}
diff --git a/include/options.h b/include/options.h
new file mode 100644
index 00000000..730cbaa5
--- /dev/null
+++ b/include/options.h
@@ -0,0 +1,15 @@
+#ifndef POKEDIAMOND_OPTIONS_H
+#define POKEDIAMOND_OPTIONS_H
+
+#include "main.h"
+
+struct Options {
+ u16 unk0_0:4;
+ u16 unk0_4:2;
+ u16 unk0_6:10;
+ u8 padding[2]; // TODO: finish me
+};
+
+struct Options * LoadPlayerDataAddress(struct UnkStruct_021C59C8 *);
+
+#endif //POKEDIAMOND_OPTIONS_H
diff --git a/include/sdat.h b/include/sdat.h
new file mode 100644
index 00000000..70522a3d
--- /dev/null
+++ b/include/sdat.h
@@ -0,0 +1,42 @@
+#ifndef GUARD_LIBSDAT_H
+#define GUARD_LIBSDAT_H
+
+struct SDATHeader
+{
+ // Generic header
+ char magic[4];
+ u16 bom;
+ u16 version;
+ u32 filesize;
+ u16 header_size;
+ u16 section_count;
+ // SDAT chunks
+ u32 symb_offset, symb_size;
+ u32 info_offset, info_size;
+ u32 fat_offset, fat_size;
+ u32 file_offset, file_size;
+ u32 unk_00030;
+ FSFile file; // 00034
+ FSFileID fileID; // 7C
+ u32 unk_00084;
+ u32 unk_00088;
+ void * unk_0008C;
+};
+
+void FUN_020C01D0(void);
+void * FUN_020C2A94(void *, u32);
+void FUN_020C26F8(struct SDATHeader *, char *, void *, u32);
+void FUN_020C39CC(void *);
+void FUN_020C01A0(void);
+int FUN_020C290C(void *);
+void FUN_020C2828(void *, int);
+BOOL FUN_020C36A8(u32 *, void *);
+BOOL FUN_020C3674(u32 *, void *);
+BOOL FUN_020C35E0(u32 *, u32 *, void *);
+BOOL FUN_020C360C(u32 *, void *);
+BOOL FUN_020C3640(u32 *, void *);
+void FUN_020C0F80(u32 *);
+void FUN_020C1040(int, int);
+void FUN_020C0F68(void);
+
+#endif //GUARD_LIBSDAT_H
diff --git a/include/sound.h b/include/sound.h
new file mode 100644
index 00000000..0a4fc4ed
--- /dev/null
+++ b/include/sound.h
@@ -0,0 +1,65 @@
+#ifndef POKEDIAMOND_SOUND_H
+#define POKEDIAMOND_SOUND_H
+
+#include "FS_file.h"
+#include "sdat.h"
+#include "options.h"
+
+struct SoundData
+{
+ struct SDATHeader header;
+ void * unk_00090;
+ u8 unk_00094[0xBBC00];
+ u32 unk_BBC94[9];
+ u32 unk_BBCB8;
+ u32 unk_BBCBC;
+ u8 unk_BBCC0[0x20];
+ u8 unk_BBCE0[0x1000];
+ u8 unk_BCCE0[0x1C];
+ u16 unk_BCCFC;
+ u16 unk_BCCFE;
+ s32 unk_BCD00;
+ u32 unk_BCD04;
+ u32 unk_BCD08;
+ u16 unk_BCD0C;
+ u16 unk_BCD0E;
+ u8 unk_BCD10;
+ u8 unk_BCD11;
+ u16 unk_BCD12;
+ u8 unk_BCD14;
+ u8 unk_BCD15;
+ u8 unk_BCD16;
+ u8 unk_BCD17;
+ u8 unk_BCD18;
+ u8 unk_BCD19;
+ u8 unk_BCD1A;
+ u8 unk_BCD1B;
+ int unk_BCD1C[7];
+ u8 unk_BCD38;
+ u8 unk_BCD39;
+ u8 unk_BCD3A;
+ u8 unk_BCD3B;
+ u32 unk_BCD3C;
+ u64 unk_BCD40;
+ u32 unk_BCD48;
+ u32 unk_BCD4C;
+ u32 unk_BCD50;
+ u32 unk_BCD54;
+ u32 unk_BCD58;
+ u32 unk_BCD5C;
+};
+
+struct SoundData * GetSoundDataPointer(void);
+void InitSoundData(u32 a0, struct Options * a1);
+void * FUN_02003D38(u32 a0);
+int FUN_02003F3C(int * a0);
+void FUN_02003F64(int a0);
+BOOL FUN_02003F78(u32 * a0);
+BOOL FUN_02003F90(u32 * a0);
+BOOL FUN_02003FA8(u32 * a0, u32 * a1);
+BOOL FUN_02003FC4(u32 * a0);
+BOOL FUN_02003FDC(u32 * a0);
+u32 * FUN_02003FF4(int a0);
+u32 FUN_02004018(u32 a0);
+
+#endif //POKEDIAMOND_SOUND_H