summaryrefslogtreecommitdiff
path: root/src/music_pre.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/music_pre.c')
-rw-r--r--src/music_pre.c372
1 files changed, 356 insertions, 16 deletions
diff --git a/src/music_pre.c b/src/music_pre.c
index 42a8cb0..5c0589a 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -11,13 +11,17 @@ extern void SoundBiasSet();
extern void SetInterruptFlag(u16);
extern void nullsub_25();
extern void nullsub_18();
+extern void UpdateSound();
+extern void UpdateInput();
extern void sub_800C298(u16 r0);
typedef void (*IntrCallback)(void);
extern IntrCallback gUnknown_202D5F0[];
+extern struct MusicPlayerInfo gUnknown_20008F0; // BGM??
extern u32 gUnknown_203B0A0;
+extern u32 gUnknown_203B0A4;
extern u16 gBGMusicPlayerState;
extern u16 gCurrentBGSong;
extern u16 gUnknown_202D68C;
@@ -33,20 +37,19 @@ extern u8 gUnknown_203B09A;
struct unkStruct_3000FD8
{
u16 unk0;
- u16 unk2;
+ u16 songIndex;
u16 unk4;
u8 unk6;
- u8 padding;
};
extern struct unkStruct_3000FD8 gUnknown_3000FD8[8];
extern u8 gUnknown_202D7FE;
extern u16 gUnknown_202D7FC;
-extern struct BGControlStruct gUnknown_202D698;
-extern struct BGControlStruct gUnknown_202D6A0;
-extern struct BGControlStruct gUnknown_202D6A8;
-extern struct BGControlStruct gUnknown_202D6B0;
+extern struct BGControlStruct gBG0Control;
+extern struct BGControlStruct gBG1Control;
+extern struct BGControlStruct gBG2Control;
+extern struct BGControlStruct gBG3Control;
void sub_800BF80(void);
void xxx_update_bg_sound_input(void);
@@ -219,18 +222,18 @@ void UpdateBGControlRegisters(void)
BG[3] = 3;
}
- REG_BG0HOFS = gUnknown_202D698.hofs;
- REG_BG0VOFS = gUnknown_202D698.vofs;
- REG_BG1HOFS = gUnknown_202D6A0.hofs;
- REG_BG1VOFS = gUnknown_202D6A0.vofs;
- REG_BG2HOFS = gUnknown_202D6A8.hofs;
- REG_BG2VOFS = gUnknown_202D6A8.vofs;
- REG_BG3HOFS = gUnknown_202D6B0.hofs;
- REG_BG3VOFS = gUnknown_202D6B0.vofs;
+ 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 = BG[0] | 0xB0 << 6;
REG_BG1CNT = BG[1] | 0xB4 << 6;
- if(gUnknown_202D6A8.unk2 == 0x80 << 8)
+ if(gBG2Control.unk2 == 0x80 << 8)
{
REG_BG2CNT = BG[2] | 0x2e08;
}
@@ -276,7 +279,7 @@ void sub_800BD08(void)
while(counter >= 0)
{
preload->unk0 = zero2;
- preload->unk2 = 0x3e5;
+ preload->songIndex = 0x3e5;
preload->unk4 = zero2;
preload->unk6 = zero;
counter--;
@@ -449,3 +452,340 @@ u16 GetCurrentBGSong(void)
{
return gCurrentBGSong;
}
+
+#ifdef NONMATCHING
+void sub_800C074(u16 SongIndex,u16 param_2)
+{
+ bool8 interrupt_flag;
+ u16 msVar;
+ struct unkStruct_3000FD8 *preload;
+
+ if (SongIndex == 0x3e5)
+ return;
+ if (0x100 < param_2)
+ param_2 = 0x100;
+
+ if (sub_800CACC(SongIndex))
+ {
+ msVar = sub_800CAE0(SongIndex);
+ if (msVar == 1) {
+ interrupt_flag = DisableInterrupts();
+ gUnknown_202D68E = SongIndex;
+ if(gUnknown_202D690 == 0)
+ {
+ if (gCurrentBGSong != 999)
+ {
+ if ((u16)(gBGMusicPlayerState - 1U) < 2)
+ {
+ gUnknown_202D690 = msVar;
+ gUnknown_202D692 = 16;
+ gUnknown_202D694 = 0;
+ m4aMPlayFadeOutTemporarily(&gUnknown_20008F0,1);
+ }
+ else
+ {
+ if (gBGMusicPlayerState == 3)
+ gUnknown_202D690 = 2;
+ else
+ {
+ gUnknown_202D690 = 3;
+ m4aMPlayStop(&gUnknown_20008F0);
+ m4aSongNumStart(gUnknown_202D68E);
+ }
+ }
+ }
+ }
+ else
+ {
+ if (1 < (u16)(gUnknown_202D690 - 1U))
+ {
+ m4aMPlayStop(&gUnknown_20008F0);
+ m4aSongNumStart(gUnknown_202D68E);
+ gUnknown_202D690 = 3;
+ }
+ }
+ switch(gCurrentBGSong)
+ {
+ case 26: // 0x1A
+ case 27: // 0x1B
+ case 28: // 0x1C
+ case 29: // 0x1D
+ case 30: // 0x1E
+ case 31: // 0x1F
+ case 34: // 0x22
+ case 35: // 0x23
+ case 37: // 0x25
+ case 38: // 0x26
+ case 117: // 0x75
+ case 118: // 0x76
+ case 119: // 0x77
+ case 122: // 0x7A
+ case 127: // 0x7F
+ gUnknown_202D694 = 1;
+ break;
+ default:
+ break;
+ }
+ if (interrupt_flag)
+ EnableInterrupts();
+ }
+ else
+ {
+ nullsub_20(SongIndex);
+ }
+ }
+ else
+ {
+ if (!sub_800CAAC(SongIndex))
+ return;
+ msVar = sub_800CAE0(SongIndex);
+ preload = &gUnknown_3000FD8[msVar]; // need to load this before comparison to match
+ if (msVar <= 1)
+ nullsub_20(SongIndex);
+ else
+ {
+ interrupt_flag = DisableInterrupts();
+ m4aSongNumStart(SongIndex);
+ preload->unk0 = 1;
+ preload->songIndex = SongIndex;
+ // TODO fix this comparison
+ // Generates eor/neg/lsr
+ preload->unk6 = param_2 != 0x100;
+ preload->unk4 = param_2;
+ if (interrupt_flag)
+ EnableInterrupts();
+ }
+ }
+}
+#else
+NAKED
+void sub_800C074(u16 SongIndex, u16 param_2)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r8\n"
+ "\tpush {r7}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tmov r8, r5\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r6, r1, 16\n"
+ "\tldr r0, _0800C0FC\n"
+ "\tcmp r5, r0\n"
+ "\tbne _0800C08C\n"
+ "\tb _0800C208\n"
+"_0800C08C:\n"
+ "\tmovs r7, 0x80\n"
+ "\tlsls r7, 1\n"
+ "\tcmp r6, r7\n"
+ "\tbls _0800C096\n"
+ "\tadds r6, r7, 0\n"
+"_0800C096:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_800CACC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0800C0A4\n"
+ "\tb _0800C1B0\n"
+"_0800C0A4:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_800CAE0\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r7, r0, 16\n"
+ "\tcmp r7, 0x1\n"
+ "\tbeq _0800C0B4\n"
+ "\tb _0800C1D0\n"
+"_0800C0B4:\n"
+ "\tbl DisableInterrupts\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r8, r0\n"
+ "\tldr r6, _0800C100\n"
+ "\tstrh r5, [r6]\n"
+ "\tldr r4, _0800C104\n"
+ "\tldrh r0, [r4]\n"
+ "\tadds r2, r0, 0\n"
+ "\tcmp r2, 0\n"
+ "\tbne _0800C144\n"
+ "\tldr r0, _0800C108\n"
+ "\tldrh r1, [r0]\n"
+ "\tldr r0, _0800C10C\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800C12C\n"
+ "\tldr r0, _0800C110\n"
+ "\tldrh r1, [r0]\n"
+ "\tsubs r0, r1, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x1\n"
+ "\tbhi _0800C120\n"
+ "\tstrh r7, [r4]\n"
+ "\tldr r1, _0800C114\n"
+ "\tmovs r0, 0x10\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r0, _0800C118\n"
+ "\tstrb r2, [r0]\n"
+ "\tldr r0, _0800C11C\n"
+ "\tmovs r1, 0x1\n"
+ "\tbl m4aMPlayFadeOutTemporarily\n"
+ "\tb _0800C15E\n"
+ "\t.align 2, 0\n"
+"_0800C0FC: .4byte 0x000003e5\n"
+"_0800C100: .4byte gUnknown_202D68E\n"
+"_0800C104: .4byte gUnknown_202D690\n"
+"_0800C108: .4byte gCurrentBGSong\n"
+"_0800C10C: .4byte 0x000003e7\n"
+"_0800C110: .4byte gBGMusicPlayerState\n"
+"_0800C114: .4byte gUnknown_202D692\n"
+"_0800C118: .4byte gUnknown_202D694\n"
+"_0800C11C: .4byte gUnknown_20008F0\n"
+"_0800C120:\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x3\n"
+ "\tbne _0800C12C\n"
+ "\tmovs r0, 0x2\n"
+ "\tb _0800C15C\n"
+"_0800C12C:\n"
+ "\tmovs r0, 0x3\n"
+ "\tstrh r0, [r4]\n"
+ "\tldr r0, _0800C140\n"
+ "\tbl m4aMPlayStop\n"
+ "\tldrh r0, [r6]\n"
+ "\tbl m4aSongNumStart\n"
+ "\tb _0800C15E\n"
+ "\t.align 2, 0\n"
+"_0800C140: .4byte gUnknown_20008F0\n"
+"_0800C144:\n"
+ "\tsubs r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x1\n"
+ "\tbls _0800C15E\n"
+ "\tldr r0, _0800C17C\n"
+ "\tbl m4aMPlayStop\n"
+ "\tldrh r0, [r6]\n"
+ "\tbl m4aSongNumStart\n"
+ "\tmovs r0, 0x3\n"
+"_0800C15C:\n"
+ "\tstrh r0, [r4]\n"
+"_0800C15E:\n"
+ "\tldr r0, _0800C180\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, 0x26\n"
+ "\tbgt _0800C184\n"
+ "\tcmp r0, 0x25\n"
+ "\tbge _0800C19A\n"
+ "\tcmp r0, 0x1A\n"
+ "\tblt _0800C1A0\n"
+ "\tcmp r0, 0x1F\n"
+ "\tble _0800C19A\n"
+ "\tcmp r0, 0x23\n"
+ "\tbgt _0800C1A0\n"
+ "\tcmp r0, 0x22\n"
+ "\tblt _0800C1A0\n"
+ "\tb _0800C19A\n"
+ "\t.align 2, 0\n"
+"_0800C17C: .4byte gUnknown_20008F0\n"
+"_0800C180: .4byte gCurrentBGSong\n"
+"_0800C184:\n"
+ "\tcmp r0, 0x7A\n"
+ "\tbeq _0800C19A\n"
+ "\tcmp r0, 0x7A\n"
+ "\tbgt _0800C196\n"
+ "\tcmp r0, 0x77\n"
+ "\tbgt _0800C1A0\n"
+ "\tcmp r0, 0x75\n"
+ "\tblt _0800C1A0\n"
+ "\tb _0800C19A\n"
+"_0800C196:\n"
+ "\tcmp r0, 0x7F\n"
+ "\tbne _0800C1A0\n"
+"_0800C19A:\n"
+ "\tldr r1, _0800C1AC\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrb r0, [r1]\n"
+"_0800C1A0:\n"
+ "\tmov r0, r8\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800C208\n"
+ "\tbl EnableInterrupts\n"
+ "\tb _0800C208\n"
+ "\t.align 2, 0\n"
+"_0800C1AC: .4byte gUnknown_202D694\n"
+"_0800C1B0:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_800CAAC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800C208\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_800CAE0\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tlsls r2, r0, 3\n"
+ "\tldr r1, _0800C1D8\n"
+ "\tadds r4, r2, r1\n"
+ "\tcmp r0, 0x1\n"
+ "\tbhi _0800C1DC\n"
+"_0800C1D0:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl nullsub_20\n"
+ "\tb _0800C208\n"
+ "\t.align 2, 0\n"
+"_0800C1D8: .4byte gUnknown_3000FD8\n"
+"_0800C1DC:\n"
+ "\tbl DisableInterrupts\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tmov r0, r8\n"
+ "\tbl m4aSongNumStart\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrh r0, [r4]\n"
+ "\tmov r0, r8\n"
+ "\tstrh r0, [r4, 0x2]\n"
+ "\tcmp r6, r7\n"
+ "\tbne _0800C1FA\n"
+ "\tmovs r0, 0\n"
+ "\tb _0800C1FC\n"
+"_0800C1FA:\n"
+ "\tmovs r0, 0x1\n"
+"_0800C1FC:\n"
+ "\tstrb r0, [r4, 0x6]\n"
+ "\tstrh r6, [r4, 0x4]\n"
+ "\tcmp r5, 0\n"
+ "\tbeq _0800C208\n"
+ "\tbl EnableInterrupts\n"
+"_0800C208:\n"
+ "\tpop {r3}\n"
+ "\tmov r8, r3\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif
+
+void sub_800C214(u16 songIndex, u16 volume)
+{
+ bool8 interrupt_flag;
+ u16 msVar;
+ struct MusicPlayerInfo *info;
+ struct unkStruct_3000FD8 *preload;
+
+ if (256 < volume) {
+ volume = 256;
+ }
+
+ if ((!sub_800CACC(songIndex)) && (sub_800CAAC(songIndex))) {
+ msVar = sub_800CAE0(songIndex);
+ info = gMPlayTable[msVar].info;
+ preload = &gUnknown_3000FD8[msVar];
+ if (msVar > 1) {
+ interrupt_flag = DisableInterrupts();
+ if (preload->songIndex == songIndex) {
+ m4aMPlayVolumeControl(info, 0xf, volume);
+ }
+ if (interrupt_flag)
+ EnableInterrupts();
+ }
+ }
+}