mirror of
https://github.com/pret/pmd-red.git
synced 2026-09-08 09:05:59 -05:00
more work on music functions
This commit is contained in:
1508
asm/code_800B5F0.s
1508
asm/code_800B5F0.s
File diff suppressed because it is too large
Load Diff
1178
asm/music.s
Normal file
1178
asm/music.s
Normal file
File diff suppressed because it is too large
Load Diff
25
include/m4a.h
Normal file
25
include/m4a.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#ifndef GUARD_M4A_H
|
||||
#define GUARD_M4A_H
|
||||
|
||||
#include "gba/m4a_internal.h"
|
||||
|
||||
void m4aSoundVSyncOn(void);
|
||||
void m4aSoundVSyncOff(void);
|
||||
|
||||
void m4aSoundInit(void);
|
||||
void m4aSoundMain(void);
|
||||
void m4aSongNumStart(u16 n);
|
||||
void m4aSongNumStartOrChange(u16 n);
|
||||
void m4aSongNumStop(u16 n);
|
||||
void m4aMPlayAllStop(void);
|
||||
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
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 m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
|
||||
|
||||
extern struct MusicPlayerInfo gUnknown_20008F0; // BGM??
|
||||
|
||||
|
||||
#endif //GUARD_M4A_H
|
||||
@@ -73,6 +73,8 @@ SECTIONS {
|
||||
asm/code_800B540.o(.text);
|
||||
src/code_800B5F0.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);
|
||||
asm/code_800C9CC.o(.text);
|
||||
|
||||
14
src/music.c
14
src/music.c
@@ -1,5 +1,5 @@
|
||||
#include "global.h"
|
||||
#include "gba/m4a_internal.h"
|
||||
#include "m4a.h"
|
||||
|
||||
#define NUM_BG_SONGS 128
|
||||
|
||||
@@ -9,24 +9,18 @@ extern void sub_809C730();
|
||||
|
||||
extern bool8 DisableInterrupts();
|
||||
extern bool8 EnableInterrupts();
|
||||
extern void m4aSoundVSyncOn();
|
||||
extern void m4aSongNumStart(u16);
|
||||
extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
extern void m4aSoundVSyncOff();
|
||||
extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
|
||||
|
||||
extern void sub_800C3F8(u16, u16);
|
||||
extern void Random();
|
||||
extern void sub_800BA5C();
|
||||
extern void xxx_update_bg_sound_input();
|
||||
|
||||
extern u16 gUnknown_202D690;
|
||||
extern u16 gUnknown_202D68A;
|
||||
extern u16 gUnknown_202D688;
|
||||
extern u16 gUnknown_202D68A;
|
||||
extern u16 gUnknown_202D690;
|
||||
extern u8 gUnknown_202D694;
|
||||
extern u32 gUnknown_203B0B8;
|
||||
extern u16 gUnknown_203B0BC;
|
||||
extern struct MusicPlayerInfo gUnknown_20008F0;
|
||||
|
||||
bool8 IsBGSong(u32);
|
||||
bool8 sub_800CAAC(u32);
|
||||
@@ -232,7 +226,7 @@ bool8 sub_800CAF0(u16 songIndex)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void nullsub_20(void)
|
||||
void nullsub_20(u16 songIndex)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
281
src/music_pre.c
Normal file
281
src/music_pre.c
Normal file
@@ -0,0 +1,281 @@
|
||||
#include "global.h"
|
||||
#include "gba/io_reg.h"
|
||||
#include "m4a.h"
|
||||
|
||||
extern void nullsub_19(void);
|
||||
extern void nullsub_20(u16 songIndex);
|
||||
extern bool8 EnableInterrupts(void);
|
||||
extern bool8 DisableInterrupts(void);
|
||||
extern bool8 IsBGSong(u32);
|
||||
|
||||
extern void sub_800C298(u16 r0);
|
||||
extern u16 sub_800CAE0(u16);
|
||||
|
||||
extern u32 gUnknown_202D5F0[];
|
||||
extern u16 gUnknown_202D688;
|
||||
extern u16 gUnknown_202D68A;
|
||||
extern u16 gUnknown_202D68C;
|
||||
extern u16 gUnknown_202D68E;
|
||||
extern u16 gUnknown_202D690;
|
||||
extern u16 gUnknown_202D692;
|
||||
extern u8 gUnknown_202D694;
|
||||
|
||||
struct unkStruct_3000FD8
|
||||
{
|
||||
u16 unk0;
|
||||
u16 unk2;
|
||||
u16 unk4;
|
||||
u8 unk6;
|
||||
u8 padding;
|
||||
};
|
||||
|
||||
extern struct unkStruct_3000FD8 gUnknown_3000FD8[];
|
||||
|
||||
void sub_800BF80(void);
|
||||
|
||||
void sub_800BD08(void)
|
||||
{
|
||||
s32 counter;
|
||||
u16 zero;
|
||||
u16 zero2;
|
||||
|
||||
struct unkStruct_3000FD8 *preload;
|
||||
|
||||
DmaStop(0);
|
||||
DmaStop(1);
|
||||
DmaStop(2);
|
||||
DmaStop(3);
|
||||
|
||||
m4aSoundInit();
|
||||
|
||||
gUnknown_202D688 = 0;
|
||||
gUnknown_202D68A = 0x3e7;
|
||||
gUnknown_202D68C = 0x3e7;
|
||||
gUnknown_202D68E = 0x3e5;
|
||||
gUnknown_202D690 = 0;
|
||||
gUnknown_202D692 = 0;
|
||||
gUnknown_202D694 = 0;
|
||||
|
||||
// Kinda hacky but makes things match
|
||||
preload = gUnknown_3000FD8;
|
||||
zero = 0;
|
||||
zero2 = 0;
|
||||
counter = 7;
|
||||
|
||||
while(counter >= 0)
|
||||
{
|
||||
preload->unk0 = zero2;
|
||||
preload->unk2 = 0x3e5;
|
||||
preload->unk4 = zero2;
|
||||
preload->unk6 = zero;
|
||||
counter--;
|
||||
preload++;
|
||||
}
|
||||
nullsub_19();
|
||||
}
|
||||
|
||||
void sub_800BDDC(void)
|
||||
{
|
||||
sub_800BF80();
|
||||
sub_800C298(0x3e6);
|
||||
sub_800C298(0x3e5);
|
||||
}
|
||||
|
||||
|
||||
void sub_800BDFC(u16 songIndex)
|
||||
{
|
||||
bool8 interrupt_flag;
|
||||
u16 temp_store;
|
||||
|
||||
if(!IsBGSong(songIndex))
|
||||
return;
|
||||
if(songIndex == 0x3e7)
|
||||
return;
|
||||
if(songIndex == gUnknown_202D68A)
|
||||
{
|
||||
temp_store = gUnknown_202D688 - 1;
|
||||
if(temp_store <= 1)
|
||||
return;
|
||||
}
|
||||
if(sub_800CAE0(songIndex))
|
||||
{
|
||||
nullsub_20(songIndex);
|
||||
return;
|
||||
}
|
||||
interrupt_flag = DisableInterrupts();
|
||||
gUnknown_202D68A = songIndex;
|
||||
gUnknown_202D694 = 1;
|
||||
|
||||
if(gUnknown_202D690 == 0)
|
||||
{
|
||||
gUnknown_202D688 = 1;
|
||||
m4aSongNumStart(songIndex);
|
||||
}
|
||||
if(interrupt_flag)
|
||||
EnableInterrupts();
|
||||
}
|
||||
|
||||
#ifndef NONMATCHING
|
||||
NAKED
|
||||
#endif
|
||||
void sub_800BE8C(u16 SongIndex, u16 r1)
|
||||
{
|
||||
#ifdef NONMATCHING
|
||||
// TODO regswap memes
|
||||
bool8 interrupt_flag;
|
||||
u16 temp_store;
|
||||
|
||||
if(!IsBGSong(SongIndex))
|
||||
return;
|
||||
if(SongIndex == 0x3e7)
|
||||
return;
|
||||
if(SongIndex == gUnknown_202D68A)
|
||||
{
|
||||
temp_store = gUnknown_202D688 - 1;
|
||||
if((temp_store) <= 1)
|
||||
return;
|
||||
}
|
||||
|
||||
if((r1 > 0x80 << 1))
|
||||
{
|
||||
r1 = 0x10;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if(r1 >> 4 == 0)
|
||||
{
|
||||
r1 = 1;
|
||||
}
|
||||
}
|
||||
|
||||
interrupt_flag = DisableInterrupts();
|
||||
gUnknown_202D68A = SongIndex;
|
||||
gUnknown_202D694 = 1;
|
||||
|
||||
if(gUnknown_202D690 == 0)
|
||||
{
|
||||
gUnknown_202D688 = 1;
|
||||
m4aSongNumStart(SongIndex);
|
||||
m4aMPlayImmInit(&gUnknown_20008F0);
|
||||
m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0);
|
||||
m4aSongNumStop(SongIndex);
|
||||
m4aMPlayFadeIn(&gUnknown_20008F0, r1);
|
||||
}
|
||||
if(interrupt_flag)
|
||||
EnableInterrupts();
|
||||
#else
|
||||
asm_unified("\tpush {r4-r7,lr}\n"
|
||||
"\tlsls r0, 16\n"
|
||||
"\tlsrs r6, r0, 16\n"
|
||||
"\tlsls r4, r1, 16\n"
|
||||
"\tlsrs r5, r4, 16\n"
|
||||
"\tadds r0, r6, 0\n"
|
||||
"\tbl IsBGSong\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0800BF2E\n"
|
||||
"\tldr r0, _0800BECC\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tbeq _0800BF2E\n"
|
||||
"\tldr r0, _0800BED0\n"
|
||||
"\tldrh r0, [r0]\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tbne _0800BEBE\n"
|
||||
"\tldr r0, _0800BED4\n"
|
||||
"\tldrh r0, [r0]\n"
|
||||
"\tsubs r0, 0x1\n"
|
||||
"\tlsls r0, 16\n"
|
||||
"\tlsrs r0, 16\n"
|
||||
"\tcmp r0, 0x1\n"
|
||||
"\tbls _0800BF2E\n"
|
||||
"_0800BEBE:\n"
|
||||
"\tmovs r0, 0x80\n"
|
||||
"\tlsls r0, 1\n"
|
||||
"\tcmp r5, r0\n"
|
||||
"\tbls _0800BED8\n"
|
||||
"\tmovs r5, 0x10\n"
|
||||
"\tb _0800BEE0\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0800BECC: .4byte 0x000003e7\n"
|
||||
"_0800BED0: .4byte gUnknown_202D68A\n"
|
||||
"_0800BED4: .4byte gUnknown_202D688\n"
|
||||
"_0800BED8:\n"
|
||||
"\tlsrs r5, r4, 20\n"
|
||||
"\tcmp r5, 0\n"
|
||||
"\tbne _0800BEE0\n"
|
||||
"\tmovs r5, 0x1\n"
|
||||
"_0800BEE0:\n"
|
||||
"\tbl DisableInterrupts\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tlsrs r7, r0, 24\n"
|
||||
"\tldr r0, _0800BF34\n"
|
||||
"\tstrh r6, [r0]\n"
|
||||
"\tldr r1, _0800BF38\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, _0800BF3C\n"
|
||||
"\tldrh r0, [r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0800BF26\n"
|
||||
"\tldr r0, _0800BF40\n"
|
||||
"\tmovs r1, 0x1\n"
|
||||
"\tstrh r1, [r0]\n"
|
||||
"\tadds r0, r6, 0\n"
|
||||
"\tbl m4aSongNumStart\n"
|
||||
"\tldr r4, _0800BF44\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tbl m4aMPlayImmInit\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tmovs r1, 0xFF\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tbl m4aMPlayVolumeControl\n"
|
||||
"\tadds r0, r6, 0\n"
|
||||
"\tbl m4aSongNumStop\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tadds r1, r5, 0\n"
|
||||
"\tbl m4aMPlayFadeIn\n"
|
||||
"_0800BF26:\n"
|
||||
"\tcmp r7, 0\n"
|
||||
"\tbeq _0800BF2E\n"
|
||||
"\tbl EnableInterrupts\n"
|
||||
"_0800BF2E:\n"
|
||||
"\tpop {r4-r7}\n"
|
||||
"\tpop {r0}\n"
|
||||
"\tbx r0\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0800BF34: .4byte gUnknown_202D68A\n"
|
||||
"_0800BF38: .4byte gUnknown_202D694\n"
|
||||
"_0800BF3C: .4byte gUnknown_202D690\n"
|
||||
"_0800BF40: .4byte gUnknown_202D688\n"
|
||||
"_0800BF44: .4byte gUnknown_20008F0");
|
||||
#endif
|
||||
}
|
||||
|
||||
void sub_800BF48(u16 SongIndex)
|
||||
{
|
||||
u16 preload = gUnknown_202D68A;
|
||||
if(preload == 0x3e7)
|
||||
{
|
||||
sub_800BDFC(SongIndex);
|
||||
gUnknown_202D68C = preload;
|
||||
return;
|
||||
}
|
||||
gUnknown_202D68C = SongIndex;
|
||||
}
|
||||
|
||||
void sub_800BF80(void)
|
||||
{
|
||||
bool8 interrupt_flag = DisableInterrupts();
|
||||
if(gUnknown_202D690 == 0)
|
||||
{
|
||||
if(gUnknown_202D68A != 0x3e7)
|
||||
{
|
||||
m4aMPlayStop(&gUnknown_20008F0);
|
||||
}
|
||||
}
|
||||
gUnknown_202D68A = 0x3e7;
|
||||
gUnknown_202D68C = 0x3e7;
|
||||
if(interrupt_flag)
|
||||
EnableInterrupts();
|
||||
}
|
||||
Reference in New Issue
Block a user