summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <cameronghall@cox.net>2019-08-01 23:23:43 -0500
committerCameron Hall <cameronghall@cox.net>2019-08-01 23:23:43 -0500
commitb97a0894bfa099ba5ec8363f8cdc08a1c0d9e6db (patch)
treeef04c74a98cafa7da2b3556d6af4067555b9e498
parent840dc3e1c2fee61ded7cbd88e6d8626bd4c14d8b (diff)
update m4a library
-rwxr-xr-xasm/m4a_3.s577
-rw-r--r--common_syms/m4a.txt (renamed from common_syms/m4a_2.txt)2
-rw-r--r--include/functions.h77
-rwxr-xr-xinclude/gba/m4a_internal.h2
-rwxr-xr-xinclude/m4a.h10
-rw-r--r--include/variables.h2
-rwxr-xr-xld_script.txt6
-rwxr-xr-xsrc/m4a.c (renamed from src/m4a_2.c)884
-rwxr-xr-xsrc/m4a_4.c547
-rwxr-xr-xsrc/titlescreen.c2
-rwxr-xr-xsym_common.txt2
11 files changed, 888 insertions, 1223 deletions
diff --git a/asm/m4a_3.s b/asm/m4a_3.s
deleted file mode 100755
index c0ac04f..0000000
--- a/asm/m4a_3.s
+++ /dev/null
@@ -1,577 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/gba_constants.inc"
- .include "constants/m4a_constants.inc"
-
- .syntax unified
-
- @ extern
- .set gCgb3Vol, 0x0852DAFC
-
- .text
-
- thumb_func_start CgbSound
-CgbSound: @ 8054920
- 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 _08054944
- subs r0, 0x1
- ldr r1, [sp, 0x4]
- strb r0, [r1, 0xA]
- b _0805494A
- .pool
-_08054944:
- movs r0, 0xE
- ldr r2, [sp, 0x4]
- strb r0, [r2, 0xA]
-_0805494A:
- movs r6, 0x1
- ldr r0, [sp, 0x4]
- ldr r4, [r0, 0x1C]
-_08054950:
- 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 _08054966
- b _08054D50
-_08054966:
- cmp r6, 0x2
- beq _08054988
- cmp r6, 0x2
- bgt _08054974
- cmp r6, 0x1
- beq _0805497A
- b _080549D0
-_08054974:
- cmp r6, 0x3
- beq _080549B0
- b _080549D0
-_0805497A:
- 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 _080549E0
- .pool
-_08054988:
- ldr r0, =REG_NR10 + 1
- str r0, [sp, 0x8]
- ldr r7, =REG_NR21
- ldr r2, =REG_NR22
- b _080549D8
- .pool
-_080549B0:
- 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 _080549E0
- .pool
-_080549D0:
- ldr r0, =REG_NR30 + 1
- str r0, [sp, 0x8]
- ldr r7, =REG_NR41
- ldr r2, =REG_NR42
-_080549D8:
- str r2, [sp, 0xC]
- adds r0, 0xB
- str r0, [sp, 0x10]
- adds r2, 0x4
-_080549E0:
- 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 _08054AD6
- 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 _08054AFA
- 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 _08054A48
- cmp r6, 0x2
- bgt _08054A3C
- cmp r6, 0x1
- beq _08054A42
- b _08054A9C
- .pool
-_08054A3C:
- cmp r6, 0x3
- beq _08054A54
- b _08054A9C
-_08054A42:
- ldrb r0, [r4, 0x1F]
- ldr r2, [sp, 0x8]
- strb r0, [r2]
-_08054A48:
- ldr r0, [r4, 0x24]
- lsls r0, 6
- ldrb r1, [r4, 0x1E]
- adds r0, r1, r0
- strb r0, [r7]
- b _08054AA8
-_08054A54:
- ldr r1, [r4, 0x24]
- ldr r0, [r4, 0x28]
- cmp r1, r0
- beq _08054A7C
- 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]
-_08054A7C:
- ldr r0, [sp, 0x8]
- strb r5, [r0]
- ldrb r0, [r4, 0x1E]
- strb r0, [r7]
- ldrb r0, [r4, 0x1E]
- cmp r0, 0
- beq _08054A94
- movs r0, 0xC0
- b _08054AB6
- .pool
-_08054A94:
- movs r1, 0x80
- negs r1, r1
- strb r1, [r4, 0x1A]
- b _08054AB8
-_08054A9C:
- ldrb r0, [r4, 0x1E]
- strb r0, [r7]
- ldr r0, [r4, 0x24]
- lsls r0, 3
- ldr r2, [sp, 0x10]
- strb r0, [r2]
-_08054AA8:
- ldrb r0, [r4, 0x4]
- adds r0, 0x8
- mov r8, r0
- ldrb r0, [r4, 0x1E]
- cmp r0, 0
- beq _08054AB6
- movs r0, 0x40
-_08054AB6:
- strb r0, [r4, 0x1A]
-_08054AB8:
- 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 _08054AD2
- b _08054C0E
-_08054AD2:
- strb r2, [r4, 0x9]
- b _08054C3C
-_08054AD6:
- movs r0, 0x4
- ands r0, r2
- cmp r0, 0
- beq _08054B08
- 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 _08054AFA
- b _08054C4E
-_08054AFA:
- lsls r0, r6, 24
- lsrs r0, 24
- bl CgbOscOff
- movs r0, 0
- strb r0, [r4]
- b _08054D4C
-_08054B08:
- 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 _08054B48
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _08054B48
- 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 _08054B7A
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
- cmp r6, 0x3
- beq _08054C3C
- ldrb r2, [r4, 0x7]
- mov r8, r2
- b _08054C3C
-_08054B48:
- ldrb r0, [r4, 0xB]
- cmp r0, 0
- bne _08054C3C
- cmp r6, 0x3
- bne _08054B5A
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
-_08054B5A:
- adds r0, r4, 0
- bl CgbModVol
- movs r0, 0x3
- ldrb r2, [r4]
- ands r0, r2
- cmp r0, 0
- bne _08054BAE
- ldrb r0, [r4, 0x9]
- subs r0, 0x1
- strb r0, [r4, 0x9]
- movs r1, 0xFF
- ands r0, r1
- lsls r0, 24
- cmp r0, 0
- bgt _08054BAA
-_08054B7A:
- 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 _08054AFA
- 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 _08054C4E
- movs r2, 0x8
- mov r8, r2
- b _08054C4E
-_08054BAA:
- ldrb r0, [r4, 0x7]
- b _08054C3A
-_08054BAE:
- cmp r0, 0x1
- bne _08054BBA
-_08054BB2:
- ldrb r0, [r4, 0x19]
- strb r0, [r4, 0x9]
- movs r0, 0x7
- b _08054C3A
-_08054BBA:
- cmp r0, 0x2
- bne _08054BFE
- 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 _08054BFA
-_08054BD2:
- ldrb r0, [r4, 0x6]
- cmp r0, 0
- bne _08054BE2
- movs r0, 0xFC
- ldrb r1, [r4]
- ands r0, r1
- strb r0, [r4]
- b _08054B7A
-_08054BE2:
- 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 _08054BB2
- movs r0, 0x8
- mov r8, r0
- b _08054BB2
-_08054BFA:
- ldrb r0, [r4, 0x5]
- b _08054C3A
-_08054BFE:
- 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 _08054C38
-_08054C0E:
- 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 _08054BD2
- 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 _08054C3C
- ldrb r2, [r4, 0x5]
- mov r8, r2
- b _08054C3C
-_08054C38:
- ldrb r0, [r4, 0x4]
-_08054C3A:
- strb r0, [r4, 0xB]
-_08054C3C:
- ldrb r0, [r4, 0xB]
- subs r0, 0x1
- strb r0, [r4, 0xB]
- ldr r0, [sp]
- cmp r0, 0
- bne _08054C4E
- subs r0, 0x1
- str r0, [sp]
- b _08054B48
-_08054C4E:
- movs r0, 0x2
- ldrb r1, [r4, 0x1D]
- ands r0, r1
- cmp r0, 0
- beq _08054CC6
- cmp r6, 0x3
- bgt _08054C8E
- movs r0, 0x8
- ldrb r2, [r4, 0x1]
- ands r0, r2
- cmp r0, 0
- beq _08054C8E
- ldr r0, =REG_SOUNDBIAS + 1
- ldrb r0, [r0]
- cmp r0, 0x3F
- bgt _08054C80
- ldr r0, [r4, 0x20]
- adds r0, 0x2
- ldr r1, =0x000007fc
- b _08054C8A
- .pool
-_08054C80:
- cmp r0, 0x7F
- bgt _08054C8E
- ldr r0, [r4, 0x20]
- adds r0, 0x1
- ldr r1, =0x000007fe
-_08054C8A:
- ands r0, r1
- str r0, [r4, 0x20]
-_08054C8E:
- cmp r6, 0x4
- beq _08054CA0
- ldr r0, [r4, 0x20]
- ldr r1, [sp, 0x10]
- strb r0, [r1]
- b _08054CAE
- .pool
-_08054CA0:
- ldr r2, [sp, 0x10]
- ldrb r0, [r2]
- movs r1, 0x8
- ands r1, r0
- ldr r0, [r4, 0x20]
- orrs r0, r1
- strb r0, [r2]
-_08054CAE:
- 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]
-_08054CC6:
- movs r0, 0x1
- ldrb r2, [r4, 0x1D]
- ands r0, r2
- cmp r0, 0
- beq _08054D4C
- 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 _08054D18
- 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 _08054D4C
- 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 _08054D4C
- .pool
-_08054D18:
- 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 _08054D4C
- ldr r0, [sp, 0x8]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- bne _08054D4C
- ldrb r0, [r4, 0x1A]
- orrs r0, r2
- ldr r1, [sp, 0x14]
- strb r0, [r1]
-_08054D4C:
- movs r0, 0
- strb r0, [r4, 0x1D]
-_08054D50:
- mov r6, r10
- mov r4, r9
- cmp r6, 0x4
- bgt _08054D5A
- b _08054950
-_08054D5A:
- 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/common_syms/m4a_2.txt b/common_syms/m4a.txt
index 795728b..7fb31f6 100644
--- a/common_syms/m4a_2.txt
+++ b/common_syms/m4a.txt
@@ -5,7 +5,7 @@ gMPlayJumpTable
gCgbChans
gPokemonCryTracks
gPokemonCrySong
-gMPlayInfo_02032EE0
+gMPlayInfo_BGM
gMPlayInfo_SE1
gMPlayInfo_SE2
gMPlayMemAccArea \ No newline at end of file
diff --git a/include/functions.h b/include/functions.h
index ae6c8c8..89b93dc 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -16,83 +16,6 @@ void sub_11F0(int arg0);
void sub_11FC(void);
void sub_1340(void);
-// src/m4a_2.c
-
-/*
-u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust);
-void UnusedDummyFunc();
-void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
-void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
-void m4aSoundInit(void);
-void m4aSoundMain(void);
-void m4aSongNumStart(u16 n);
-void m4aSongNumStartOrChange(u16 n);
-void m4aSongNumStartOrContinue(u16 n);
-void m4aSongNumStop(u16 n);
-void m4aSongNumContinue(u16 n);
-void m4aMPlayAllStop(void);
-void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
-void m4aMPlayAllContinue(void);
-void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
-void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
-void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
-void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
-void MPlayExtender(struct CgbChannel *cgbChans);
-void MusicPlayerJumpTableCopy(void);
-void ClearChain(void *x);
-void Clear64byte(void *x);
-void SoundInit(struct SoundInfo *soundInfo);
-void SampleFreqSet(u32 freq);
-void m4aSoundMode(u32 mode);
-void SoundClear(void);
-void m4aSoundVSyncOff(void);
-void m4aSoundVSyncOn(void);
-void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount);
-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);
-u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust);
-void CgbOscOff(u8 chanNum);
-void CgbModVol(struct CgbChannel *chan);
-
-// src/m4a_4.c
-
-void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
-void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
-void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
-void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
-void ClearModM(struct MusicPlayerTrack *track);
-void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
-void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);
-void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void DummyFunc(void);
-void SetPokemonCryVolume(u8 val);
-void SetPokemonCryPanpot(s8 val);
-void SetPokemonCryPitch(s16 val);
-void SetPokemonCryLength(u16 val);
-void SetPokemonCryRelease(u8 val);
-void SetPokemonCryProgress(u32 val);
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
-void SetPokemonCryChorus(s8 val);
-void SetPokemonCryStereo(u32 val);
-void SetPokemonCryPriority(u8 val);
-*/
-
// src/main.c
void AgbMain(void);
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index 339a077..0bd6ed7 100755
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -100,7 +100,7 @@ struct CgbChannel
u8 le;
u8 sw;
u32 fr;
- u32 wp;
+ u32 *wp;
u32 cp;
u32 tp;
u32 pp;
diff --git a/include/m4a.h b/include/m4a.h
index 9ab70a6..4e6c236 100755
--- a/include/m4a.h
+++ b/include/m4a.h
@@ -3,15 +3,13 @@
#include "gba/m4a_internal.h"
-// TODO: import m4a library from pokeemerald
-
void m4aSoundVSync(void);
void m4aSoundVSyncOn(void);
void m4aSoundInit(void);
void m4aSoundMain(void);
-void m4aSongNumStart(u16);
-void m4aSongNumStop(u16 n);
+void m4aSongNumStart(u16 n);
+void m4aSongNumStartOrChange(u16 n);
void m4aMPlayAllStop(void);
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
@@ -20,7 +18,9 @@ void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
-extern struct MusicPlayerInfo gMPlayInfo_02032EE0;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern struct SoundInfo gSoundInfo;
#endif //GUARD_M4A_H
diff --git a/include/variables.h b/include/variables.h
index 9990083..6a74cb7 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -56,7 +56,7 @@ extern u8 gUnknown_02002808[];
//extern ? gCgbChans;
//extern ? gPokemonCryTracks;
//extern ? gPokemonCrySong;
-//extern ? gMPlayInfo_02032EE0;
+//extern ? gMPlayInfo_BGM;
//extern ? gMPlayMemAccArea;
extern const u16 gWildMonLocations[][2][8];
extern const s16 gUnknown_08055C44[];
diff --git a/ld_script.txt b/ld_script.txt
index 8fa89eb..c0a0e64 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -18,7 +18,7 @@ SECTIONS
/* .bss starts at 0x3000000 */
<BSS>
/* .bss.code starts at 0x3007400 */
- src/m4a_2.o(.bss.code);
+ src/m4a.o(.bss.code);
. = 0x8000;
}
@@ -48,9 +48,7 @@ SECTIONS
asm/options.o(.text);
asm/rom_528AC.o(.text);
asm/m4a_1.o(.text);
- src/m4a_2.o(.text);
- asm/m4a_3.o(.text);
- src/m4a_4.o(.text);
+ src/m4a.o(.text);
asm/libagbsyscall.o(.text);
asm/unknown_lib.o(.text);
*libgcc.a:_call_via_rX.o(.text);
diff --git a/src/m4a_2.c b/src/m4a.c
index 3dd2ffc..2c70083 100755
--- a/src/m4a_2.c
+++ b/src/m4a.c
@@ -1,5 +1,8 @@
+#include <string.h>
#include "gba/m4a_internal.h"
+extern const u8 gCgb3Vol[];
+
#define BSS_CODE __attribute__((section(".bss.code")))
asm(".set gScaleTable, 0x0852D928"); // TODO:
@@ -13,6 +16,8 @@ asm(".set gNoiseTable, 0x0852DAC0"); // TODO:
asm(".set gCgbScaleTable, 0x0852DA24"); // TODO:
asm(".set gCgbFreqTable, 0x0852DAA8"); // TODO:
asm(".set gNumMusicPlayers, 0x4"); // TODO:
+asm(".set gCgb3Vol, 0x0852DAFC"); // TODO:
+asm(".set gXcmdTable, 0x0852DB74"); // TODO:
BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};
@@ -23,7 +28,7 @@ void *gMPlayJumpTable[36];
struct CgbChannel gCgbChans[4];
struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
struct PokemonCrySong gPokemonCrySong;
-struct MusicPlayerInfo gMPlayInfo_02032EE0;
+struct MusicPlayerInfo gMPlayInfo_BGM;
struct MusicPlayerInfo gMPlayInfo_SE1;
struct MusicPlayerInfo gMPlayInfo_SE2;
u8 gMPlayMemAccArea[0x10];
@@ -49,7 +54,7 @@ u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted));
}
-void UnusedDummyFunc()
+void UnusedDummyFunc(void)
{
}
@@ -787,12 +792,11 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr
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;
+ s32 x = (track->tune + bend)
+ * 4
+ + (track->keyShift << 8)
+ + (track->keyShiftX << 8)
+ + track->pitX;
if (track->modT == 0)
x += 16 * track->modM;
@@ -921,3 +925,867 @@ void CgbModVol(struct CgbChannel *chan)
chan->sg = (chan->eg * chan->su + 15) >> 4;
chan->pan &= chan->panMask;
}
+
+void CgbSound(void)
+{
+ s32 ch;
+ struct CgbChannel *channels;
+ s32 evAdd;
+ s32 prevC15;
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ vu8 *nrx0ptr;
+ vu8 *nrx1ptr;
+ vu8 *nrx2ptr;
+ vu8 *nrx3ptr;
+ vu8 *nrx4ptr;
+
+ // Most comparision operations that cast to s8 perform 'and' by 0xFF.
+ int mask = 0xff;
+
+ if (soundInfo->c15)
+ soundInfo->c15--;
+ else
+ soundInfo->c15 = 14;
+
+ for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++)
+ {
+ if (!(channels->sf & 0xc7))
+ continue;
+
+ switch (ch)
+ {
+ case 1:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR10);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR11);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR12);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR13);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR14);
+ break;
+ case 2:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR10+1);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR21);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR22);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR23);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR24);
+ break;
+ case 3:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR30);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR31);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR32);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR33);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR34);
+ break;
+ default:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR30+1);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR41);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR42);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR43);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR44);
+ break;
+ }
+
+ prevC15 = soundInfo->c15;
+ evAdd = *nrx2ptr;
+
+ if (channels->sf & 0x80)
+ {
+ if (!(channels->sf & 0x40))
+ {
+ channels->sf = 3;
+ channels->mo = 3;
+ CgbModVol(channels);
+ switch (ch)
+ {
+ case 1:
+ *nrx0ptr = channels->sw;
+ // fallthrough
+ case 2:
+ *nrx1ptr = ((u32)channels->wp << 6) + channels->le;
+ goto loc_82E0E30;
+ case 3:
+ if ((u32)channels->wp != channels->cp)
+ {
+ *nrx0ptr = 0x40;
+ REG_WAVE_RAM0 = channels->wp[0];
+ REG_WAVE_RAM1 = channels->wp[1];
+ REG_WAVE_RAM2 = channels->wp[2];
+ REG_WAVE_RAM3 = channels->wp[3];
+ channels->cp = (u32)channels->wp;
+ }
+ *nrx0ptr = 0;
+ *nrx1ptr = channels->le;
+ if (channels->le)
+ channels->n4 = -64;
+ else
+ channels->n4 = -128;
+ break;
+ default:
+ *nrx1ptr = channels->le;
+ *nrx3ptr = (u32)channels->wp << 3;
+ loc_82E0E30:
+ evAdd = channels->at + 8;
+ if (channels->le)
+ channels->n4 = 64;
+ else
+ channels->n4 = 0;
+ break;
+ }
+ channels->ec = channels->at;
+ if ((s8)(channels->at & mask))
+ {
+ channels->ev = 0;
+ goto EC_MINUS;
+ }
+ else
+ {
+ goto loc_82E0F96;
+ }
+ }
+ else
+ {
+ goto loc_82E0E82;
+ }
+ }
+ else if (channels->sf & 0x04)
+ {
+ channels->echoLength--;
+ if ((s8)(channels->echoLength & mask) <= 0)
+ {
+ loc_82E0E82:
+ CgbOscOff(ch);
+ channels->sf = 0;
+ goto LAST_LABEL;
+ }
+ goto loc_82E0FD6;
+ }
+ else if ((channels->sf & 0x40) && (channels->sf & 0x03))
+ {
+ channels->sf &= 0xfc;
+ channels->ec = channels->re;
+ if ((s8)(channels->re & mask))
+ {
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = channels->re;
+ }
+ goto EC_MINUS;
+ }
+ else
+ {
+ goto loc_82E0F02;
+ }
+ }
+ else
+ {
+ loc_82E0ED0:
+ if (channels->ec == 0)
+ {
+ if (ch == 3)
+ {
+ channels->mo |= 1;
+ }
+ CgbModVol(channels);
+ if ((channels->sf & 0x3) == 0)
+ {
+ channels->ev--;
+ if ((s8)(channels->ev & mask) <= 0)
+ {
+ loc_82E0F02:
+ channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8;
+ if (channels->ev)
+ {
+ channels->sf |= 0x4;
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = 8;
+ }
+ goto loc_82E0FD6;
+ }
+ else
+ {
+ goto loc_82E0E82;
+ }
+ }
+ else
+ {
+ channels->ec = channels->re;
+ }
+ }
+ else if ((channels->sf & 0x3) == 1)
+ {
+ loc_82E0F3A:
+ channels->ev = channels->sg;
+ channels->ec = 7;
+ }
+ else if ((channels->sf & 0x3) == 2)
+ {
+ int ev, sg;
+
+ channels->ev--;
+ ev = (s8)(channels->ev & mask);
+ sg = (s8)(channels->sg);
+ if (ev <= sg)
+ {
+ loc_82E0F5A:
+ if (channels->su == 0)
+ {
+ channels->sf &= 0xfc;
+ goto loc_82E0F02;
+ }
+ else
+ {
+ channels->sf--;
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = 8;
+ }
+ goto loc_82E0F3A;
+ }
+ }
+ else
+ {
+ channels->ec = channels->de;
+ }
+ }
+ else
+ {
+ channels->ev++;
+ if ((u8)(channels->ev & mask) >= channels->eg)
+ {
+ loc_82E0F96:
+ channels->sf--;
+ channels->ec = channels->de;
+ if ((u8)(channels->ec & mask))
+ {
+ channels->mo |= 1;
+ channels->ev = channels->eg;
+ if (ch != 3)
+ {
+ evAdd = channels->de;
+ }
+ }
+ else
+ {
+ goto loc_82E0F5A;
+ }
+ }
+ else
+ {
+ channels->ec = channels->at;
+ }
+ }
+ }
+ }
+
+ EC_MINUS:
+ channels->ec--;
+ if (prevC15 == 0)
+ {
+ prevC15--;
+ goto loc_82E0ED0;
+ }
+
+ loc_82E0FD6:
+ if (channels->mo & 0x2)
+ {
+ if (ch < 4 && (channels->ty & 0x08))
+ {
+ int biasH = REG_SOUNDBIAS_H;
+
+ if (biasH < 64)
+ {
+ channels->fr = (channels->fr + 2) & 0x7fc;
+ }
+ else if (biasH < 128)
+ {
+ channels->fr = (channels->fr + 1) & 0x7fe;
+ }
+ }
+ if (ch != 4)
+ {
+ *nrx3ptr = channels->fr;
+ }
+ else
+ {
+ *nrx3ptr = (*nrx3ptr & 0x08) | channels->fr;
+ }
+ channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1));
+ *nrx4ptr = (s8)(channels->n4 & mask);
+ }
+
+ if (channels->mo & 1)
+ {
+ REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan;
+ if (ch == 3)
+ {
+ *nrx2ptr = gCgb3Vol[channels->ev];
+ if (channels->n4 & 0x80)
+ {
+ *nrx0ptr = 0x80;
+ *nrx4ptr = channels->n4;
+ channels->n4 &= 0x7f;
+ }
+ }
+ else
+ {
+ evAdd &= 0xf;
+ *nrx2ptr = (channels->ev << 4) + evAdd;
+ *nrx4ptr = channels->n4 | 0x80;
+ if (ch == 1 && !(*nrx0ptr & 0x08))
+ {
+ *nrx4ptr = channels->n4 | 0x80;
+ }
+ }
+ }
+
+ LAST_LABEL:
+ channels->mo = 0;
+ }
+}
+
+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, s16 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 = 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->wait = 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 *SetPokemonCryTone(struct ToneData *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)) = (u32)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 SetPokemonCryVolume(u8 val)
+{
+ gPokemonCrySong.volumeValue = val & 0x7F;
+}
+
+void SetPokemonCryPanpot(s8 val)
+{
+ gPokemonCrySong.panValue = (val + C_V) & 0x7F;
+}
+
+void SetPokemonCryPitch(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 SetPokemonCryLength(u16 val)
+{
+ gPokemonCrySong.unkCmd0CParam = val;
+}
+
+void SetPokemonCryRelease(u8 val)
+{
+ gPokemonCrySong.releaseValue = val;
+}
+
+void SetPokemonCryProgress(u32 val)
+{
+ gPokemonCrySong.unkCmd0DParam = val;
+}
+
+int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
+{
+ struct MusicPlayerTrack *track = mplayInfo->tracks;
+
+ if (track->chan && track->chan->track == track)
+ return 1;
+ else
+ return 0;
+}
+
+void SetPokemonCryChorus(s8 val)
+{
+ if (val)
+ {
+ gPokemonCrySong.trackCount = 2;
+ gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
+ }
+ else
+ {
+ gPokemonCrySong.trackCount = 1;
+ }
+}
+
+void SetPokemonCryStereo(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 SetPokemonCryPriority(u8 val)
+{
+ gPokemonCrySong.priority = val;
+}
diff --git a/src/m4a_4.c b/src/m4a_4.c
deleted file mode 100755
index f15ab34..0000000
--- a/src/m4a_4.c
+++ /dev/null
@@ -1,547 +0,0 @@
-#include "gba/m4a_internal.h"
-
-asm(".set gXcmdTable, 0x0852DB74"); // TODO:
-
-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, s16 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 = 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->wait = 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 *SetPokemonCryTone(struct ToneData *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)) = (u32)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 SetPokemonCryVolume(u8 val)
-{
- gPokemonCrySong.volumeValue = val & 0x7F;
-}
-
-void SetPokemonCryPanpot(s8 val)
-{
- gPokemonCrySong.panValue = (val + C_V) & 0x7F;
-}
-
-void SetPokemonCryPitch(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 SetPokemonCryLength(u16 val)
-{
- gPokemonCrySong.unkCmd0CParam = val;
-}
-
-void SetPokemonCryRelease(u8 val)
-{
- gPokemonCrySong.releaseValue = val;
-}
-
-void SetPokemonCryProgress(u32 val)
-{
- gPokemonCrySong.unkCmd0DParam = val;
-}
-
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
-{
- struct MusicPlayerTrack *track = mplayInfo->tracks;
-
- if (track->chan && track->chan->track == track)
- return 1;
- else
- return 0;
-}
-
-void SetPokemonCryChorus(s8 val)
-{
- if (val)
- {
- gPokemonCrySong.trackCount = 2;
- gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
- }
- else
- {
- gPokemonCrySong.trackCount = 1;
- }
-}
-
-void SetPokemonCryStereo(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 SetPokemonCryPriority(u8 val)
-{
- gPokemonCrySong.priority = val;
-}
diff --git a/src/titlescreen.c b/src/titlescreen.c
index d7dd98b..b013c2f 100755
--- a/src/titlescreen.c
+++ b/src/titlescreen.c
@@ -169,7 +169,7 @@ void sub_10BB8(void)
if (gTitlescreen.idleFramesCounter % 10 == 0)
{
gTitlescreen.idleFadeoutCounter++;
- m4aMPlayVolumeControl(&gMPlayInfo_02032EE0, 0xFFFF, 0x100 / gTitlescreen.idleFadeoutCounter);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100 / gTitlescreen.idleFadeoutCounter);
}
if (gTitlescreen.idleFadeoutCounter > 9)
diff --git a/sym_common.txt b/sym_common.txt
index e08e1f4..9df7200 100755
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -1 +1 @@
- .include "m4a_2.o"
+ .include "m4a.o"