decomp UpdateSound and label more music stuff

This commit is contained in:
Seth Barberee 2022-06-25 20:17:30 -05:00
parent a4bf7fa76a
commit dfffb31195
8 changed files with 1120 additions and 1337 deletions

View File

@ -4261,7 +4261,7 @@ _0809FD82:
bl _0809EAE0
_0809FD90:
adds r0, r1, 0
bl sub_8011914
bl xxx_call_queue_bgm
bl _0809EAE0
.align 2, 0
_0809FD9C: .4byte 0x000003e7
@ -8781,7 +8781,7 @@ _080A2304:
ldr r5, _080A231C
cmp r0, r5
beq _080A236A
bl sub_8011914
bl xxx_call_queue_bgm
_080A2312:
strh r5, [r4]
b _080A1EBE

View File

@ -1,362 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start UpdateSound
UpdateSound:
push {r4-r7,lr}
mov r7, r8
push {r7}
bl m4aSoundMain
ldr r4, _0800C680
ldrh r0, [r4]
cmp r0, 0
bne _0800C670
b _0800C7E0
_0800C670:
cmp r0, 0x2
beq _0800C6C0
cmp r0, 0x2
bgt _0800C684
cmp r0, 0x1
beq _0800C68E
b _0800C8A2
.align 2, 0
_0800C680: .4byte gUnknown_202D690
_0800C684:
cmp r0, 0x3
beq _0800C700
cmp r0, 0x4
beq _0800C730
b _0800C8A2
_0800C68E:
ldr r2, _0800C69C
ldrh r0, [r2]
cmp r0, 0
beq _0800C6A0
subs r0, 0x1
strh r0, [r2]
b _0800C8A2
.align 2, 0
_0800C69C: .4byte gUnknown_202D692
_0800C6A0:
ldr r3, _0800C6B4
ldrh r1, [r3]
ldr r0, _0800C6B8
cmp r1, r0
bne _0800C6BC
movs r0, 0x4
strh r0, [r4]
movs r0, 0x20
strh r0, [r2]
b _0800C8A2
.align 2, 0
_0800C6B4: .4byte gCurrentFanfareSong
_0800C6B8: .4byte 0x000003e5
_0800C6BC:
ldrh r0, [r3]
b _0800C6E4
_0800C6C0:
ldr r0, _0800C6F0
ldrh r1, [r0]
ldr r0, _0800C6F4
cmp r1, r0
beq _0800C6D8
movs r0, 0
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
beq _0800C6D8
b _0800C8A2
_0800C6D8:
ldr r2, _0800C6F8
ldrh r1, [r2]
ldr r0, _0800C6FC
cmp r1, r0
beq _0800C718
ldrh r0, [r2]
_0800C6E4:
bl m4aSongNumStart
movs r0, 0x3
strh r0, [r4]
b _0800C8A2
.align 2, 0
_0800C6F0: .4byte gCurrentBGSong
_0800C6F4: .4byte 0x000003e7
_0800C6F8: .4byte gCurrentFanfareSong
_0800C6FC: .4byte 0x000003e5
_0800C700:
ldr r0, _0800C724
ldrh r1, [r0]
ldr r0, _0800C728
cmp r1, r0
beq _0800C718
movs r0, 0x1
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
bne _0800C718
b _0800C8A2
_0800C718:
movs r0, 0x4
strh r0, [r4]
ldr r1, _0800C72C
movs r0, 0x20
strh r0, [r1]
b _0800C8A2
.align 2, 0
_0800C724: .4byte gCurrentFanfareSong
_0800C728: .4byte 0x000003e5
_0800C72C: .4byte gUnknown_202D692
_0800C730:
ldr r0, _0800C74C
ldrh r1, [r0]
ldr r0, _0800C750
cmp r1, r0
beq _0800C754
movs r0, 0x1
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
beq _0800C748
b _0800C8A2
_0800C748:
b _0800C75A
.align 2, 0
_0800C74C: .4byte gCurrentFanfareSong
_0800C750: .4byte 0x000003e5
_0800C754:
ldr r0, _0800C76C
bl m4aMPlayStop
_0800C75A:
ldr r1, _0800C770
ldrh r0, [r1]
adds r2, r0, 0
cmp r2, 0
beq _0800C774
subs r0, 0x1
strh r0, [r1]
b _0800C8A2
.align 2, 0
_0800C76C: .4byte gMPlayInfo_Fanfare
_0800C770: .4byte gUnknown_202D692
_0800C774:
ldr r3, _0800C794
ldrh r1, [r3]
ldr r0, _0800C798
cmp r1, r0
beq _0800C7B4
ldr r1, _0800C79C
movs r0, 0x1
strh r0, [r1]
ldr r0, _0800C7A0
ldrb r0, [r0]
cmp r0, 0
beq _0800C7A4
ldrh r0, [r3]
bl m4aSongNumStart
b _0800C7BE
.align 2, 0
_0800C794: .4byte gCurrentBGSong
_0800C798: .4byte 0x000003e7
_0800C79C: .4byte gBGMusicPlayerState
_0800C7A0: .4byte gRestartBGM
_0800C7A4:
ldr r0, _0800C7B0
movs r1, 0x4
bl m4aMPlayFadeIn
b _0800C7BE
.align 2, 0
_0800C7B0: .4byte gMPlayInfo_BGM
_0800C7B4:
ldr r0, _0800C7CC
strh r2, [r0]
ldr r0, _0800C7D0
bl m4aMPlayStop
_0800C7BE:
ldr r1, _0800C7D4
movs r0, 0
strh r0, [r1]
ldr r1, _0800C7D8
ldr r2, _0800C7DC
b _0800C84C
.align 2, 0
_0800C7CC: .4byte gBGMusicPlayerState
_0800C7D0: .4byte gMPlayInfo_BGM
_0800C7D4: .4byte gUnknown_202D690
_0800C7D8: .4byte gCurrentFanfareSong
_0800C7DC: .4byte 0x000003e5
_0800C7E0:
ldr r5, _0800C810
ldrh r0, [r5]
cmp r0, 0
beq _0800C864
cmp r0, 0x3
bgt _0800C8A2
cmp r0, 0x2
bge _0800C81C
cmp r0, 0x1
bne _0800C8A2
ldr r0, _0800C814
ldrh r1, [r0]
ldr r0, _0800C818
cmp r1, r0
beq _0800C80A
movs r0, 0
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
beq _0800C8A2
_0800C80A:
movs r0, 0x2
strh r0, [r5]
b _0800C8A2
.align 2, 0
_0800C810: .4byte gBGMusicPlayerState
_0800C814: .4byte gCurrentBGSong
_0800C818: .4byte 0x000003e7
_0800C81C:
ldr r0, _0800C834
ldrh r1, [r0]
ldr r0, _0800C838
cmp r1, r0
beq _0800C83C
movs r0, 0
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
bne _0800C8A2
b _0800C842
.align 2, 0
_0800C834: .4byte gCurrentBGSong
_0800C838: .4byte 0x000003e7
_0800C83C:
ldr r0, _0800C854
bl m4aMPlayStop
_0800C842:
ldr r1, _0800C858
movs r0, 0
strh r0, [r1]
ldr r1, _0800C85C
ldr r2, _0800C860
_0800C84C:
adds r0, r2, 0
strh r0, [r1]
b _0800C8A2
.align 2, 0
_0800C854: .4byte gMPlayInfo_BGM
_0800C858: .4byte gBGMusicPlayerState
_0800C85C: .4byte gCurrentBGSong
_0800C860: .4byte 0x000003e7
_0800C864:
movs r0, 0
bl IsMusicPlayerPlaying
lsls r0, 24
lsrs r0, 24
cmp r0, 0
bne _0800C8A2
ldr r6, _0800C890
ldrh r2, [r6]
adds r1, r2, 0
ldr r4, _0800C894
cmp r1, r4
beq _0800C89C
movs r0, 0x1
strh r0, [r5]
ldr r0, _0800C898
strh r2, [r0]
adds r0, r1, 0
bl m4aSongNumStart
strh r4, [r6]
b _0800C8A2
.align 2, 0
_0800C890: .4byte gUnknown_202D68C
_0800C894: .4byte 0x000003e7
_0800C898: .4byte gCurrentBGSong
_0800C89C:
strh r0, [r5]
ldr r0, _0800C8C4
strh r1, [r0]
_0800C8A2:
movs r5, 0x2
ldr r4, _0800C8C8
ldr r0, _0800C8CC
mov r8, r0
movs r6, 0x18
movs r7, 0
_0800C8AE:
ldrh r1, [r4, 0x2]
cmp r1, r8
beq _0800C926
ldrh r0, [r4]
cmp r0, 0x1
beq _0800C8D0
cmp r0, 0x1
ble _0800C926
cmp r0, 0x2
beq _0800C8F0
b _0800C926
.align 2, 0
_0800C8C4: .4byte gCurrentBGSong
_0800C8C8: .4byte gUnknown_3000FE8
_0800C8CC: .4byte 0x000003e5
_0800C8D0:
ldr r0, _0800C8EC
cmp r1, r0
beq _0800C8E4
lsls r0, r5, 16
lsrs r0, 16
bl IsMusicPlayerPlaying
lsls r0, 24
cmp r0, 0
beq _0800C926
_0800C8E4:
movs r0, 0x2
strh r0, [r4]
b _0800C926
.align 2, 0
_0800C8EC: .4byte 0x000003e7
_0800C8F0:
lsls r0, r5, 16
lsrs r0, 16
bl IsMusicPlayerPlaying
lsls r0, 24
lsrs r0, 24
cmp r0, 0
beq _0800C91C
ldrb r0, [r4, 0x6]
cmp r0, 0
beq _0800C926
strb r7, [r4, 0x6]
ldr r0, _0800C918
adds r0, r6, r0
ldr r0, [r0]
ldrh r2, [r4, 0x4]
movs r1, 0xFF
bl m4aMPlayVolumeControl
b _0800C926
.align 2, 0
_0800C918: .4byte gMPlayTable
_0800C91C:
strh r0, [r4]
mov r1, r8
strh r1, [r4, 0x2]
strh r0, [r4, 0x4]
strb r7, [r4, 0x6]
_0800C926:
adds r6, 0xC
adds r5, 0x1
adds r4, 0x8
cmp r5, 0x6
ble _0800C8AE
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end UpdateSound
.align 2,0

