summaryrefslogtreecommitdiff
path: root/src/music_pre.c
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-10-22 10:01:07 -0700
committerGitHub <noreply@github.com>2021-10-22 10:01:07 -0700
commit3e5dd1d047bada52ab0dce2fe58b04e39bcaa1cc (patch)
tree0e40067d711c783ef97667f4a8256f38ab0d4b0a /src/music_pre.c
parent3f7ee3a806d965fae70fd98f2cd1af13a2e4cf0b (diff)
Death by 74 files (#65)
* death by 74 files * 20% reached * doc move stuff in pokemon * fix undef reference * doc more and plumb a few more constanst for num party members and num moves * that struct is def PokemonMove.. clean up all code with it
Diffstat (limited to 'src/music_pre.c')
-rw-r--r--src/music_pre.c320
1 files changed, 297 insertions, 23 deletions
diff --git a/src/music_pre.c b/src/music_pre.c
index 034fe93..cb983d3 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -3,6 +3,7 @@
#include "m4a.h"
#include "bg.h"
#include "music.h"
+#include "input.h"
extern bool8 EnableInterrupts(void);
extern bool8 DisableInterrupts(void);
@@ -12,9 +13,7 @@ extern void AckInterrupt(u16);
extern void nullsub_25();
extern void nullsub_18();
extern void UpdateSound();
-extern void UpdateInput();
-
-extern void sub_800C298(u16 r0);
+extern void nullsub_21(u16);
typedef void (*IntrCallback)(void);
extern IntrCallback gIntrCallbacks[];
@@ -59,6 +58,7 @@ struct unkStruct_3000FD8
};
extern struct unkStruct_3000FD8 gUnknown_3000FD8[8];
+extern struct unkStruct_3000FD8 gUnknown_3000FE8[4];
extern u8 gUnknown_202D7FE;
extern u16 gBldCnt;
@@ -396,8 +396,6 @@ void UpdateBGControlRegisters(void)
void InitMusic(void)
{
s32 counter;
- u16 zero;
- u16 zero2;
struct unkStruct_3000FD8 *preload;
@@ -416,20 +414,12 @@ void InitMusic(void)
gUnknown_202D692 = 0;
gUnknown_202D694 = 0;
- // Kinda hacky but makes things match
- preload = gUnknown_3000FD8;
- zero = 0;
- zero2 = 0;
- counter = 7;
-
- while(counter >= 0)
+ for(counter = 0, preload = &gUnknown_3000FD8[0]; counter < 8; counter++, preload++)
{
- preload->unk0 = zero2;
+ preload->unk0 = 0;
preload->songIndex = 0x3e5;
- preload->unk4 = zero2;
- preload->unk6 = zero;
- counter--;
- preload++;
+ preload->unk4 = 0;
+ preload->unk6 = 0;
}
nullsub_19();
}
@@ -455,7 +445,7 @@ void StartNewBGM(u16 songIndex)
if((u16)(gBGMusicPlayerState - 1) <= 1)
return;
}
- if(sub_800CAE0(songIndex))
+ if(GetMusicPlayerIndex(songIndex))
{
nullsub_20(songIndex);
return;
@@ -610,7 +600,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
if (sub_800CACC(SongIndex))
{
- msVar = sub_800CAE0(SongIndex);
+ msVar = GetMusicPlayerIndex(SongIndex);
if (msVar == 1) {
interrupt_flag = DisableInterrupts();
gUnknown_202D68E = SongIndex;
@@ -681,7 +671,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
{
if (!sub_800CAAC(SongIndex))
return;
- msVar = sub_800CAE0(SongIndex);
+ msVar = GetMusicPlayerIndex(SongIndex);
preload = &gUnknown_3000FD8[msVar]; // need to load this before comparison to match
if (msVar <= 1)
nullsub_20(SongIndex);
@@ -736,7 +726,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
"\tb _0800C1B0\n"
"_0800C0A4:\n"
"\tadds r0, r5, 0\n"
- "\tbl sub_800CAE0\n"
+ "\tbl GetMusicPlayerIndex\n"
"\tlsls r0, 16\n"
"\tlsrs r7, r0, 16\n"
"\tcmp r7, 0x1\n"
@@ -867,7 +857,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
"\tcmp r0, 0\n"
"\tbeq _0800C208\n"
"\tadds r0, r5, 0\n"
- "\tbl sub_800CAE0\n"
+ "\tbl GetMusicPlayerIndex\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tlsls r2, r0, 3\n"
@@ -924,7 +914,7 @@ void sub_800C214(u16 songIndex, u16 volume)
}
if ((!sub_800CACC(songIndex)) && (sub_800CAAC(songIndex))) {
- msVar = sub_800CAE0(songIndex);
+ msVar = GetMusicPlayerIndex(songIndex);
info = gMPlayTable[msVar].info;
preload = &gUnknown_3000FD8[msVar];
if (msVar > 1) {
@@ -937,3 +927,287 @@ void sub_800C214(u16 songIndex, u16 volume)
}
}
}
+
+void sub_800C298(u16 songIndex)
+{
+ // Each section needs a var for interrupts..
+ char cVar1;
+ char cVar2;
+ char cVar3;
+ char cVar4;
+
+ u32 uVar2;
+ int iVar4;
+ struct MusicPlayerInfo *puVar6;
+ struct unkStruct_3000FD8 *preload;
+ struct unkStruct_3000FD8 *puVar3;
+
+ if (songIndex == 0x3e5) {
+ cVar1 = DisableInterrupts();
+
+ for(iVar4 = 2, puVar3 = &gUnknown_3000FE8[0]; iVar4 < 7; iVar4++, puVar3++)
+ {
+ m4aMPlayStop(gMPlayTable[iVar4].info);
+ puVar3->unk0 = 0;
+ puVar3->songIndex = 0x3e5;
+ puVar3->unk4 = 0;
+ puVar3->unk6 = 0;
+ }
+ if (cVar1 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ else if (sub_800CAAC(songIndex) != '\0')
+ {
+ uVar2 = GetMusicPlayerIndex(songIndex);
+ puVar6 = gMPlayTable[uVar2].info;
+ preload = &gUnknown_3000FD8[uVar2];
+ if (uVar2 < 2) {
+ nullsub_21(songIndex);
+ }
+ else {
+ cVar2 = DisableInterrupts();
+ if (preload->songIndex == songIndex) {
+ m4aMPlayStop(puVar6);
+ preload->unk0 = 0;
+ preload->songIndex = 0x3e5;
+ preload->unk4 = 0;
+ preload->unk6 = 0;
+ }
+ if (cVar2 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ }
+ else if (songIndex == 0x3e6)
+ {
+ cVar3 = DisableInterrupts();
+ if (gUnknown_202D690 != 0) {
+ if (gUnknown_202D68E != 0x3e5) {
+ gUnknown_202D68E = 0x3e5;
+ m4aMPlayStop(&gUnknown_2000970);
+ }
+ }
+ if (cVar3 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ else if (sub_800CACC(songIndex) != '\0')
+ {
+ cVar4 = DisableInterrupts();
+ if (gUnknown_202D690 != 0) {
+ if (gUnknown_202D68E == songIndex) {
+ gUnknown_202D68E = 0x3e5;
+ m4aMPlayStop(&gUnknown_2000970);
+ }
+ }
+ if (cVar4 != '\0') {
+ EnableInterrupts();
+ }
+ }
+}
+
+void sub_800C3F8(u16 songIndex, u16 speed)
+{
+ char cVar1;
+ char cVar2;
+ char cVar3;
+ char cVar4;
+ u32 comparison;
+ s32 uVar6;
+ u32 uVar8;
+ struct unkStruct_3000FD8 *preload;
+ struct unkStruct_3000FD8 *puVar3;
+ struct MusicPlayerInfo *puVar5;
+
+ comparison = 0x80 << 17; // 16777216
+ if((speed * 65536) > comparison)
+ {
+ speed = 16;
+ }
+ else
+ {
+ if((speed >>= 4) == 0)
+ {
+ speed = 1;
+ }
+ }
+
+ if (songIndex == 0x3e5) {
+ cVar1 = DisableInterrupts();
+
+ for(uVar6 = 2, puVar3 = &gUnknown_3000FE8[0]; uVar6 < 7; uVar6++, puVar3++)
+ {
+ if (puVar3->songIndex != 0x3e5) {
+ if (sub_800CAF0(uVar6) != '\0') {
+ m4aMPlayFadeOut(gMPlayTable[uVar6].info,speed);
+ }
+ else {
+ m4aMPlayStop(gMPlayTable[uVar6].info);
+ puVar3->unk0 = 0;
+ puVar3->songIndex = 0x3e5;
+ puVar3->unk4 = 0;
+ puVar3->unk6 = 0;
+ }
+ }
+ }
+ if (cVar1 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ else {
+ if (sub_800CAAC(songIndex) != '\0') {
+ uVar8 = GetMusicPlayerIndex(songIndex);
+ preload = &gUnknown_3000FD8[uVar8];
+ puVar5 = gMPlayTable[uVar8].info;
+ cVar2 = DisableInterrupts();
+ if (preload->songIndex != 0x3e5) {
+ if (sub_800CAF0(uVar8) != '\0') {
+ m4aMPlayFadeOut(puVar5,speed);
+ }
+ else {
+ m4aMPlayStop(puVar5);
+ preload->unk0 = 0;
+ preload->songIndex = 0x3e5;
+ preload->unk4 = 0;
+ preload->unk6 = 0;
+ }
+ }
+ if (cVar2 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ else
+ {
+ if (songIndex == 0x3e6) {
+ cVar3 = DisableInterrupts();
+ if ((gUnknown_202D690 != 0) && (gUnknown_202D68E != 0x3e5)) {
+ if (sub_800CAF0(1) != '\0') {
+ m4aMPlayFadeOut(&gUnknown_2000970,speed);
+ }
+ else {
+ m4aMPlayStop(&gUnknown_2000970);
+ gUnknown_202D68E = 0x3e5;
+ }
+ }
+ if (cVar3 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ else {
+ if (sub_800CACC(songIndex) != '\0') {
+ cVar4 = DisableInterrupts();
+ if ((gUnknown_202D690 != 0) && (gUnknown_202D68E == songIndex)) {
+ if (sub_800CAF0(1) != '\0') {
+ m4aMPlayFadeOut(&gUnknown_2000970,speed);
+ }
+ else {
+ m4aMPlayStop(&gUnknown_2000970);
+ gUnknown_202D68E = 0x3e5;
+ }
+ }
+ if (cVar4 != '\0') {
+ EnableInterrupts();
+ }
+ }
+ }
+ }
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_800C5D0(u16 param_1)
+{
+ u32 uVar3;
+ struct unkStruct_3000FD8 *preload;
+
+
+ if (sub_800CACC(param_1) != '\0') {
+ if ((gUnknown_202D690 != 0) && (gUnknown_202D68E == param_1)) {
+ return 1;
+ }
+ }
+ else
+ {
+ // NOTE: regswap of r5 for r4 here... but is functionally matching
+ if (sub_800CAAC(param_1) != '\0') {
+ uVar3 = GetMusicPlayerIndex(param_1);
+ preload = &gUnknown_3000FD8[uVar3];
+ if ((1 < uVar3) && (preload->songIndex == param_1)) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+#else
+NAKED
+u8 sub_800C5D0(u16 param_1)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tadds r5, r4, 0\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_800CACC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800C600\n"
+ "\tldr r0, _0800C5F8\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800C630\n"
+ "\tldr r0, _0800C5FC\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, r4\n"
+ "\tbne _0800C630\n"
+ "\tmovs r0, 0x1\n"
+ "\tb _0800C632\n"
+ "\t.align 2, 0\n"
+"_0800C5F8: .4byte gUnknown_202D690\n"
+"_0800C5FC: .4byte gUnknown_202D68E\n"
+"_0800C600:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_800CAAC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800C630\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl GetMusicPlayerIndex\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tlsls r2, r0, 3\n"
+ "\tldr r1, _0800C62C\n"
+ "\tadds r2, r1\n"
+ "\tcmp r0, 0x1\n"
+ "\tbls _0800C630\n"
+ "\tldrh r0, [r2, 0x2]\n"
+ "\tcmp r0, r5\n"
+ "\tbne _0800C630\n"
+ "\tmovs r0, 0x1\n"
+ "\tb _0800C632\n"
+ "\t.align 2, 0\n"
+"_0800C62C: .4byte gUnknown_3000FD8\n"
+"_0800C630:\n"
+ "\tmovs r0, 0\n"
+"_0800C632:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+}
+#endif
+
+void SoundVSync(void)
+{
+ u8 cVar1;
+
+ cVar1 = DisableInterrupts();
+ m4aSoundVSync();
+ if(cVar1)
+ EnableInterrupts();
+}
+
+
+void nullsub_18(void)
+{
+}