View File

@ -11,12 +11,12 @@ bool8 IsFanfare(u32 songIndex);
u16 GetMusicPlayerIndex(u16 songIndex);
bool8 IsMusicPlayerPlaying(u16 songIndex);
void StartNewBGM(u16 songIndex);
void FadeInNewBGM(u16 SongIndex, u16 speed);
void FadeInNewBGM(u16 songIndex, u16 speed);
u16 GetCurrentBGSong(void);
void sub_800BF48(u16 SongIndex);
void QueueBGM(u16 songIndex);
void StopBGM(void); // stops all BGM, fanfares and SE's
void FadeOutBGM(u16 speed);
void PlayFanfareSE(u16 SongIndex, u16 param_2);
void PlayFanfareSE(u16 songIndex, u16 volume);
void StopFanfareSE(u16 songIndex);
void FadeOutFanfareSE(u16 songIndex, u16 speed);
bool8 IsFanfareSEPlaying(u16 songIndex);
@ -36,6 +36,7 @@ enum MusicPlayerIndex
INDEX_SE6,
};
// TODO: continue to doc the rest of BG/Fanfare Player States
enum BG_Player_State
{
BG_PLAYER_STATE_INITIALIZE = 0,
@ -43,4 +44,10 @@ enum BG_Player_State
BG_PLAYER_STATE_STOPPED = 4,
};
enum Fanfare_Player_State
{
FANFARE_PLAYER_STATE_INITIALIZE = 0,
FANFARE_PLAYER_STATE_PLAYING = 3,
};
#endif //GUARD_MUSIC_H

View File

@ -72,8 +72,6 @@ SECTIONS {
src/file_system.o(.text);
src/main.o(.text);
asm/code_800B5F0.o(.text);
src/music_pre.o(.text);
asm/music.o(.text);
src/music.o(.text);
src/code_800C9CC.o(.text);
src/cpu.o(.text);

View File

@ -191,9 +191,9 @@ void xxx_call_fade_in_new_bgm(u16 songIndex, u16 speed)
FadeInNewBGM(songIndex, speed);
}
void sub_8011914(u16 songIndex)
void xxx_call_queue_bgm(u16 songIndex)
{
sub_800BF48(songIndex);
QueueBGM(songIndex);
}
void xxx_call_stop_bgm()

File diff suppressed because it is too large Load Diff

View File

@ -1,945 +0,0 @@
#include "global.h"
#include "gba/io_reg.h"
#include "m4a.h"
#include "bg.h"
#include "music.h"
#include "input.h"
#include "constants/bg_music.h"
extern bool8 EnableInterrupts(void);
extern bool8 DisableInterrupts(void);
extern void SoundBiasReset();
extern void SoundBiasSet();
extern void AckInterrupt(u16);
extern void nullsub_25();
extern void nullsub_18();
extern void UpdateSound();
extern void nullsub_21(u16);
typedef void (*IntrCallback)(void);
extern IntrCallback gIntrCallbacks[];
struct unkStruct_202D648
{
s16 unk0;
s16 unk2; // Vcount??
IntrCallback unk4; // some function... just making it IntrCallback for now
};
extern struct unkStruct_202D648 gUnknown_202D648[8];
extern struct unkStruct_202D648 gUnknown_202D608[8];
extern struct MusicPlayerInfo gMPlayInfo_BGM; // BGM??
extern u32 gUnknown_203B0A0;
extern u32 gUnknown_203B0A4;
extern u16 gBGMusicPlayerState;
extern u16 gCurrentBGSong;
extern u16 gUnknown_202D68C;
extern u16 gCurrentFanfareSong;
extern u16 gUnknown_202D690;
extern u16 gUnknown_202D692;
extern bool8 gRestartBGM;
extern u8 gUnknown_203B099;
extern u8 gUnknown_203B09B;
extern u32 gUnknown_203B09C;
extern u8 gUnknown_203B09A;
extern u32 gUnknown_203B0A0;
extern s16 gUnknown_203B0AA;
extern s16 gUnknown_203B0AC;
extern s16 gUnknown_203B0AE;
extern s16 gUnknown_203B0B0;
extern s16 gUnknown_203B0B2;
// PMD keeps it's own copy of music players for some reason
struct PMDMusicPlayer
{
u16 unk0;
u16 songIndex;
u16 unk4;
u8 unk6;
};
extern struct PMDMusicPlayer gUnknown_3000FD8[8];
extern struct PMDMusicPlayer gUnknown_3000FE8[8];
extern u8 gUnknown_202D7FE;
extern u16 gBldCnt;
extern struct BGControlStruct gBG0Control;
extern struct BGControlStruct gBG1Control;
extern struct BGControlStruct gBG2Control;
extern struct BGControlStruct gBG3Control;
enum
{
BG0,
BG1,
BG2,
BG3,
NUM_BGS
};
extern void SoundVSync();
extern void BlinkSavingIcon();
void StopBGM(void);
void xxx_update_bg_sound_input(void);
void UnusedIntrFunc(void)
{
}
void VBlankIntr(void)
{
int index;
gUnknown_203B0A0++;
SoundVSync();
BlinkSavingIcon();
if (gIntrCallbacks[1] != NULL) {
gIntrCallbacks[1]();
}
for(index = 0; index < gUnknown_203B0AA; index++) {
gUnknown_202D648[index] = gUnknown_202D608[index];
}
gUnknown_203B0AC = gUnknown_203B0AA;
gUnknown_203B0AE = -1;
gUnknown_203B0B0 = -1;
gUnknown_203B0B2 = -1;
REG_DISPSTAT = DISPSTAT_VBLANK_INTR | DISPSTAT_VCOUNT_INTR;
if (gUnknown_203B099 == 0) {
UpdateSound();
}
AckInterrupt(INTR_FLAG_VBLANK);
}
// Registers are a little off.. seems to be around the while loop
#ifdef NONMATCHING
void VCountIntr(void)
{
s32 sVar1;
s32 sVar2;
// Hack to get the lsr/asr shifts
sVar2 = REG_VCOUNT << 16;
sVar2 = sVar2 >> 16;
if (gUnknown_203B0AE < 0) {
if (gIntrCallbacks[2] != 0) {
gIntrCallbacks[2]();
}
gUnknown_203B0AE = 0;
}
if (gUnknown_203B0AE < gUnknown_203B0AC) {
sVar1 = gUnknown_202D648[gUnknown_203B0AE].unk2;
while (sVar1 <= sVar2) {
if ( gUnknown_202D648[gUnknown_203B0AE].unk4 != NULL) {
gUnknown_202D648[gUnknown_203B0AE].unk4();
}
gUnknown_203B0AE++;
if (gUnknown_203B0AC >= gUnknown_203B0AE) break;
sVar1 = gUnknown_202D648[gUnknown_203B0AE].unk2;
}
if (gUnknown_203B0AE < gUnknown_203B0AC) {
REG_DISPSTAT = gUnknown_202D648[gUnknown_203B0AE].unk2 << 8 | DISPSTAT_VBLANK_INTR | DISPSTAT_VCOUNT_INTR;
}
}
AckInterrupt(INTR_FLAG_VCOUNT);
}
#else
NAKED
void VCountIntr(void)
{
asm_unified(
"\tpush {r4-r7,lr}\n"
"\tmov r7, r8\n"
"\tpush {r7}\n"
"\tldr r0, _0800BA44\n"
"\tldrh r0, [r0]\n"
"\tlsls r0, 16\n"
"\tasrs r6, r0, 16\n"
"\tldr r0, _0800BA48\n"
"\tmovs r2, 0\n"
"\tldrsh r1, [r0, r2]\n"
"\tadds r7, r0, 0\n"
"\tcmp r1, 0\n"
"\tbge _0800B9B2\n"
"\tldr r0, _0800BA4C\n"
"\tldr r0, [r0, 0x8]\n"
"\tcmp r0, 0\n"
"\tbeq _0800B9AE\n"
"\tbl _call_via_r0\n"
"_0800B9AE:\n"
"\tmovs r0, 0\n"
"\tstrh r0, [r7]\n"
"_0800B9B2:\n"
"\tldr r0, _0800BA50\n"
"\tmovs r3, 0\n"
"\tldrsh r2, [r7, r3]\n"
"\tmovs r3, 0\n"
"\tldrsh r1, [r0, r3]\n"
"\tmov r8, r0\n"
"\tcmp r2, r1\n"
"\tbge _0800BA34\n"
"\tldr r1, _0800BA54\n"
"\tadds r0, r2, 0\n"
"\tlsls r0, 3\n"
"\tadds r0, r1\n"
"\tmovs r3, 0x2\n"
"\tldrsh r0, [r0, r3]\n"
"\tcmp r0, r6\n"
"\tbgt _0800BA10\n"
"\tadds r5, r1, 0\n"
"\tadds r4, r7, 0\n"
"_0800B9D6:\n"
"\tmovs r1, 0\n"
"\tldrsh r0, [r4, r1]\n"
"\tlsls r0, 3\n"
"\tadds r1, r5, 0x4\n"
"\tadds r0, r1\n"
"\tldr r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbeq _0800B9EA\n"
"\tbl _call_via_r0\n"
"_0800B9EA:\n"
"\tldrh r0, [r4]\n"
"\tadds r0, 0x1\n"
"\tstrh r0, [r4]\n"
"\tldr r1, _0800BA50\n"
"\tlsls r0, 16\n"
"\tasrs r0, 16\n"
"\tmovs r2, 0\n"
"\tldrsh r1, [r1, r2]\n"
"\tcmp r0, r1\n"
"\tbge _0800BA34\n"
"\tmovs r3, 0\n"
"\tldrsh r0, [r4, r3]\n"
"\tlsls r0, 3\n"
"\tadds r0, r5\n"
"\tmovs r1, 0x2\n"
"\tldrsh r0, [r0, r1]\n"
"\tldr r7, _0800BA48\n"
"\tcmp r0, r6\n"
"\tble _0800B9D6\n"
"_0800BA10:\n"
"\tmovs r2, 0\n"
"\tldrsh r1, [r7, r2]\n"
"\tmov r3, r8\n"
"\tmovs r2, 0\n"
"\tldrsh r0, [r3, r2]\n"
"\tcmp r1, r0\n"
"\tbge _0800BA34\n"
"\tldr r2, _0800BA58\n"
"\tldr r1, _0800BA54\n"
"\tmovs r3, 0\n"
"\tldrsh r0, [r7, r3]\n"
"\tlsls r0, 3\n"
"\tadds r0, r1\n"
"\tldrh r0, [r0, 0x2]\n"
"\tlsls r0, 8\n"
"\tmovs r1, 0x28\n"
"\torrs r0, r1\n"
"\tstrh r0, [r2]\n"
"_0800BA34:\n"
"\tmovs r0, 0x4\n"
"\tbl AckInterrupt\n"
"\tpop {r3}\n"
"\tmov r8, r3\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0800BA44: .4byte 0x04000006\n"
"_0800BA48: .4byte gUnknown_203B0AE\n"
"_0800BA4C: .4byte gIntrCallbacks\n"
"_0800BA50: .4byte gUnknown_203B0AC\n"
"_0800BA54: .4byte gUnknown_202D648\n"
"_0800BA58: .4byte 0x04000004"
);
}
#endif
void sub_800BA5C(void)
{
if(gUnknown_203B09A != 0)
{
gUnknown_203B09C++;
xxx_update_bg_sound_input();
}
gUnknown_203B09A = 1;
gUnknown_203B09B = 0;
gUnknown_203B09C = 0;
nullsub_25();
while(REG_VCOUNT > 159){}
gUnknown_203B099 = 1;
VBlankIntrWait();
nullsub_18();
}
void xxx_update_bg_sound_input(void)
{
if(gUnknown_203B09B != 0){
gUnknown_203B09C++;
}
else {
gUnknown_203B09B = 1;
gUnknown_203B09A = 0;
gUnknown_203B09C = 0;
UpdateBGControlRegisters();
if(gUnknown_203B099 != 0)
UpdateSound();
UpdateInput();
gUnknown_203B099 = 0;
gUnknown_203B0A4 = gUnknown_203B0A0;
}
}
void Timer3Intr(void)
{
if(gIntrCallbacks[4])
gIntrCallbacks[4]();
AckInterrupt(INTR_FLAG_TIMER3);
}
// Unused
u32 sub_800BB34(void)
{
return gUnknown_203B0A0;
}
void nullsub_178(void)
{
}
// Unused
void sub_800BB44(void)
{
u16 ie_store;
u16 dispcnt_store;
bool8 interrupt_flag;
while(REG_KEYINPUT != KEYS_MASK){}
interrupt_flag = DisableInterrupts();
while(REG_VCOUNT < 160){}
dispcnt_store = REG_DISPCNT;
REG_DISPCNT = DISPCNT_FORCED_BLANK;
*(vu16 *)BG_PLTT = RGB_WHITE;
ie_store = REG_IE;
REG_IE = INTR_FLAG_KEYPAD | INTR_FLAG_GAMEPAK;
REG_KEYCNT = KEY_AND_INTR | R_BUTTON | L_BUTTON | SELECT_BUTTON; // 0x8304
REG_IME = 1;
SoundBiasReset();
asm("swi 0x3");
SoundBiasSet();
REG_IME = 0;
REG_IE = ie_store;
REG_KEYCNT = 0;
REG_DISPCNT = dispcnt_store;
*(vu16 *)BG_PLTT = RGB_BLACK;
if(interrupt_flag)
EnableInterrupts();
while(REG_KEYINPUT != KEYS_MASK){}
}
void nullsub_17(void)
{
}
void UpdateBGControlRegisters(void)
{
u32 BGCNT_Priority[NUM_BGS];
if(gUnknown_202D7FE == 1)
{
BGCNT_Priority[BG0] = BGCNT_PRIORITY(1);
BGCNT_Priority[BG1] = BGCNT_PRIORITY(2);
BGCNT_Priority[BG2] = BGCNT_PRIORITY(0);
BGCNT_Priority[BG3] = BGCNT_PRIORITY(3);
}
else
{
BGCNT_Priority[BG0] = BGCNT_PRIORITY(0);
BGCNT_Priority[BG1] = BGCNT_PRIORITY(1);
BGCNT_Priority[BG2] = BGCNT_PRIORITY(2);
BGCNT_Priority[BG3] = BGCNT_PRIORITY(3);
}
REG_BG0HOFS = gBG0Control.hofs;
REG_BG0VOFS = gBG0Control.vofs;
REG_BG1HOFS = gBG1Control.hofs;
REG_BG1VOFS = gBG1Control.vofs;
REG_BG2HOFS = gBG2Control.hofs;
REG_BG2VOFS = gBG2Control.vofs;
REG_BG3HOFS = gBG3Control.hofs;
REG_BG3VOFS = gBG3Control.vofs;
REG_BG0CNT = BGCNT_Priority[BG0] | BGCNT_SCREENBASE(12) | BGCNT_CHARBASE(0) | BGCNT_WRAP; // 0x2C00
REG_BG1CNT = BGCNT_Priority[BG1] | BGCNT_SCREENBASE(13) | BGCNT_CHARBASE(0) | BGCNT_WRAP; // 0x2D00
if(gBG2Control.unk2 == 0x8000)
REG_BG2CNT = BGCNT_Priority[BG2] | BGCNT_SCREENBASE(14) | BGCNT_CHARBASE(2) | BGCNT_WRAP; // 0x2E08
else
REG_BG2CNT = BGCNT_Priority[BG2] | BGCNT_SCREENBASE(14) | BGCNT_CHARBASE(0) | BGCNT_WRAP; // 0x2E00
REG_BG3CNT = BGCNT_Priority[BG3] | BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_WRAP;
REG_BLDCNT = gBldCnt;
}
void InitMusic(void)
{
s32 playerIndex;
struct PMDMusicPlayer *musicPlayer;
DmaStop(0);
DmaStop(1);
DmaStop(2);
DmaStop(3);
m4aSoundInit();
gBGMusicPlayerState = 0;
gCurrentBGSong = 999;
gUnknown_202D68C = 999;
gCurrentFanfareSong = 997;
gUnknown_202D690 = 0;
gUnknown_202D692 = 0;
gRestartBGM = FALSE;
for(playerIndex = INDEX_BGM, musicPlayer = &gUnknown_3000FD8[0]; playerIndex < INDEX_SE6 + 1; playerIndex++, musicPlayer++)
{
musicPlayer->unk0 = 0;
musicPlayer->songIndex = 997;
musicPlayer->unk4 = 0;
musicPlayer->unk6 = 0;
}
nullsub_19();
}
void StopAllMusic(void)
{
StopBGM();
StopFanfareSE(998);
StopFanfareSE(997);
}
void StartNewBGM(u16 songIndex)
{
bool8 interrupt_flag;
if(!IsBGSong(songIndex))
return;
if(songIndex == 999)
return;
if(songIndex == gCurrentBGSong)
{
if((u16)(gBGMusicPlayerState - 1) <= 1)
return;
}
if(GetMusicPlayerIndex(songIndex) != INDEX_BGM)
{
nullsub_20(songIndex);
return;
}
interrupt_flag = DisableInterrupts();
gCurrentBGSong = songIndex;
gRestartBGM = TRUE;
if(gUnknown_202D690 == 0)
{
gBGMusicPlayerState = BG_PLAYER_STATE_PLAYING;
m4aSongNumStart(songIndex);
}
if(interrupt_flag)
EnableInterrupts();
}
void FadeInNewBGM(u16 songIndex, u16 speed)
{
bool8 interrupt_flag;
if(!IsBGSong(songIndex))
return;
if(songIndex == 999)
return;
if(songIndex == gCurrentBGSong)
{
if((u16)(gBGMusicPlayerState - 1) <= 1)
return;
}
if((speed > 256))
{
speed = 16;
}
else
{
if((speed >>= 4) == 0)
{
speed = 1;
}
}
interrupt_flag = DisableInterrupts();
gCurrentBGSong = songIndex;
gRestartBGM = TRUE;
if(gUnknown_202D690 == 0)
{
gBGMusicPlayerState = BG_PLAYER_STATE_PLAYING;
m4aSongNumStart(songIndex);
m4aMPlayImmInit(&gMPlayInfo_BGM);
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFF, 0);
m4aSongNumStop(songIndex);
m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);
}
if(interrupt_flag)
EnableInterrupts();
}
void sub_800BF48(u16 songIndex)
{
u16 preload = gCurrentBGSong;
if(preload == 999)
{
StartNewBGM(songIndex);
gUnknown_202D68C = preload;
return;
}
gUnknown_202D68C = songIndex;
}
void StopBGM(void)
{
bool8 interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
if(gCurrentBGSong != 999)
{
m4aMPlayStop(&gMPlayInfo_BGM);
}
}
gCurrentBGSong = 999;
gUnknown_202D68C = 999;
if(interrupt_flag)
EnableInterrupts();
}
void FadeOutBGM(u16 speed)
{
u32 comparison;
bool8 interrupt_flag;
// TODO clean this comparison up
comparison = 0x80 << 17; // 16777216
if((speed * 65536) > comparison)
{
speed = 16;
}
else
{
if((speed >>= 4) == 0)
{
speed = 1;
}
}
interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
if(gCurrentBGSong != 999)
{
if(gBGMusicPlayerState == 2)
{
gBGMusicPlayerState = 3;
m4aMPlayFadeOut(&gMPlayInfo_BGM, speed);
}
else
{
gCurrentBGSong = 999;
m4aMPlayStop(&gMPlayInfo_BGM);
}
}
}
else
{
gCurrentBGSong = 999;
}
gUnknown_202D68C = 999;
if(interrupt_flag)
EnableInterrupts();
}
u16 GetCurrentBGSong(void)
{
return gCurrentBGSong;
}
void PlayFanfareSE(u16 songIndex, u16 param_2)
{
bool8 interrupt_flag;
bool8 interrupt_flag2;
u16 playerIndex;
struct PMDMusicPlayer *musicPlayer;
if (songIndex == 997)
return;
if (param_2 > 256)
param_2 = 256;
if (IsFanfare(songIndex))
{
if (GetMusicPlayerIndex(songIndex) == INDEX_FANFARE) {
interrupt_flag = DisableInterrupts();
gCurrentFanfareSong = songIndex;
if(gUnknown_202D690 == 0)
{
if (gCurrentBGSong != 999)
{
if ((u16)(gBGMusicPlayerState - 1) < 2)
{
gUnknown_202D690 = 1;
gUnknown_202D692 = 16;
gRestartBGM = FALSE;
m4aMPlayFadeOutTemporarily(&gMPlayInfo_BGM, 1);
}
else if (gBGMusicPlayerState == 3)
gUnknown_202D690 = 2;
else
{
gUnknown_202D690 = 3;
m4aMPlayStop(&gMPlayInfo_BGM);
m4aSongNumStart(gCurrentFanfareSong);
}
}
else
{
gUnknown_202D690 = 3;
m4aMPlayStop(&gMPlayInfo_BGM);
m4aSongNumStart(gCurrentFanfareSong);
}
}
else
{
if (1 < (u16)(gUnknown_202D690 - 1))
{
m4aMPlayStop(&gMPlayInfo_BGM);
m4aSongNumStart(gCurrentFanfareSong);
gUnknown_202D690 = 3;
}
}
switch(gCurrentBGSong)
{
case MUS_RAYQUAZAS_DOMAIN:
case MUS_FRIEND_AREA_STRATOS_LOOKOUT:
case MUS_FRIEND_AREA_RAINBOW_PEAK:
case MUS_DREAM_EATER:
case MUS_FRIEND_AREA_DEEPSEA_CURRENT:
case MUS_FRIEND_AREA_SEAFLOOR_CAVE:
case MUS_FRIEND_AREA_VOLCANIC_PIT:
case MUS_FRIEND_AREA_CRYPTIC_CAVE:
case MUS_THE_OTHER_SIDE:
case MUS_THE_MOUNTAIN_OF_FIRE:
case MUS_FRIEND_AREA_LEGENDARY_ISLAND:
case MUS_FRIEND_AREA_SOUTHERN_ISLAND:
case MUS_FRIEND_AREA_ENCLOSED_ISLAND:
case MUS_FRIEND_AREA_FINAL_ISLAND:
case MUS_FRIEND_AREA_HEALING_FOREST:
gRestartBGM = TRUE;
break;
default:
break;
}
if (interrupt_flag)
EnableInterrupts();
}
else
{
nullsub_20(songIndex);
}
}
else
{
if (!IsSoundEffect(songIndex))
return;
playerIndex = GetMusicPlayerIndex(songIndex);
musicPlayer = &gUnknown_3000FD8[playerIndex]; // need to load this before comparison to match
if (playerIndex < INDEX_SE1)
nullsub_20(songIndex);
else
{
interrupt_flag2 = DisableInterrupts();
m4aSongNumStart(songIndex);
musicPlayer->unk0 = 1;
musicPlayer->songIndex = songIndex;
if(param_2 == 256)
{
musicPlayer->unk6 = 0;
}
else
{
musicPlayer->unk6 = 1;
}
musicPlayer->unk4 = param_2;
if (interrupt_flag2)
EnableInterrupts();
}
}
}
void SetSoundEffectVolume(u16 songIndex, u16 volume)
{
bool8 interrupt_flag;
u16 playerIndex;
struct MusicPlayerInfo *info;
struct PMDMusicPlayer *musicPlayer;
if (256 < volume) {
volume = 256;
}
if ((!IsFanfare(songIndex)) && (IsSoundEffect(songIndex))) {
playerIndex = GetMusicPlayerIndex(songIndex);
info = gMPlayTable[playerIndex].info;
musicPlayer = &gUnknown_3000FD8[playerIndex];
if (playerIndex >= INDEX_SE1) {
interrupt_flag = DisableInterrupts();
if (musicPlayer->songIndex == songIndex) {
m4aMPlayVolumeControl(info, 0xf, volume);
}
if (interrupt_flag)
EnableInterrupts();
}
}
}
void StopFanfareSE(u16 songIndex)
{
// Each section needs a var for interrupts..
char cVar1;
char cVar2;
char cVar3;
char cVar4;
u32 playerIndex;
s32 playerIndex2;
struct MusicPlayerInfo *info;
struct PMDMusicPlayer *musicPlayer;
struct PMDMusicPlayer *musicPlayer1;
if (songIndex == 997) {
cVar1 = DisableInterrupts();
for(playerIndex2 = INDEX_SE1, musicPlayer1 = &gUnknown_3000FE8[0]; playerIndex2 < INDEX_SE6; playerIndex2++, musicPlayer1++)
{
m4aMPlayStop(gMPlayTable[playerIndex2].info);
musicPlayer1->unk0 = 0;
musicPlayer1->songIndex = 997;
musicPlayer1->unk4 = 0;
musicPlayer1->unk6 = 0;
}
if (cVar1 != '\0') {
EnableInterrupts();
}
}
else if (IsSoundEffect(songIndex))
{
playerIndex = GetMusicPlayerIndex(songIndex);
info = gMPlayTable[playerIndex].info;
musicPlayer = &gUnknown_3000FD8[playerIndex];
if (playerIndex < INDEX_SE1) {
nullsub_21(songIndex);
}
else {
cVar2 = DisableInterrupts();
if (musicPlayer->songIndex == songIndex) {
m4aMPlayStop(info);
musicPlayer->unk0 = 0;
musicPlayer->songIndex = 997;
musicPlayer->unk4 = 0;
musicPlayer->unk6 = 0;
}
if (cVar2 != '\0') {
EnableInterrupts();
}
}
}
else if (songIndex == 998)
{
cVar3 = DisableInterrupts();
if (gUnknown_202D690 != 0) {
if (gCurrentFanfareSong != 997) {
gCurrentFanfareSong = 997;
m4aMPlayStop(&gMPlayInfo_Fanfare);
}
}
if (cVar3 != '\0') {
EnableInterrupts();
}
}
else if (IsFanfare(songIndex))
{
cVar4 = DisableInterrupts();
if (gUnknown_202D690 != 0) {
if (gCurrentFanfareSong == songIndex) {
gCurrentFanfareSong = 997;
m4aMPlayStop(&gMPlayInfo_Fanfare);
}
}
if (cVar4 != '\0') {
EnableInterrupts();
}
}
}
void FadeOutFanfareSE(u16 songIndex, u16 speed)
{
char cVar1;
char cVar2;
char cVar3;
char cVar4;
u32 comparison;
s32 playerIndex2;
u32 playerIndex;
struct PMDMusicPlayer *musicPlayer;
struct PMDMusicPlayer *musicPlayer1;
struct MusicPlayerInfo *playerInfo;
comparison = 0x80 << 17; // 16777216
if((speed * 65536) > comparison)
{
speed = 16;
}
else
{
if((speed >>= 4) == 0)
{
speed = 1;
}
}
if (songIndex == 997) {
cVar1 = DisableInterrupts();
for(playerIndex2 = INDEX_SE1, musicPlayer1 = &gUnknown_3000FE8[0]; playerIndex2 < INDEX_SE6; playerIndex2++, musicPlayer1++)
{
if (musicPlayer1->songIndex != 997) {
if (IsMusicPlayerPlaying(playerIndex2)) {
m4aMPlayFadeOut(gMPlayTable[playerIndex2].info,speed);
}
else {
m4aMPlayStop(gMPlayTable[playerIndex2].info);
musicPlayer1->unk0 = 0;
musicPlayer1->songIndex = 997;
musicPlayer1->unk4 = 0;
musicPlayer1->unk6 = 0;
}
}
}
if (cVar1 != '\0') {
EnableInterrupts();
}
}
else if (IsSoundEffect(songIndex)) {
playerIndex = GetMusicPlayerIndex(songIndex);
musicPlayer = &gUnknown_3000FD8[playerIndex];
playerInfo = gMPlayTable[playerIndex].info;
cVar2 = DisableInterrupts();
if (musicPlayer->songIndex != 997) {
if (IsMusicPlayerPlaying(playerIndex)) {
m4aMPlayFadeOut(playerInfo,speed);
}
else {
m4aMPlayStop(playerInfo);
musicPlayer->unk0 = 0;
musicPlayer->songIndex = 997;
musicPlayer->unk4 = 0;
musicPlayer->unk6 = 0;
}
}
if (cVar2 != '\0') {
EnableInterrupts();
}
}
else if (songIndex == 998) {
cVar3 = DisableInterrupts();
if ((gUnknown_202D690 != 0) && (gCurrentFanfareSong != 997)) {
if (IsMusicPlayerPlaying(INDEX_FANFARE)) {
m4aMPlayFadeOut(&gMPlayInfo_Fanfare,speed);
}
else {
m4aMPlayStop(&gMPlayInfo_Fanfare);
gCurrentFanfareSong = 997;
}
}
if (cVar3 != '\0') {
EnableInterrupts();
}
}
else if (IsFanfare(songIndex)) {
cVar4 = DisableInterrupts();
if ((gUnknown_202D690 != 0) && (gCurrentFanfareSong == songIndex)) {
if (IsMusicPlayerPlaying(INDEX_FANFARE)) {
m4aMPlayFadeOut(&gMPlayInfo_Fanfare,speed);
}
else {
m4aMPlayStop(&gMPlayInfo_Fanfare);
gCurrentFanfareSong = 997;
}
}
if (cVar4 != '\0') {
EnableInterrupts();
}
}
}
bool8 IsFanfareSEPlaying(u16 songIndex)
{
u32 playerIndex;
struct PMDMusicPlayer *musicPlayer;
register u32 songIndex_u32 asm("r4");
register u32 songIndex_u32_2 asm("r5");
songIndex_u32 = songIndex;
songIndex_u32_2 = songIndex_u32;
if (IsFanfare(songIndex_u32)) {
if ((gUnknown_202D690 != 0) && (gCurrentFanfareSong == songIndex_u32)) {
return TRUE;
}
}
else
{
if (IsSoundEffect(songIndex_u32)) {
playerIndex = GetMusicPlayerIndex(songIndex_u32);
musicPlayer = &gUnknown_3000FD8[playerIndex];
if ((INDEX_SE1 <= playerIndex) && (musicPlayer->songIndex == songIndex_u32_2)) {
return TRUE;
}
}
}
return FALSE;
}
void SoundVSync(void)
{
u8 cVar1;
cVar1 = DisableInterrupts();
m4aSoundVSync();
if(cVar1)
EnableInterrupts();
}
void nullsub_18(void)
{
}

View File

@ -317,13 +317,13 @@ gBGMusicPlayerState = .; /* 202D688 */
gCurrentBGSong = .; /* 202D68A */
. += 0x2;
gUnknown_202D68C = .; /* 202D68C */
gQueuedBGSong = .; /* 202D68C */
. += 0x2;
gCurrentFanfareSong = .; /* 202D68E */
. += 0x2;
gUnknown_202D690 = .; /* 202D690 */
gFanfareMusicPlayerState = .; /* 202D690 */
. += 0x2;
gUnknown_202D692 = .; /* 202D692 */